我们从Android的SensorManager.getOrientation()获得的偏航俯仰和横滚全部用于手机的Y轴。我的意思是,偏航和俯仰表示Y轴指向的位置,而横摇是围绕Y轴的。 (并且我的屏幕方向固定为横向,所以Y轴不变)。但是我想要的是负Z轴(指向手机)的偏航角和横摇角,更像是如果我的手机屏幕是飞机座舱中的横向窗口,那么偏航角和横摇角是什么?
最佳答案
如果我理解您的意思,您会看到当前的偏航俯仰和侧倾正在返回,就像+ y轴是默认的“前”矢量,而+ z轴是默认的“上”矢量一样。您希望进行坐标变换,以便以-z轴作为默认的“前”矢量,以+ x矢量作为默认的“上”矢量来计算您的偏航,俯仰和横滚。
首先,您需要根据当前配置中的偏航,俯仰和横滚来计算当前的前向矢量和向上矢量。这可以使用3D旋转矩阵来完成:
http://en.wikipedia.org/wiki/Rotation_matrix#Rotations_in_three_dimensions
使用偏航角可绕z旋转,俯仰可绕x旋转,而可绕y旋转。将这些矩阵相乘,然后将前向量(0,1,0)和上向量(0,0,1)乘以结果即可得到新的前向量和上向量。
接下来,您需要计算新的偏航角,俯仰角和侧倾角。 Yaw是投影到yz平面上的前向量(将x值设置为0)与-z矢量(0、0,-1)之间的夹角,pitch是投影到xz平面上的前向量与-z之间的夹角。 z向量,roll是投影到xy平面上的向上向量与+ x向量(1、0、0)之间的夹角。如果我们让Fx =前向量的x分量,Fy是y分量,依此类推,我们得到:
yaw = acos ( -z dot (0, Fy, Fz) ) / sqrt(Fy*Fy + Fz*Fz)
pitch = acos ( -z dot (Fx, 0, Fz) ) / sqrt(Fx*Fx + Fz*Fz)
roll = acos ( +x dot (Ux, Uy, 0 ) ) / sqrt(Ux*Ux + Uy*Uy)
如果我选择了错误的向量,则应该可以对其他向量执行此操作。