trouver l'orientation à l'aide getRotationMatrix() et getOrientation()

Im essayant d'obtenir la direction du vecteur de pointage de la caméra, à l'égard de la direction du nord magnétique. J'ai l'impression que j'ai besoin d'utiliser les valeurs renvoyées par getOrientation(), mais je ne suis pas sûr de ce qu'ils représentent. Les valeurs que j'obtiens de getOrientation() ne changent pas de façon prévisible quand je change l'orientation du téléphone (rotation de 90 degrés ne modifiez pas les valeurs de 90 degrés). J'ai besoin de savoir ce que les valeurs retournées par getOrientation() signifie. Ce que j'ai jusqu'à présent est écrit ci-dessous:

package com.example.orientation;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.Toast;

public class Orientation extends Activity{

 private SensorManager mSM;
 private mSensorEventListener mSEL;

    float[] inR = new float[16];
    float[] outR= new float[16];
    float[] I = new float[16];
    float[] gravity = new float[3];
    float[] geomag = new float[3];
    float[] orientVals = new float[3];

    final float pi = (float) Math.PI;
    final float rad2deg = 180/pi;    

 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mSM = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSEL = new mSensorEventListener();  

        mSM.registerListener(mSEL, 
       mSM.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
       SensorManager.SENSOR_DELAY_NORMAL);

     mSM.registerListener(mSEL, 
       mSM.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
       SensorManager.SENSOR_DELAY_NORMAL);

 }



 private class mSensorEventListener implements SensorEventListener{

  @Override
  public void onAccuracyChanged(Sensor arg0, int arg1) {}

  @Override
  public void onSensorChanged(SensorEvent event) {

   //If the sensor data is unreliable return
   if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
    return;

   //Gets the value of the sensor that has been changed
   switch (event.sensor.getType()){  
   case Sensor.TYPE_ACCELEROMETER:
    gravity = event.values.clone();
    break;
   case Sensor.TYPE_MAGNETIC_FIELD:
    geomag = event.values.clone();
    break;
   }

   //If gravity and geomag have values then find rotation matrix
   if (gravity != null && geomag != null){

    //checks that the rotation matrix is found
    boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag);
    if (success){

     //Re-map coordinates so y-axis comes out of camera
     SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, 
       SensorManager.AXIS_Z, outR);

     //Finds the Azimuth and Pitch angles of the y-axis with 
     //magnetic north and the horizon respectively
     SensorManager.getOrientation(outR, orientVals);
     float azimuth = orientVals[0]*rad2deg;
     float pitch = orientVals[1]*rad2deg;
     float roll = orientVals[2]*rad2deg;

     //Displays a pop up message with the azimuth and inclination angles
     String endl = System.getProperty("line.separator");
     Toast.makeText(getBaseContext(), 
       "Rotation:" +
       outR[0] + " " + outR[1] + " " + outR[2] + endl +
       outR[4] + " " + outR[5] + " " + outR[6] + endl +
       outR[8] + " " + outR[9] + " " + outR[10] + endl +endl +
       "Azimuth: " + azimuth + " degrees" + endl + 
       "Pitch: " + pitch + " degrees" + endl +
       "Roll: " + roll + " degrees", 
       Toast.LENGTH_LONG).show();
    } /*else
     Toast.makeText(getBaseContext(), 
       "Get Rotation Matrix Failed", Toast.LENGTH_LONG).show();*/
   }   
  }

    }

}

J'ai regardé la documentation sur le sensorManager classe, mais il n'a pas aidé à résoudre ce problème. Si quelqu'un pouvait m'aider à en trouver le sens de ce que je voudrais vraiment l'apprécier. Je suis en essais sur un Nexus One sous Android 2.1

OriginalL'auteur pat | 2010-10-26