在android中计算给定方位、俯仰和滚动的相对方向?

在android中计算给定方位、俯仰和滚动的相对方向?,android,math,orientation,Android,Math,Orientation,当我在android应用程序中收听方向事件时,我会得到一个SensorEvent,它包含3个浮动-相对于真实世界的轴的方位、俯仰和滚动 现在,假设我正在构建一个类似迷宫的应用程序,但我不想强迫用户在手机上方握住手机,使xy平面与地面平行。相反,我希望能够允许用户按自己的意愿握住手机,放下手机,或者坐下来,以一定角度握住手机。换句话说,我需要根据用户的喜好校准手机 我该怎么做 还请注意,我认为我的答案与getRotationMatrix和getOrientation有关,但我不确定如何回答 请帮忙

当我在android应用程序中收听方向事件时,我会得到一个SensorEvent,它包含3个浮动-相对于真实世界的轴的方位、俯仰和滚动

现在,假设我正在构建一个类似迷宫的应用程序,但我不想强迫用户在手机上方握住手机,使xy平面与地面平行。相反,我希望能够允许用户按自己的意愿握住手机,放下手机,或者坐下来,以一定角度握住手机。换句话说,我需要根据用户的喜好校准手机

我该怎么做

还请注意,我认为我的答案与
getRotationMatrix
getOrientation
有关,但我不确定如何回答


请帮忙!我已经在这个问题上纠缠了好几个小时。

我不知道有任何特定于android的API,但你所要做的就是将方位角减少一定量,对吗?所以你把“原点”从(0,0,0)移到他们想要的任何地方。在伪代码中:

myGetRotationMatrix:
    return getRotationMatrix() - origin

对于迷宫式应用程序,您可能更关心加速度(重力)矢量,而不是轴方向。在电话坐标系中,该矢量由三个加速度计测量值的组合而不是旋转角度给出。具体来说,只有xy读数会影响球的运动

如果确实需要方向,则3个角度读数表示3个欧拉角。但是,我怀疑您可能并不真正需要角度本身,而是旋转矩阵R,它由getRotationMatrix()API返回。一旦你有了这个矩阵,那么它基本上就是你正在寻找的校准。如果要将世界坐标中的向量转换为设备坐标,则应将其乘以该矩阵的逆(在这种特殊情况下,inv(R)=转置(R

因此,按照我在文档中找到的示例,如果要将世界重力矢量g([0 0 g])转换为设备坐标,请将其乘以inv(R):

g=inv(R)*g

(请注意,这将给出与读取加速度计相同的结果)


此处可能使用的API:invertM()multiplyMV()矩阵类的方法。

加速计和方向传感器之间到底有什么区别?为什么我需要加速计,而我关心的是手机的旋转?游戏需要对用户倾斜手机而不是加速做出反应。我相信你说的是对的,但是我不能理解!@Gallal-首先,即使是我也可能错(有时…;-)。现在,我假设您正在尝试实现一个迷宫式的游戏。在这个游戏中,控制球运动的是重力向量分量。当你将手机倾斜到某个方向(无需实际移动它-“加速”)时,设备坐标中的重力在x和y方向上有一些非零分量。这些部件由x和y加速度计测量。z运动受游戏板的限制。球就是不能在z方向上移动。我在使用getRotationMatrix(R,I,mGravity,MgGeoMagnetic)获得R和I的点上。当调用此方法并将R用作将来的参考(而不是倒置)时,手机将以所需位置的方式定位(即当用户单击“校准”时)。从这一点开始,我不断得到Sensor.type_磁场类型的SensorEvent。我该如何处理新事件@伊萨普,非常感谢你的帮助。就像我说的,我已经被困在这里好几天了;我不太擅长“空间”的批判性思维@Gallal-如果我理解你的问题,那么你想要完成的是“重置”设备的位置,作为进一步旋转的参考。因此,当用户单击“校准”时,您存储生成的R矩阵(称为Ri)。然后,您需要从游戏期间设备的进一步读数中“减去”该矩阵,该矩阵表示从世界坐标到初始设备方向的旋转。基本上,从当前方向(Rc)到初始方向(Ri)的旋转矩阵R是
R=inv(Ri)*Rc
。。。。在旋转矩阵数学中,旋转的“加法”是旋转矩阵的乘法。所以,“减法”就是和逆矩阵相乘。