android - 来自 android 传感器的 -Z 轴的偏航俯仰滚动

标签 android math coordinates android-sensors coordinate-transformation

我们从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/

相关文章:

android - android config.xml 的 Cordova 修剪错误

math - 如何乘/除/加/减不同类型的数字?

java - 读取 num 并打印从 1 到 num 的程序

java - 找不到以下类: - ImageButton (Change to android. widget.ImageButton,修复构建路径,编辑XML)

java - Android - 加载库失败

javascript - javascript 中去掉并忽略小数

opengl - OpenGL坐标系是左手坐标系还是右手坐标系?

r - 计算 R 中点之间的距离

mysql - 从 MySQL 中东北和西南坐标的边界框内的数据库中获取所有点

java - 如何从 "assets"目录读取文本文件作为字符串?