Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android应用程序中重新映射坐标系_Android_Android Sensors_Coordinate Transformation_Sensormanager - Fatal编程技术网

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

在Android应用程序中重新映射坐标系,android,android-sensors,coordinate-transformation,sensormanager,Android,Android Sensors,Coordinate Transformation,Sensormanager,我正在实现一个简单的Android应用程序,其中我需要识别北方 因此,我实现了SensorEventListener,并使用了如下内容: @Override public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { SensorManager.getRotationMatrixFromVector(mRot

我正在实现一个简单的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);
似乎不起作用,因为在这两种情况下(有或没有此代码行),偏航(方位角)的值取决于手机头部的方向(让手机放在背面)

使用我的重新映射,我所期望的是偏航会根据手机背面(后摄像头)的方向发生变化

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

我使用了以下方法:

/* Compensate device orientation */
            float[] remappedRotationMatrix = new float[9];
            switch (getWindowManager().getDefaultDisplay()
                    .getRotation()) {
            case Surface.ROTATION_0:
                SensorManager.remapCoordinateSystem(rotationMatrix,
                        SensorManager.AXIS_X, SensorManager.AXIS_Y,
                        remappedRotationMatrix);
                break;
            case Surface.ROTATION_90:
                SensorManager.remapCoordinateSystem(rotationMatrix,
                        SensorManager.AXIS_Y,
                        SensorManager.AXIS_MINUS_X,
                        remappedRotationMatrix);
                break;
            case Surface.ROTATION_180:
                SensorManager.remapCoordinateSystem(rotationMatrix,
                        SensorManager.AXIS_MINUS_X,
                        SensorManager.AXIS_MINUS_Y,
                        remappedRotationMatrix);
                break;
            case Surface.ROTATION_270:
                SensorManager.remapCoordinateSystem(rotationMatrix,
                        SensorManager.AXIS_MINUS_Y,
                        SensorManager.AXIS_X, remappedRotationMatrix);
                break;
            }

            /* Calculate Orientation */
            float results[] = new float[3];
            SensorManager.getOrientation(remappedRotationMatrix,
                    results);

请告诉我它是否有效,因为我对该解决方案仍有问题。这是我自己的代码。我写这封信的依据是。

不确定你是否解决了这个问题,但你的行:

SensorManager.remapc协调系统(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);
假设您的轴重新映射是您实际想要/正确的,但这是另一个问题

我应该注意到,虽然最优秀,但并没有明确提到在每次计算旋转矩阵时都必须调用重新映射坐标系,而不仅仅是在显示发生变化时(例如,onCreate、onSurfaceChanged等),这可能对某些人来说是明显的,但对其他人来说不是