What is the alternative to android orientation sensor?

后端 未结 1 499
栀梦
栀梦 2020-11-28 09:38

Hi I am building a 3D game for Android.

I am currently trying to add a sensor to my game that allows the player to tilt the android as its controls.

Ideally

相关标签:
1条回答
  • 2020-11-28 10:14

    There is no actual "orientation" sensor - this is (was) actually a composite sensor, generated from a combination of the accelerometer and the magnometer.

    From http://developer.android.com/reference/android/hardware/SensorEvent.html

    "This sensor type exists for legacy reasons, please use getRotationMatrix() in conjunction with remapCoordinateSystem() and getOrientation() to compute these values instead."

    public class OrientationTestActivity extends Activity implements SensorEventListener
    {
        private SensorManager mSensorManager;
        private Sensor mAccelerometer;
        private Sensor mMagnetometer;
    
        private float[] mLastAccelerometer = new float[3];
        private float[] mLastMagnetometer = new float[3];
        private boolean mLastAccelerometerSet = false;
        private boolean mLastMagnetometerSet = false;
    
        private float[] mR = new float[9];
        private float[] mOrientation = new float[3];
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
            mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
            mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        }
    
        protected void onResume() {
            super.onResume();
            mLastAccelerometerSet = false;
            mLastMagnetometerSet = false;
            mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
            mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        protected void onPause() {
            super.onPause();
            mSensorManager.unregisterListener(this);
        }
    
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    
        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor == mAccelerometer) {
                System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length);
                mLastAccelerometerSet = true;
            } else if (event.sensor == mMagnetometer) {
                System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length);
                mLastMagnetometerSet = true;
            }
            if (mLastAccelerometerSet && mLastMagnetometerSet) {
                SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer);
                SensorManager.getOrientation(mR, mOrientation);
                Log.i("OrientationTestActivity", String.format("Orientation: %f, %f, %f",
                                                               mOrientation[0], mOrientation[1], mOrientation[2]));
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题