Android 从陀螺仪角度看矢量

Android 从陀螺仪角度看矢量,android,geometry,opengl-es-2.0,gyroscope,Android,Geometry,Opengl Es 2.0,Gyroscope,嗨,我正在用手机的陀螺仪旋转openGL相机。我能得到三个角X,Y,Z,但我找不到一种方法将它们转换成gluLookAt所需的方向向量。 相机的位置为0,0,0,旋转角度应与手机相同。gluLookAt需要三个矢量参数来计算正确的视图矩阵。在您的例子中,眼睛的位置为0,0,0,相机注视的中心位置,以及相机的“向上”方向的上方向向量 选择初始摄影机方向后,对于许多应用程序,中心将为0,0,1,向上方向为0,1,0。您需要按所需角度旋转这些向量。为此,可以将它们与旋转矩阵R=Rx*Rz*Ry相乘,其

嗨,我正在用手机的陀螺仪旋转openGL相机。我能得到三个角X,Y,Z,但我找不到一种方法将它们转换成gluLookAt所需的方向向量。
相机的位置为0,0,0,旋转角度应与手机相同。

gluLookAt需要三个矢量参数来计算正确的视图矩阵。在您的例子中,眼睛的位置为0,0,0,相机注视的中心位置,以及相机的“向上”方向的上方向向量

选择初始摄影机方向后,对于许多应用程序,中心将为0,0,1,向上方向为0,1,0。您需要按所需角度旋转这些向量。为此,可以将它们与旋转矩阵R=Rx*Rz*Ry相乘,其中Rx、z、y是沿给定轴按给定角度旋转的矩阵。如果您使用任何数学软件包,如glm、eigen或类似软件包,您可以轻松构建这些软件包。你甚至可以自己实现它们

请注意,如果眼睛位置不是0,0,0,则必须旋转方向向量,而不是中心向量。方向向量=中心-眼睛

所以,一点伪代码:

vec3 eye = .....
vec3 initCenter = .....
vec3 initDirection = initCenter - eye;
vec3 initUp = .....
mat3 rotation = rotate((1,0,0),xAngle) * rotate((0,1,0),yAngle) * rotate((0,0,1),zAngle);
gluLookAt(eye,eye + rotation*initDirection,rotation*initUp)

实现可能看起来有点不同,您可能必须使用vec4/mat4,例如glm生成尺寸为4x4的旋转矩阵。

我尝试了旋转矩阵,但绕轴旋转不是可交换的,当我将手机旋转90°时,可能会发生轴翻转,在这种情况下,最好使用四元数。好的,谢谢你:你能给我介绍一个关于四元数的教程吗。还有一个使用它们的库也很好,我正在编写一个android应用程序。它甚至有一个关于gluLookAt的部分