当我在 Android 应用程序中收听方向事件时,我得到一个 SensorEvent,其中包含 3 个 float - 相对于真实世界轴的方位角、俯仰角和横滚角。
现在假设我正在构建一个类似 labyrinth 的应用程序,但我不想强制用户通过电话并握住电话,使 xy 平面与地面平行。相反,我希望能够让用户随心所欲地握住手机,躺下或者坐下并以一定角度握住手机。换句话说,我需要根据用户的喜好来校准手机。
我该怎么做?
另请注意,我认为我的答案与 getRotationMatrix
和 getOrientation
有关,但我不确定如何处理!
求助!我已经坚持了几个小时。
最佳答案
对于迷宫式应用程序,您可能更关心加速度(重力)矢量而不是轴方向。在 Phone 坐标系中,该矢量由三个加速度计测量值的组合给出,而不是旋转角度。具体来说,只有 x 和 y 读数会影响球的运动。
如果您确实需要方向,则 3 个角度读数代表 3 个欧拉角。但是,我怀疑您可能并不真正需要角度本身,而是需要旋转矩阵 R,它由 getRotationMatrix() API 返回。一旦你有了这个矩阵,它就基本上就是你正在寻找的校准。当您想将世界坐标中的向量转换为您的设备坐标时,您应该将它乘以该矩阵的逆(在这种特殊情况下,inv(R) = 转置(R)。
因此,按照我在文档中找到的示例,如果您想将世界重力矢量 g ([0 0 g]) 转换为设备坐标,请将其乘以 inv(R):
g = inv(R) * g
(请注意,这应该会为您提供与读取加速度计相同的结果)
此处可能使用的 API:矩阵类的 invertM() 和 multiplyMV() 方法。
关于android - 在 android 中计算给定方位角、俯仰角和横滚角的相对方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4340804/