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:
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.typedef struct QUAT { float w, x, y, z; }
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.