在Android应用中重新映射坐标系

我正在实现一个简单的
Android应用程序,我需要在其中识别北方.

所以我实现了SensorEventListener,我使用了这样的东西:

@Override
public void onSensorChanged(SensorEvent event) {
    if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR)
    {
        SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values);
        SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, orientationVals);
        SensorManager.getOrientation(mRotationMatrix, orientationVals);

        orientationVals[0] = (float) Math.toDegrees(orientationVals[0]);
        orientationVals[1] = (float) Math.toDegrees(orientationVals[1]);
        orientationVals[2] = (float) Math.toDegrees(orientationVals[2]);

        tv.setText(" Yaw: "+ orientationVals[0] +"\n Pitch: "+ orientationVals[1]+"\n Roll: "+ orientationVals[2]);
    }

}

问题是代码行

SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, orientationVals);

似乎不起作用,因为在这两种情况下(有或没有此代码行),Yaw(方位角)的值取决于手机头部的方向(让它放在背面)

根据手机背面(后置摄像头)的方向,使用我的重新映射,我的预期是,Yaw发生了变化.

为什么我的重新映射不起作用?

最佳答案 不确定你是否解决了这个问题,但你的问题是:

SensorManager.remapCoordinateSystem(mRotationMatrix,SensorManager.AXIS_X,SensorManager.AXIS_Z,orientationVals);

重新映射mRotationMatrix中的值,并将结果放入orientationVals.这是正确的(除了重新映射的坐标数组的令人困惑的变量名称).

但是,然后通过调用后直接覆盖此重映射:

SensorManager.getOrientation(mRotationMatrix,orientationVals);

这将获取mRotationMatrix中的值,并根据这些(旧的,未重新映射的)值计算方向,并将其存储在orientationVals中.

因此,上面的代码只是获取mRotationMatrix的方向,其轴未重新映射,这可能解释了您的问题.

以下内容可能会解决您的问题:

float[] remapCoords = new float[16];
SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Z, remapCoords);
SensorManager.getOrientation(remapCoords, orientationVals);

假设您的轴重新映射是您实际想要/正确的,但这是另一个问题.

我应该注意到article cited虽然最优秀但没有明确提到每次计算旋转矩阵时都必须调用重映射坐标系,而不仅仅是当显示改变时(即onCreate,onSurfaceChanged等),这可能是对某些人来说很明显,但对其他人则不然

点赞