我正在使用OpenGL ES 2.0进行Android开发,通过触摸屏幕实现模型的平移和旋转。我的平移只在(x,y)平面内进行,旋转只围绕z轴进行。可以想象一下,就像俯视桌子上的地图,移动到地图上的各个坐标,并能够围绕您所看到的点旋转地图。
问题是,在旋转后,我的后续平移与屏幕指针的运动不再匹配,轴也不同了。
我尝试过的所有方法都会出现以下两种行为之一:
这使我得到了想要的旋转,总是围绕着我所看的点旋转。问题在于旋转后,翻译是错误的。屏幕上的左/右会以不同的角度将对象翻译,沿着旋转的轴线。
我需要一种同时获得这两个行为的方法。它需要围绕我所看的点旋转并且沿着手指在屏幕上移动的方向进行翻译。
这是否可能?我基本上是试图调和量子力学与牛顿物理学,注定要失败吗?
我不想列出我尝试过的所有技巧,因为我想用新的视角考虑所有可能性。
编辑: 我仍然完全卡住了。
我有一个在世界坐标系中从(0,0,0)开始的对象。我的视图正在沿着z轴朝向该对象,并且我希望将翻译限制在x/y平面内。我还想仅围绕z轴旋转对象。旋转的中心必须始终是屏幕的中心。
我正在使用触摸屏控制翻译,因此无论如何旋转,都需要将对象移动与手指相同的方式,而不管它旋转的方式如何。
一旦我旋转,那么所有的翻译都开始在旋转的坐标系上发生,这意味着对象不随屏幕上的指针移动。我尝试了像Hugh Fisher建议的第二个翻译,但我无法计算第二个翻译。还有其他方法吗?
问题是,在旋转后,我的后续平移与屏幕指针的运动不再匹配,轴也不同了。
我尝试过的所有方法都会出现以下两种行为之一:
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建议的第二个翻译,但我无法计算第二个翻译。还有其他方法吗?
(gl_Position = u_ProjMatrix * u_ViewMatrix * u_ModelMatrix * a_Position;
但是,在对象旋转后,我仍然无法正确地进行平移。它朝错误的方向平移。 - Jason Powell