Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





quaternions (o como se diga en castellano :D)

Iniciado por Emotion, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Emotion

                                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
                               
G3: Get the Power!

BeRSeRKeR

                                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.
                               
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

                                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 http://www.gamedev.net/reference/articles/article1199.asp" target=_blank>polémico artículo (al que hice referencia en el post de arriba) y los http://www.gamedev.net/community/forums/topic.asp?topic_id=25314" target=_blank>posts que se produjeron en el foro de gamedev comentando dicho articulo :riendo:

Un saludo

_________________
BeRSeRKeR
http://www.planetquake.com/digitalys">DiGiTALYS TEAM

[ Este Mensaje fue editado por: BeRSeRKeR el 2002-03-26 19:25 ]                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Emotion

                                Gracias por el codigo, lo pegare en un fichero de texto y cuando llegue a mi casa lo machacare hasta reventar :sonriendo:

Saludos
                               
G3: Get the Power!

KILE

                                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                                

Emotion

                                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
                               
G3: Get the Power!

KILE

                                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:                                






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.