Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dudas con las rotaciones

Iniciado por kokorico, 30 de Noviembre de 2009, 04:29:48 PM

« anterior - próximo »

kokorico

Hola a todos:

me estoy leyendo un tutorial de nehe sobre rotaciones. Esta aqui. Es un ariculo de camara basada en quaternions. El caso es que tengo dudas en la funcion setPerspective. Me explico: cuando lo resuelve con quaternions lo hace asi:
Código (cpp) [Seleccionar]

void glCamera::SetPrespective()
{
GLfloat Matrix[16];
glQuaternion q;

// Make the Quaternions that will represent our rotations
m_qPitch.CreateFromAxisAngle(1.0f, 0.0f, 0.0f, m_PitchDegrees);
m_qHeading.CreateFromAxisAngle(0.0f, 1.0f, 0.0f, m_HeadingDegrees);

// Combine the pitch and heading rotations and store the results in q
q = m_qPitch * m_qHeading;
q.CreateMatrix(Matrix);

// Let OpenGL set our new prespective on the world!
glMultMatrixf(Matrix);

// Create a matrix from the pitch Quaternion and get the j vector
// for our direction.
m_qPitch.CreateMatrix(Matrix);
m_DirectionVector.j = Matrix[9];

// Combine the heading and pitch rotations and make a matrix to get
// the i and j vectors for our direction.
q = m_qHeading * m_qPitch;
q.CreateMatrix(Matrix);
m_DirectionVector.i = Matrix[8];
m_DirectionVector.k = Matrix[10];

// Scale the direction by our speed.
m_DirectionVector *= m_ForwardVelocity;

// Increment our position by the vector
m_Position.x += m_DirectionVector.i;
m_Position.y += m_DirectionVector.j;
m_Position.z += m_DirectionVector.k;

// Translate to our new position.
glTranslatef(-m_Position.x, -m_Position.y, m_Position.z);
}

Aqui lo que no entiendo es por que primero multiplica qPitch x qHeading, despues lo sube a la pila de matrices, y despues vuelve a multiplicarlos pero al reves qHeading x qPitch para sacarles el vector de direccion. El escritor del articulo también lo hace con matrices:

Código (cpp) [Seleccionar]

void glCamera::SetPrespective()
{
GLfloat Matrix[16];

glRotatef(m_HeadingDegrees, 0.0f, 1.0f, 0.0f);
glRotatef(m_PitchDegrees, 1.0f, 0.0f, 0.0f);

glGetFloatv(GL_MODELVIEW_MATRIX, Matrix);

m_DirectionVector.i = Matrix[8];
m_DirectionVector.k = Matrix[10];

glLoadIdentity();

glRotatef(m_PitchDegrees, 1.0f, 0.0f, 0.0f);

glGetFloatv(GL_MODELVIEW_MATRIX, Matrix);
m_DirectionVector.j = Matrix[9];

glRotatef(m_HeadingDegrees, 0.0f, 1.0f, 0.0f);

// Scale the direction by our speed.
m_DirectionVector *= m_ForwardVelocity;

// Increment our position by the vector
m_Position.x += m_DirectionVector.i;
m_Position.y += m_DirectionVector.j;
m_Position.z += m_DirectionVector.k;

// Translate to our new position.
glTranslatef(-m_Position.x, -m_Position.y, m_Position.z);
}


Pero tampoco lo entiendo. Primero aplica las rotaciones, despues recupera la matriz modelview para recuperar un vector de direccion y despues cargar la identidad y volver a rotar y volver a recuperar la modelview y recuperar la direccion de j. Por que necesita hacer esto? No seria mejor recuperar la matriz una sola vez? Por que lo hace dos veces? Por que primero rota por heading y por pitch y despues solo por pitch?

A ver si me podeis pasar algo de info para niños de dos años. Entiendo las rotaciones basicas pero no logro ver por que hace esto.

kraj0t

Hmmmm

Yo te podría pasar la respuesta para niños de 1 mes, pero al nivel de niños de 2 años no llegué xD

A esa edad me tuve que poner a trabajar para sacar adelante a mi familia.

* Sorry por el off-topic *
Muerte y destrucción a tú
¿A yo?
¡A tú!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.