Qual è l’alternativa per android sensore di orientamento?

Ciao sto costruendo un gioco in 3D per Android.

Attualmente sto cercando di aggiungere un sensore per il mio gioco che permette al giocatore di inclinazione android come controlli.

Idealmente vorrei utilizzare il sensore di ORIENTAMENTO, ma ho notato che è stato deprecato. Qualcuno sa come rilevare l’inclinazione dell’android e non utilizzare questo sensore?

 

One Reply
  1. 41

    Non c’è un vero “orientamento”, un sensore di questo è (era) un insieme di sensore, generato da una combinazione di accelerometro e il magnometer.

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

    “Questo tipo di sensore esiste per ragioni ereditarie, si prega di utilizzare getRotationMatrix() in collaborazione con remapCoordinateSystem() e getOrientation() per calcolare questi valori, invece.”

    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]));
            }
        }
    }
    • Esiste un modo per utilizzare il getOrientation() comando come un gestore di eventi come gli altri sensori sono utilizzati?
    • il getOrientation() la funzione richiede i valori da getRotationMatrix() – che prevede che i valori sia magnetico, accelerometro e sensori. Così si imposta il sensore ascoltatore per quei 2 sensori e cache i valori si ottiene per loro. E poi si può ricalcolare l’orientamento quando si ottenere nuovi dati per entrambi i sensori.
    • È il loro codice di esempio per come questi metodi sono utilizzati insieme? Non sono stato in grado di trovare qualsiasi uso di questi metodi insieme.
    • Esempio di codice aggiunto per la vostra copypaste piacere 😉
    • Questi sono ottimi consigli e ho provato qualcosa di simile. Il fatto è che i valori che ho avuto sono state, cercando, come gli angoli, ma è saltato tutto e sono un po ‘ incoerente. Mi chiedevo se avete mai provato niente del genere quando hai usato questo sensore?
    • L’accelerometro e magnetometro sensori tendono ad essere piuttosto rumoroso. Si può provare con un medio di esecuzione per aiutare appianare.
    • Per lisciare i valori io uso un medio di esecuzione: runningValue = runningValue*(1-epsilon) +rawValue*epsilon; per epsilon<1.0

Lascia un commento