Jas*_*ell 5 android opengl-es rotation opengl-es-2.0
我正在使用OpenGL ES 2.0 for Android.我正在使用触摸屏翻译和旋转模型.我的翻译仅在(x,y)平面上,我的旋转仅在z轴附近.想象一下,直接向下看桌面上的地图并移动到地图上的各种坐标,并能够围绕您正在看的点旋转地图.
问题是,在旋转之后,我的后续翻译将更长时间与屏幕上指针的运动匹配,轴是不同的.
我尝试的一切都给了我两种行为中的一种,一种相当于:
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, Xposition, Yposition, 0.0f);
Matrix.rotateM(mModelMatrix, 0, rotationAngle, 0.0f, 0.0f, 1.0f);
Run Code Online (Sandbox Code Playgroud)
这允许我按预期进行平移(无论旋转如何,屏幕上/下移动模型上下移动,左/右移动模型左右).问题是旋转是围绕物体的中心,我需要旋转大约是我正在看的点,这与物体的中心不同.
我能得到的其他行为相当于:
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, rotationAngle, 0.0f, 0.0f, 1.0f);
Matrix.translateM(mModelMatrix, 0, Xposition, Yposition, 0.0f);
Run Code Online (Sandbox Code Playgroud)
这给了我想要的旋转,总是关于我正在看的点.问题是在轮换后,翻译是错误的.屏幕上的左/右沿着旋转的轴以不同的角度平移对象.
我需要一些方法来同时获得这两种行为.它需要围绕我正在看的点旋转,并沿着手指在屏幕上移动的方向平移.
这甚至可能吗?我是否基本上试图将量子力学与牛顿物理学相协调,注定要失败?
我不想列出我尝试过的所有技巧,因为我想以全新的视角考虑所有可能性.
编辑:我仍然完全坚持这一点.
我有一个从世界坐标中的(0,0,0)开始的对象.我的视图是俯视对象的z轴,我想限制平移到x/y平面.我还想仅围绕z轴旋转对象.旋转中心必须始终是屏幕的中心.
我正在用触摸屏控制平移,所以无论旋转方式如何,我都需要手指以相同的方式移动物体.
旋转后,我的所有翻译都会在旋转的坐标系上开始,这意味着对象不会随着指针在屏幕上移动.我试图按照休·费舍尔的建议进行第二次翻译,但我无法弄清楚如何计算第二次翻译.还有另外一种方法吗?
这是一篇旧帖子,但我发布了最适合我的后代的解决方案。
解决方案是保留一个单独的模型矩阵,用于累积发生的变换,并在 onDrawFrame() 方法中将每个变换乘以该矩阵。
//Initialize the model matrix for the current transformation
Matrix.setIdentityM(mModelMatrixCurrent, 0);
//Apply the current transformations
Matrix.translateM(mModelMatrixCurrent, 0, cameraX, cameraY, cameraZ);
Matrix.rotateM(mModelMatrixCurrent, 0, mAngle, 0.0f, 0.0f, 1.0f);
//Multiply the accumulated transformations by the current transformations
Matrix.multiplyMM(mTempMatrix, 0, mModelMatrixCurrent, 0, mModelMatrixAccumulated, 0);
System.arraycopy(mTempMatrix, 0, mModelMatrixAccumulated, 0, 16);
Run Code Online (Sandbox Code Playgroud)
然后使用累积的矩阵来定位对象。
| 归档时间: |
|
| 查看次数: |
2156 次 |
| 最近记录: |