31 Rutinas matem�ticas para usar cuaterniones

Los cuaterniones son una forma alternativa de representar la parte de rotaci�n de una transformaci�n, y pueden ser m�s f�ciles de manipular que las matrices. Como con una matriz, usted puede codificar transformaciones geom�tricas en una, concatenar varias de ellas para mezclar m�ltiples transformaciones, y aplicarlas a un vector, pero s�lo pueden almacenar rotaciones puras. La gran ventaja es que puede interpolar precisamente entre dos cuaterniones para obtener una rotaci�n parcial, evitando los enormes problemas de la interpolaci�n m�s convencional con �ngulos eulerianos.

Los cuaterniones s�lo poseen versiones de punto flotante, sin ning�n sufijo "_f". Por otro lado, la mayor�a de las funciones de cueterniones se corresponden con una funci�n matricial que realiza una operaci�n similar.

Cuaterni�n significa 'de cuatro partes', y es exactamente eso. Aqu� est� la estructura:

   typedef struct QUAT
   {
      float w, x, y, z;
   }
Usted se divertir� mucho buscando el significado real de estos n�meros, pero eso est� m�s all� del alcance de esta documentaci�n. Los cuaterniones funcionan -- cr�ame.


extern QUAT identity_quat;
Variable global que contiene el cuaterni�n identidad 'que no hace nada'. Multiplicar por el cuaterni�n identidad no tiene efecto alguno.


void get_x_rotate_quat(QUAT *q, float r);
void get_y_rotate_quat(QUAT *q, float r);
void get_z_rotate_quat(QUAT *q, float r);
Construye cuaterniones de ejes de rotaci�n, almacen�ndolos en q. Cuando sean aplicados a un punto, �stos cuaterniones lo rotar�n sobre el eje relevante el �ngulo especificado (dado en binario, 256 grados forman un c�rculo).


void get_rotation_quat(QUAT *q, float x, float y, float z);
Construye un cuaterni�n que rotar� puntos alrededor de los tres ejes las cantidades especificadas (dadas en binario, 256 grados forman un c�rculo).


void get_vector_rotation_quat(QUAT *q, float x, y, z, float a);
Construye un cuaterni�n que rotar� puntos alrededor del vector x,y,z el �ngulo especificado (dado en binario, 256 grados forman un c�rculo).


void quat_to_matrix(const QUAT *q, MATRIX_f *m);
Construye una matriz de rotaci�n a partir de un cuaterni�n.


void matrix_to_quat(const MATRIX_f *m, QUAT *q);
Construye un cuaterni�n a partir de una matriz de rotaci�n. La translaci�n es descartada durante la conversi�n. Use get_align_matrix_f() si la matriz no est� ortonormalizada, porque de otra forma podr�an pasar cosas extra�as.


void quat_mul(const QUAT *p, const QUAT *q, QUAT *out);
Multiplica dos cuaterniones, almacenando el resultado en out. El cuaterni�n resultante tendr� el mismo efecto que la combinaci�n de p y q, es decir, cuando es aplicado a un punto, (punto * out) = ((punto * p) * q). Cualquier cantidad de rotaciones pueden ser concatenadas de �sta manera. Note que la multiplicaci�n del cuaterni�n no es conmutativa, es decir que quat_mul(p, q) != quat_mul(q, p).


void apply_quat(const QUAT *q, float x, y, z, *xout, *yout, *zout);
Multiplica el punto (x, y, z) por el cuaterni�n q, almacenando el resultado en (*xout, *yout, *zout). Esto es un poquito m�s lento que apply_matrix_f(), as� que �selo para trasladar unos pocos puntos. Si usted tiene muchos puntos, es mucho m�s eficiente llamar a quat_to_matrix() y entonces usar apply_matrix_f().


void quat_interpolate(const QUAT *from, QUAT *to, float t, QUAT *out);
Construye un cuaterni�n que representa una rotaci�n entre from y to. El argumento t puede ser cualquiera entre 0 y 1, y representa d�nde estar� el resultado entre from y to. 0 devuelve from, 1 devuelve to, y 0.5 devolver� una rotaci�n exactamente en la mitad. El resultado es copiado a out. Esta funci�n crear� una rotaci�n corta (menos de 180 grados) entre from y to.


void quat_slerp(const QUAT *from, QUAT *to, float t, QUAT *out, int how);
Igual que quat_interpolate(), pero permite m�s control sobre c�mo es hecha la rotaci�n. El par�metro how puede ser alguno de estos valores:

      QUAT_SHORT  - como quat_interpolate(), usa el camino m�s corto
      QUAT_LONG   - la rotaci�n ser� mayor que 180 grados
      QUAT_CW     - rotaci�n horaria vista desde arriba
      QUAT_CCW    - rotaci�n antihoraria vista desde arriba
      QUAT_USER   - los cuaterniones son interpolados exactamente como
                    son dados.



Volver al Indice