终于我们找到了!
After 安卓文档 http://developer.android.com/reference/android/hardware/SensorManager.html#getRotationMatrix%28float%5B%5D,%20float%5B%5D,%20float%5B%5D,%20float%5B%5D%29我们可以得到旋转矩阵(getRotationMatrix)来改变移动设备的坐标系:旋转矩阵R将一个向量从设备坐标系变换到世界坐标系。
但在参数文档中说(这是测验):
重力 - 是包含重力矢量的 3 个浮点数的数组
以设备的坐标表示。您可以简单地使用这些值
由 TYPE_ACCELEROMETER 类型的传感器的 SensorEvent 返回。
那么,如果您使用文档中所说的加速度计值作为旋转矩阵的参数,当然加速度会受到影响,而移动平移和矩阵将毫无用处。
您必须使用重力传感器值(类型为 TYPE_GRAVITY 的传感器),而不是使用加速度计传感器值
由于该传感器不受移动设备平移的影响,因此可以在移动设备平移时使用旋转矩阵。
最后,适合我们的代码是:
float[] trueacceleration = new float[4];
float[] R = new float[16];
float[] RINV = new float[16];
SensorManager.getRotationMatrix(R, I, GRAVITY, geomagnetic);
Matrix.invertM(RINV, 0, R, 0);
Matrix.multiplyMV(trueAcceleration, 0, RINV, 0, linearAcceleration, 0);
Where
- 重力是来自 TYPE_GRAVITY 传感器的值的矢量,
- 地磁是一个向量,其值来自 TYPE_MAGNETIC_FIELD 传感器,并且
- LinearAcceleration 是一个向量,其值来自
TYPE_LINEAR_ACCELERATION 传感器
然后,在真正的加速度向量中,无论移动设备如何移动其方向,我们都会在移动平移中产生加速度。