我们从android的SensorManager.getOrientation()获取的yaw pitch和roll都是针对手机的Y轴。我的意思是,偏航和俯仰表示 Y 轴指向的位置,而滚动是关于 Y 轴的。 (我的屏幕方向固定为横向,所以 Y 轴不会改变)。但我想要的是负 Z 轴的偏航俯仰和滚动(指向手机),更像是如果我的手机屏幕是飞机驾驶舱中的风景窗口,那么偏航会是什么俯仰和滚转是什么?
最佳答案
如果我明白你在说什么,你会看到当前的偏航俯仰和滚动正在返回,就好像 +y 轴是默认的“前”向量,+z 轴是默认的“向上”向量。您想要进行坐标变换,以便使用 -z 轴作为默认的“前”向量和 +x 向量作为默认的“向上”向量来计算您的偏航、俯仰和滚动。
首先,您需要根据当前配置中的偏航、俯仰和滚转计算当前的前向和向上矢量。这可以使用 3D 旋转矩阵来完成: http://en.wikipedia.org/wiki/Rotation_matrix#Rotations_in_three_dimensions
使用偏航角绕 z 旋转,pitch 绕 x 旋转,roll 绕 y 旋转。将这些矩阵相乘,然后将前向量 (0, 1, 0) 和上向量 (0, 0, 1) 乘以结果,得到新的前向量和上向量。
接下来您需要计算新的偏航角、俯仰角和横滚角。 Yaw 是投影到 yz 平面(将 x 值设置为 0)的前向量与 -z 向量 (0, 0, -1) 之间的角度,pitch 是投影到 xz 平面的前向量与 - 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)
如果我选择了错误的载体,您应该能够对其他载体执行此操作。
关于android - 来自 android 传感器的 -Z 轴的偏航俯仰滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8981917/