Android旋转矢量和旋转矩阵

时间:2015-05-21 16:27:33

标签: android opengl-es linear-algebra android-sensors rotational-matrices

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

让我们想象平板电脑处于给定方向O1,因此方向矢量给我一个旋转矩阵OM1 我们现在想象一下,我锁定屏幕并移动平板电脑并将其旋转以便之后,就在解锁给定方向O2中的屏幕之前,方向向量(在锁定屏幕期间停止)将给出当屏幕返回旋转矩阵OM2时。

我希望我的虚拟多维数据集保持在屏幕锁定之前的位置,当我再次解锁时。

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

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

我猜我需要以某种方式计算一个差异矩阵,这将给我如何从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);
}

1 个答案:

答案 0 :(得分:0)

您错过了必须存储并转置错误矩阵的另一个矩阵。

除了mRotationLockOM1)之外,当屏幕解锁时,您应该存储与下面名为OM2的当前OM20T矩阵相反的内容。您可以使用转置来完成此操作。如果你有更多的代码,我会表明这一点。然后计算是:

rotationMatrix = OM1 * OM20T * OM2 

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