unity3d
Cuaterniones
Buscar..
Sintaxis
- Quaternion.LookRotation (Vector3 adelante [, Vector3 arriba]);
- Quaternion.AngleAxis (ángulos de flotación, vector3 axisOfRotation);
- ángulo de flotación entre = ángulo de cuaternión (rotación de cuaternión1, rotación de cuaternión2);
Introducción a Quaternion vs Euler
Los ángulos de Euler son "ángulos de grado" como 90, 180, 45, 30 grados. Los cuaterniones difieren de los ángulos de Euler en que representan un punto en una esfera unitaria (el radio es 1 unidad). Puede pensar en esta esfera como una versión 3D del círculo de unidad que aprende en trigonometría. Los cuaterniones difieren de los ángulos de Euler en que usan números imaginarios para definir una rotación 3D.
Si bien esto puede sonar complicado (y podría decirse que lo es), Unity tiene excelentes funciones integradas que le permiten cambiar entre los ángulos y quaterions de Euler, así como funciones para modificar los cuaterniones, sin saber una sola cosa acerca de las matemáticas detrás de ellos.
Conversión entre Euler y Quaternion
// Create a quaternion that represents 30 degrees about X, 10 degrees about Y
Quaternion rotation = Quaternion.Euler(30, 10, 0);
// Using a Vector
Vector3 EulerRotation = new Vector3(30, 10, 0);
Quaternion rotation = Quaternion.Euler(EulerRotation);
// Convert a transfroms Quaternion angles to Euler angles
Quaternion quaternionAngles = transform.rotation;
Vector3 eulerAngles = quaternionAngles.eulerAngles;
¿Por qué usar un cuaternión?
Los cuaterniones resuelven un problema conocido como bloqueo de cardán. Esto ocurre cuando el eje primario de rotación se convierte en colineal con el eje terciario de rotación. Aquí hay un ejemplo visual @ 2:09
Quaternion Look Rotation
Quaternion.LookRotation(Vector3 forward [, Vector3 up])
creará una rotación de Quaternion que mira el vector hacia adelante 'hacia abajo' y tiene el eje Y alineado con el vector 'up'. Si no se especifica el vector hacia arriba, se utilizará Vector3.up.
Gire este objeto de juego para ver un objeto de juego objetivo
// Find a game object in the scene named Target
public Transform target = GameObject.Find("Target").GetComponent<Transform>();
// We subtract our position from the target position to create a
// Vector that points from our position to the target position
// If we reverse the order, our rotation would be 180 degrees off.
Vector3 lookVector = target.position - transform.position;
Quaternion rotation = Quaternion.LookRotation(lookVector);
transform.rotation = rotation;