No se si debería hacerlo, ya que no me parece que tengo el código muy limpio, pero al menos te haces una idea: https://github.com/Manu343726/dx_lib32/blob/master/code/headers/dl32Math.h
Ese archivo es el módulo de matemáticas de mi port de la dx_lib32, que entre otras frikadas incluye una implementación de cuaterniones. Es la clase dl32Quaternion (Línea 790). Aunque no sea en C, sino en C++, creo que te vale para guiarte un poco. No se si es la mejor manera de hacerlo, es como lo he implementado siempre y por ahora me ha funcionado XD. Es la misma implementación que hice en mi motor3d el año pasado con VB.NET.
El archivo cpp correspondiente se encuentra en code/source/dl32Math.cpp, pero si no recuerdo mal la clase dl32Quaternion tiene todo implementado con inlines.
La implementación es muy sencilla: Básicamente la tupla que mencionabas antes, a + bi + cj + dk, pero además incluye una matriz de rotación correspondiente (Por eso hereda de dl32Matrix4x4). Lo hice de esa manera porque los cuaterniones te interesan para hacer rotaciones, no frikadas algebráicas. Así que me interesaba mantener actualizada la rotación sin tener que regenerar la matriz continuamente. No se si me explico....
Ese archivo es el módulo de matemáticas de mi port de la dx_lib32, que entre otras frikadas incluye una implementación de cuaterniones. Es la clase dl32Quaternion (Línea 790). Aunque no sea en C, sino en C++, creo que te vale para guiarte un poco. No se si es la mejor manera de hacerlo, es como lo he implementado siempre y por ahora me ha funcionado XD. Es la misma implementación que hice en mi motor3d el año pasado con VB.NET.
El archivo cpp correspondiente se encuentra en code/source/dl32Math.cpp, pero si no recuerdo mal la clase dl32Quaternion tiene todo implementado con inlines.
La implementación es muy sencilla: Básicamente la tupla que mencionabas antes, a + bi + cj + dk, pero además incluye una matriz de rotación correspondiente (Por eso hereda de dl32Matrix4x4). Lo hice de esa manera porque los cuaterniones te interesan para hacer rotaciones, no frikadas algebráicas. Así que me interesaba mantener actualizada la rotación sin tener que regenerar la matriz continuamente. No se si me explico....