我注意到,当我将手机放在地平线以下时,我会得到> -90。当我开始倾斜手机使其指向天空时,它会反射-90,即-88,-90,-88。当它从地面倾斜到天空时。

有谁之前经历过这个吗。 (它似乎与remapCoordinateSystem无关)。 (我之前已将其注释掉)。当电话摄像头对准地面时,俯仰读数为零。当其指向天花板时,其也为零。

谢谢你的帮助。

    @Override
    public void onSensorChanged(SensorEvent event) {
        synchronized (MainActivity.this) { // TilteController
            switch (event.sensor.getType()) {
            case Sensor.TYPE_MAGNETIC_FIELD:
                mMagneticValues = event.values.clone();
                break;
            case Sensor.TYPE_ACCELEROMETER:
                mAccelerometerValues = event.values.clone();
                break;
            }

            if (mMagneticValues != null && mAccelerometerValues != null) {
                SensorManager.getRotationMatrix(R, null, mAccelerometerValues, mMagneticValues);

                Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
                int rotation = display.getRotation();

                switch (rotation)
                {
                case Configuration.ORIENTATION_LANDSCAPE:
                    SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_MINUS_Y, SensorManager.AXIS_MINUS_X, R);//shouldnt be the same R in and out
                case Configuration.ORIENTATION_PORTRAIT:
                    SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_Y, SensorManager.AXIS_X, R);//shouldnt be the same R in and out
                }


                float[] orientation = new float[3];
                SensorManager.getOrientation(R, orientation);

                mAzimuth = orientation[0];
                mPitch = orientation[1];
                mRoll = orientation[2];

                dirText.setText("Azimuth, Pitch, Roll || " + radStr(mAzimuth) +", "+ radStr(mPitch) +", "+ radStr(mRoll));

                glView.rotate((float)Math.toDegrees(mAzimuth),(float)Math.toDegrees(mPitch),(float)Math.toDegrees(mRoll));
                //glView.azimuth=(float)Math.toDegrees(smooth(mAzimuth));
                glView.pitch=(float)(Math.toDegrees(smooth(mPitch)));//-90 makes it cenetr
                //glView.roll=(float)Math.toDegrees(smooth(-mRoll));
                //Log.i("Azimuth, Pitch, Roll", mAzimuth+", "+mPitch+", "+mRoll);
            }
        }
    }




我需要的一个临时解决方案是在调用“获取方向”之前旋转矩阵。

Matrix.rotateM(R, 0, 90, 0, 1, 0);


无论如何进行完整翻转,都会遇到相同的问题。 (这应该通过添加方位角来解决)但这不是一个出色的解决方案。

因此,如果其他人正在阅读此书并试图将地平线设为0度。与旋转显示相反,之前旋转矩阵(Im使用OpenGL)

最佳答案

最终将应用锁定在横向状态并应用以下内容

    SensorManager.getRotationMatrix(R, null, mAccelerometerValues, mMagneticValues);

    Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();

    SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Z, R);//shouldnt be the same R in and out

    float[] orientation = new float[3];
    SensorManager.getOrientation(R, orientation);

关于android - getOrientation()间距反射(reflect)了地平线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11957503/

10-13 06:05