LWJGL Forum

Programming => OpenGL => Topic started by: CyanPrime on May 23, 2011, 04:26:16

Title: How to get Yaw, Pitch, and Roll from a Matrix?
Post by: CyanPrime on May 23, 2011, 04:26:16
Is this correct? If now can you post what would be?

float yaw = (float) -(Math.tan(m.m10/m.m00));
       float pitch = (float) -(Math.tan((-m.m20)/(Math.sqrt(Math.pow(m.m21, 2) + Math.pow(m.m22, 2)))));
       float roll = (float) -(Math.tan(m.m21/m.m22));


Full source

import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Matrix3f;
import org.lwjgl.util.vector.Vector3f;

public class Camera {
    //3d vector to store the camera's position in
   Vector3f position = null;
   Vector3f lookAt = null;
   //the rotation around the Y axis of the camera
   float yaw = 0;

   //the rotation around the X axis of the camera
   float pitch = 0;

   //the rotation around the Z axis of the camera
   float roll = 0;

   public Camera(float x, float y, float z)
   {
       //instantiate position Vector3f to the x y z params.
       position = new Vector3f(x, y, z);
       lookAt = new Vector3f();
   }

   public void lookThrough()
   {
       Matrix3f m = new Matrix3f();



       Vector3f out = new Vector3f();
       Vector3f.sub(position, lookAt, out);
       out.normalise();
       //set forward vector
       m.m00 = out.x;
       m.m01 = out.y;
       m.m02 = out.z;

       //set right vector
       m.m10 = 1;
       m.m11 = 0;
       m.m12 = 0;

       //set up vector
       m.m20 = 0;
       m.m21 = 1;
       m.m22 = 0;

       yaw = (float) -(Math.tan(m.m10/m.m00));
       pitch = (float) -(Math.tan((-m.m20)/(Math.sqrt(Math.pow(m.m21, 2) + Math.pow(m.m22, 2)))));
       roll = (float) -(Math.tan(m.m21/m.m22));

       //roatate the pitch around the X axis
       GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f);
       //roatate the yaw around the Y axis
       GL11.glRotatef(yaw, 0.0f, 1.0f, 0.0f);
       //roatate the yaw around the Y axis
       GL11.glRotatef(roll, 0.0f, 0.0f, 1.0f);
       //translate to the position vector's location
       GL11.glTranslatef(position.x, position.y, position.z);
   }
}