Android旋转向量和旋转矩阵

Android Rotation Vector and Rotation Matrix

所以我之前问了一个关于我正在构建的应用程序使用哪种传感器的问题。经过一些研究,我现在知道这是我想要使用的旋转矢量,因为我希望能够根据设备的方向在平板电脑上移动虚拟立方体。

让我们假设平板电脑处于给定的方向 O1,因此方向向量为我提供了一个旋转矩阵 OM1 现在让我们想象一下,我锁定屏幕并移动平板电脑并旋转它,以便在给定方向 O2 解锁屏幕之前,方向矢量(在锁定屏幕期间停止)将在屏幕打开时给出回到旋转矩阵 OM2。

我希望我的虚拟立方体在我再次解锁时保持在屏幕锁定之前的位置。

当然,为此我已经在我的代码中设置了一个旋转矩阵,当系统暂停时(即当我锁定屏幕时)在内存中保存旋转矩阵。 这样当屏幕回来时立方体就在正确的位置。

但是,当我再次移动平板电脑(旋转)时,我希望立方体根据屏幕锁定前的方向矩阵 OM1 响应这些旋转,而不仅仅是基于在旋转矢量传感器的任何时刻。

我猜我需要以某种方式计算一个 differenceMatrix,它将告诉我如何从 OM1 转到 OM2。但即便如此,我还没有得到我想要的。

以下是我尝试过的几个操作:

if(hasLocked == true){
      Matrix.transposeM(transposed,0,mRotationLock,0); //mRotationLock is the rotation matrix that I save when the screen goes off
      Matrix.multiplyMM(mDifferenceRotation, 0, transposed, 0, mRotationMatrix, 0);
      System.arraycopy(mDifferenceRotation,0,mRotationMatrix,0,16);
}

您遗漏了另一个矩阵,您必须存储和转置错误的矩阵。

除了 mRotationLock (OM1) 之外,当屏幕解锁时,您应该存储当前 OM2 矩阵的相反矩阵,称为下面的 OM20T。你可以用转置来做到这一点。如果您有更多代码,我会显示该位。那么计算就是:

rotationMatrix = OM1 * OM20T * OM2 

换句话说,我们用 OM2 旋转以应用当前矢量,然后 OM20T 撤消我们在 after 中面对的第一个方向矢量屏幕上。然后 OM1 应用旋转,因为它是 屏幕关闭之前。 OM1 * OM20T 可以在屏幕上计算一次。