title: extract yaw, pitch, and roll from a rotationMatrix
body: <p>I have a sensor manager that returns a <code>rotationMatrix</code> based on the devices Magnetometer and Accelerometer.  I have been trying to also calculate the yaw pitch and roll of the user's device but am finding that pitch and roll interfere with each other and give inaccurate results.  Is there a way to extract YAW PITCH and ROLL of a device from the <code>rotationMatrix</code>?</p>
  
  <p><strong>EDIT</strong>
  Trying to interpret blender's answer below, which i am thankful for but not quite there yet, i am trying to get the angle from a rotaion matrix like this:</p>
  
  <pre><code>       float R[] = phoneOri.getMatrix();
         double rmYaw = Math.atan2(R[4], R[0]);
         double rmPitch = Math.acos(-R[8]);
         double rmRoll = Math.atan2(R[9], R[10]);
  </code></pre>
  
  <p>i don't know if i am referencing the wrong parts of the matrix or not but i am not getting the results i would think.</p>
  
  <p>i was hoping to get values in degrees, but am getting weird integers.</p>
  
  <p>my matrix is coming from my <code>sensorManager</code> which looks like this:</p>
  
  <pre><code>public void onSensorChanged(SensorEvent evt) {
              int type=evt.sensor.getType();
              if(type == Sensor.TYPE_ORIENTATION){
                  yaw = evt.values[0];
                  pitch = evt.values[1];
                  roll = evt.values[2];
              }
              if (type == Sensor.TYPE_MAGNETIC_FIELD) {
                  orientation[0]=(orientation[0]*1+evt.values[0])*0.5f;
                  orientation[1]=(orientation[1]*1+evt.values[1])*0.5f;
                  orientation[2]=(orientation[2]*1+evt.values[2])*0.5f;
              } else if (type == Sensor.TYPE_ACCELEROMETER) {
                  acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f;
                  acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f;
                  acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f;
              }
              if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) {
                  float newMat[]=new float[16];
  
                  SensorManager.getRotationMatrix(newMat, null, acceleration, orientation);
                  if(displayOri==0||displayOri==2){
                      SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat);
                  }else{
                      SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat);
                  }
  
                  matrix=newMat;
  </code></pre>
  
  <p><strong>sample matrix when device is laying face up on table</strong></p>
  
  <pre><code>0.9916188,  -0.12448014, -0.03459576,  0.0
  0.12525482,  0.9918981,   0.021199778, 0.0
  0.031676512,-0.025355382, 0.9991765,   0.0
  0.0,         0.0,         0.0,         1
  </code></pre>
  
  <p><strong>ANSWER</strong>  </p>
  
  <pre><code>double rmPitch = Math.toDegrees( Math.acos(R[10]));
  </code></pre>