Cita de: lightbug date=1567693052Jajaj totalmente, acá el uso práctico hace la diferencia. Según Wikipedia:
"In mathematics, the quaternions are a number system that extends the complex numbers." ---> a +b i + c j + d k
Un número complejo se puede expresar en 2 dimensiones, una para la parte real (que NO acompaña a la "i") y otra para la parte imaginaria (que acompaña a la "i"). Entonces acá se puede decir que un Quaterion se puede expresar con 4 dimensiones.
Revisando el código de Unity, un Quaterion es efectivamente un vector de 4x1,:
public Quaternion(float x, float y, float z, float w)
{
this.x = x;
this.y = y;
this.z = z;
this.w = w;
}
En el mundo matricial la multiplicación de una matriz de (M filas xN columnas ) x (I filas x j columnas):
( M x N ) x (I x J ) .... Es válida o realizable si N = I, es decir --->( M x N ) x ( I x J ) ... y el resultado tiene dimensión MxJ (Extremos) ---> ( M x N ) x (I x J )
Acá dejo un poco de código de Quaternions (sacado del código de Unity). Lo interesante es que estos valores se puede arreglar de tal o tal forma y resultar en vectores, quaternions o directamente matrices de 4x4 (ejemplo: parte las matrices que usan los shader, MVP en OpenGL, WVP en D3D , necesitan agregar una componente a la posición, de Vec3 a Vec4). Basicamente lo que hace Unity es afectar a los factores de tal forma de generar el resultado querido.
Acá el operador *(Q,V) ... la regla que mencioné arriba:
public static Vector3 operator *(Quaternion rotation, Vector3 point)
{
float num1 = rotation.x * 2f;
float num2 = rotation.y * 2f;
float num3 = rotation.z * 2f;
float num4 = rotation.x * num1;
float num5 = rotation.y * num2;
float num6 = rotation.z * num3;
float num7 = rotation.x * num2;
float num8 = rotation.x * num3;
float num9 = rotation.y * num3;
float num10 = rotation.w * num1;
float num11 = rotation.w * num2;
float num12 = rotation.w * num3;
Vector3 vector3;
vector3.x = (float) ((1.0 - ((double) num5 + (double) num6)) * (double) point.x + ((double) num7 - (double) num12) * (double) point.y + ((double) num8 + (double) num11) * (double) point.z);
vector3.y = (float) (((double) num7 + (double
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Páginas1
#1