Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Emotion en 01 de Enero de 1970, 01:00:00 AM

Título: quaternions (o como se diga en castellano :D)
Publicado por: Emotion en 01 de Enero de 1970, 01:00:00 AM
                                Me gustaria saber si alguien ha implementado quaternions para efectuar rotaciones y algunas cosas mas que dicen que son idoneas para los quaternions...


Pero como no es oro todo lo que reluce...

No he conseguido entender del todo la implementacion de los quaternions, ya que un cuerpo vectorial de dos componentes (en el caso de los quaternions) no veo con claridad como puedo convertirlo en una entidad vectorial de cuatro componentes (como seria un vector del tipo XYZW (el cual casaria muy bien con las instrucciones SIMD por lo del empaquetamiento)..

Alguien me puede echar una mano con esto?

Gracias y un saludo
                               
Título: quaternions (o como se diga en castellano :D)
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Hola Emotion.

Con respecto a lo de convertir un quaternion a un vector de 4 elementos...podría servirte pasar ese quaternion a un modelo axis-angle...con esto consigues un vector de 4 elementos (XYZ-Angulo) listo para ser utilizado por las funciones de OpenGL, glRotate? (si no me equivoco éstas utilizan la notación axis-angle, ¿no?).

Para ello necesitarías una función tal como:

void QuaternionToAxisAngle(const Quaternion *pQ, Vector3 *pAxis, float *pAngle)
{
   float squareLength, invLength;

   squareLength = pQ->x * pQ->x + pQ->y * pQ->y + pQ->z * pQ->z;
   if (squareLength > 1e-5f)
   {
       invLength = 1.0f / sqrtf(squareLength);
       pAxis->x  = pQ->x * invLength;
       pAxis->y  = pQ->y * invLength;
       pAxis->z  = pQ->z * invLength;
       *pAngle   = 2.0f * acosf(pQ->w);
       return;
   }

   pAxis->x = 1.0f;
   pAxis->y = 0.0f;
   pAxis->z = 0.0f;
   *pAngle  = 0.0f;
}

NOTA: todos los créditos de esta función van para Klaus Hartman.

Por otro lado entender (entender de verdad :sonriendo:) los quaternions no es tarea fácil (jeje, a mi no me miréis :sonriendo:) intentando llevar  acabo esa tarea :riendo:

Un saludo.
                               
Título: quaternions (o como se diga en castellano :D)
Publicado por: BeRSeRKeR en 01 de Enero de 1970, 01:00:00 AM
                                Bueno, si quieres introducirte más en el tema y ver de verdad los pros y los contras de los quaternions te aconsejo que leas (si no lo has hecho ya) este polémico artículo (al que hice referencia en el post de arriba) y los posts que se produjeron en el foro de gamedev comentando dicho articulo :riendo:

Un saludo

_________________
BeRSeRKeR
DiGiTALYS TEAM

[ Este Mensaje fue editado por: BeRSeRKeR el 2002-03-26 19:25 ]                                
Título: quaternions (o como se diga en castellano :D)
Publicado por: Emotion en 01 de Enero de 1970, 01:00:00 AM
                                Gracias por el codigo, lo pegare en un fichero de texto y cuando llegue a mi casa lo machacare hasta reventar :sonriendo:

Saludos
                               
Título: quaternions (o como se diga en castellano :D)
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                Solo quería comentarte que si vas a usar los quaterniones en tu código supongo que será evidentemente para usar las características que no te dan la representación habitual de rotaciones usando angulos de Euler. Como ha dicho B3RS3RK3R una de las más llamativas e interesantes es la posibilidad de interpolar aunque no solamente se puede interpolar linearmente (Como el caso de SLERP). Pero sin duda otro de los usos que más lleva a implementar quaterniones es como sabrás el problema del gimbal lock. Te comento esto porque si decides usar el código que pasteó B3RS3RK3R que es totalmente correcto :sonriendo:, y pillas del quaternion para pasar a Angulo/Eje para despues usarlo con glRotate, que sepas que seguirás con el problema del gimbal lock :sonriendo:
Un saludo                                
Título: quaternions (o como se diga en castellano :D)
Publicado por: Emotion en 01 de Enero de 1970, 01:00:00 AM
                                SI, la principal razon por la que me he decantado por los quaternions es el evitar el gimbal lock, aunque como tu dices, si uso el glRotate seguire teniendo el problema, ya que lo unico que hace el glRotate es alterar la matriz de rotacion, no transformar los vertices, pero eso ya lo sabia y lo que voy a hacer es hacer las rotaciones yo a pelo, aunque aun quiero dar soporte al sistema matricial normal. No obstante, el problema del gimbal lock es evitable. Habia por ahi un articulo (creo que lo tengo en mi casa) que hablaba de una tecnica muy sencilla para evitar el gimbal lock

Saludos
                               
Título: quaternions (o como se diga en castellano :D)
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                Lo que tienes que hacer es coger y seguir usando quaterniones pero en lugar de usar la función de QuaternionToAxisAngle()y usar esto con glRotate, implementar otra función (O pastearla de x ejemplo magicsoftware.com) del estilo QuaternionToMatrix() y luego cargar esa matrix con glLoadMatrix o glMultMatrix en su defecto :sonriendo: Y funciona muy bien :sonriendo: