【发布时间】:2014-03-16 23:04:59
【问题描述】:
我正在使用适用于 Android 的 OpenGL ES 2.0。我正在使用触摸屏平移和旋转模型。我的平移仅在 (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);
这使我可以按预期进行翻译(屏幕上的上/下移动模型上下移动,左/右移动模型左右移动),而不管旋转。问题是旋转围绕对象的中心,我需要旋转围绕我正在查看的点,这与对象的中心不同。
我能得到的其他行为相当于:
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.rotateM(mModelMatrix, 0, rotationAngle, 0.0f, 0.0f, 1.0f);
Matrix.translateM(mModelMatrix, 0, Xposition, Yposition, 0.0f);
这给了我我想要的旋转,总是关于我正在看的点。问题是在旋转之后,翻译是错误的。屏幕上的左/右沿旋转轴以不同的角度平移对象。
我需要一些方法来同时获得这两种行为。它需要围绕我正在查看的点旋转,并在手指在屏幕上移动的方向上平移。
这甚至可能吗?我基本上是在试图调和量子力学与牛顿物理学,并注定要失败吗?
我不想列出我尝试过的所有技巧,因为我想以全新的视角考虑所有可能性。
编辑: 我仍然完全坚持这一点。
我有一个在世界坐标中从 (0, 0, 0) 开始的对象。我的视图是在对象的 z 轴上向下看,我想限制平移到 x/y 平面。我还想仅围绕 z 轴旋转对象。旋转的中心必须始终是屏幕的中心。
我通过触摸屏控制平移,因此我需要对象以与手指相同的方式移动,无论它如何旋转。
只要我旋转,我的所有平移都开始在旋转的坐标系上发生,这意味着对象不会随着屏幕上的指针移动。我尝试按照 Hugh Fisher 的建议进行第二次翻译,但我不知道如何计算第二次翻译。还有其他方法吗?
【问题讨论】:
标签: android opengl-es rotation opengl-es-2.0