CComponent_Transform

El componente de transformación representa la posición, la orientación y la escala de nuestro objeto en el mundo.

SAMSUNG

En un principio, se representaban estos 3 vectores con un vector de 3 componentes flotantes, tales como:

vec3 position;
vec3 angle;
vec3 scale;

Esto nos permite operar de forma sencilla sobre esos valores, con operaciones del tipo traslación, rotación y escalado (locales al eje actual del objeto, y globales (con respecto al eje X, Y, Z).

No obstante, la representación de estos valores (en concreto, la orientación con “angle”) daba una serie de problemas. Uno de ellos era un manejo lento, complicado, pesado y poco eficiente. De cara al usuario, trabajar con grados sobre los ejes X, Y, Z (ángulos de Euler) era muy cómodo, pero de cara al sistema, lento. Además, hay un fenómeno muy molesto llamado “Gimbal lock“, que, dada una combinación de rotaciones en los ejes X, Y, Z, se anula una componente de las rotaciones (es decir, rotando en 2 ejes distintos, el objeto rota sobre el mismo eje en nuestro mundo). Como esto es chapuza problemática, he decidido buscar una mejor solución.

En todos los sitios relacionados al desarrollo de videojuegos hablaban de los cuaterniones, y lo peor es que hablaban mal de ellos, como una pesadilla, lo cual me empujaba a buscar otras soluciones. Después de numerosos intentos fallidos, he decidido usar los cuaterniones para la representación interna de la orientación de un objeto. Así, evitamos el efecto “Gimbal lock” y ganamos en eficiencia para hacer rotaciones (simplemente toca multiplicar la matriz GL_MODELVIEW actual por la matriz generada por el cuaternión actual).

No obstante, como esta representación es un cáncer de cáncer bastante confusa, tenemos una simple solución:

De cara al sistema, se trabajará con cuaterniones con pura eficiencia.
De cara al usuario (el que programará sus juegos), se le dará la posibilidad de trabajar con ángulos de Euler (intuitivos y lentos) o cuaterniones (rápidos). No obstante, en ambos casos se trabajará de manera indirecta con el segundo sistema (en el primer caso, se pasará de ángulos de Euler a cuaterniones).

Como estos cálculos son otro cáncer de cáncer, hemos decidido ampliar nuestro repositorio de librerías y utilizar “GLM” (Graphics Library Maths), una librería de sólo cabeceras para hacer operaciones matemáticas con gráficos 3D (lo usaremos para los cuaterniones, básicamente). Seguramente, usemos varias funciones de esta librería para “inflar” nuestro sistema “CSystem_Math“.

Por ende, ahora se representará el componente como:

vec3 position;
vec3 scale;
quat angle;

Enlaces de interés:

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s