Publicado en 25 de julio, 2020
Unity: Comprendiendo un poco los Quaterniones para las rotaciones.
Las rotaciones en entornos 3D se manejan en Quaterniones, no me voy a meter en como funcionan o como hacer operaciones a papel, pero si explicar de manera sencilla porque Quaterniones y como usarlos a nivel básico.
¿Porque no puedo rotar con grados de 0 a 360 grados?
Por como hemos sido educados, se nos hace muy fácil y natural manejar que una rotación esta compuesto por grados que van de 0 grados(0°) a 360 grados (360°). La forma de trabajar una rotación utilizando grados en las matemáticas de entornos 3D como videojuegos se les llama como grados Euler. Al trabajar con Euler se nos facilita mucho decir si tengo rotado algo 90° y quiero rotar otros 30° solo es 90° + 30° = 120°, fácil y es una simple suma, pero al combinar con 3 ejes, X, Y, Z, pasar de 350° y sumar 20°, no terminaríamos en 370°, terminaríamos en 10°, ya que lo máximo que existe en una rotación es 360°, al trabajar un angulo no es problema, pero al trabajar en 3 ejes, provoca un error matemático que se le conoce ‘gimbal lock’, que básicamente es que al trabajar con Eulers, si quieres trabajar con 3 ejes al mismo tiempo, un eje queda limitado su rotación para permitir que los 2 ejes funcionen correctamente.
¿Que son los Quaterniones?
Entonces sabiendo que hay un limitante al trabajar con las rotaciones en Euler, para solucionar este problema es trabajar con Quaterniones. Un Quaternion es manejar las rotaciones utilizando una matriz de 4 x 4 donde sus valores van de -1 a 1. Que básicamente lo que intenta hacer los Quaterniones es, okay si con 3 ejes, 1 eje queda limitado, agregamos un 4 eje, para que los 3 que nos importan tengan total libertad, es decir, fingir una cuarta dimensión. No tiene sentido pensar en una cuarta dimensión, cuando en nuestro mundo solo existen 3, pero entiendo que trampa esta detrás de esto es más sencillo. Entonces una recomendación es no tratar de imaginártelo ni entenderlos como funciona, solo enfocar en como usarlos. Se que matemáticamente ya hay mejores alternativas, pero fue demasiado tarde, por el momento todo software 3D, los utiliza, así que ni-modo.
Como rotar como dios en entornos 3D como Unity
Entonces al entender los Euler y Quaterniones, viene el como trabajar las rotaciones correctamente. Unity en el inspector te muestra las rotaciones en 3 ejes, que son en Euler, solo para que nosotros humanamente podamos entender mejor que rotación tiene el GameObject, pero sin embargo cuando trabajemos con ellos hay procurar al manipularlas hacerlo en Quaterniones y solo usar los Euler para leer y asignar de manera más cómodo para nosotros.
- Siempre que quieras almacenar una rotación para usar hazlo en Quaternion, puedes usar Quaternion.Euler(x, y, z) para pasar de algo fácil de leer a como Unity le funciona mejor.
- Multiplicar Quaterniones es sumar la rotación. Es decir Angulo1 + Angulo2 -> a Quaternion sería Quaternion1 * Quaternion2.
- Si multiplicas una rotación de manera directa QuaternionFinal = QuaternionInicial * QuaternionAgregar rotara tu GameObject de manera local.
- Si multiplicas una rotación anulada primero y luego agregando lo que deseas rotar, es rotar respecto al mundo: QuaternionFinal = QuaternionInicial * Quaternion.Inverse(QuaternionInicial) * QuaternionAgregar * QuaternionInicial. Aquí el truco que hace la diferencia para que la rotación sea respecto al mundo es ‘QuaternionInicial * Quaternion.Inverse(QuaternionInicial) ‘ que al * (sumar) la inversa a lo actual es como llevar la rotación a 0, 0, 0. Para entender mejor esto recomiendo dar repaso a rotaciones.
- Cuando quieras interpolar rotaciones, usa Slerp no Lerp.
Esta guía esta basado en cosas que generalmente mis alumnos me preguntan y como surgen nuevas dudas iré mejorando el articulo.
Traducción ininteligible