Cuaterniones
Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 41 de 63.
Un Quaternion es el tipo de Unity para una rotación: transform.rotation es uno, y también lo es lo que devuelve Quaternion.Euler. Sus cuatro números x, y, z y w no son ángulos, y nunca necesitas establecerlos tú mismo. Lo que haces con las rotaciones es multiplicar. Una rotación multiplicada por un vector gira el vector:
Vector3 a = Quaternion.Euler(0, 90, 0) * Vector3.forward; // (1, 0, 0)
Vector3 b = Quaternion.Euler(0, 0, 45) * new Vector3(2, 0, 0); // (1.41, 1.41, 0)
Vector3 lamp = transform.position + transform.rotation * new Vector3(0, 1, 2);La rotación va a la izquierda: Vector3.forward * transform.rotation no compila. La tercera línea gira un desplazamiento según la rotación propia del objeto, así que lamp es el punto situado 1 unidad por encima y 2 por delante del objeto según sus propias direcciones, independientemente de hacia dónde esté orientado.
Una rotación multiplicada por otra rotación combina ambos giros. transform.rotation * Quaternion.Euler(0, 90, 0) aplica primero la rotación del objeto y después un cuarto de giro alrededor de su propio eje y; si se invierte el orden, el cuarto de giro es alrededor del eje y del mundo. Para un objeto vertical, ambos dan el mismo resultado. Para un avión inclinado 30 grados, no, porque su propio eje y se inclina con él:
Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0); // morro (0.87, 0.5, 0): asciende al girar
Quaternion world = Quaternion.Euler(0, 90, 0) * banked; // morro (1, 0, 0): se mantiene niveladoQuaternion.identity significa que no hay ningún giro: es el que has pasado a Instantiate. Multiplicar por él no cambia nada, y transform.rotation = Quaternion.identity; devuelve un objeto a su pose sin girar.
Desafío
IntermedioEl cañón gira con las flechas izquierda y derecha, y la barra espaciadora dispara una bala en línea recta hacia delante. Haz que la barra espaciadora dispare en abanico tres balas: una en línea recta hacia delante, una girada spread (20) grados a la derecha hacia donde apunta el cañón y otra 20 grados a la izquierda. La dispersión debe girar junto con el cañón.
- Cada bala apunta en su propia dirección (el script Bullet ya preparado la hace volar hacia delante).
- Cada bala empieza a 1 unidad del centro del cañón, en su propia dirección.
Pulsa Play, gira y dispara, después Check.
Pruébalo tú mismo
using UnityEngine;
public class Gun : MonoBehaviour
{
public GameObject bulletPrefab;
public float turnSpeed = 90f;
public float spread = 20f;
void Update()
{
if (Input.GetKey(KeyCode.RightArrow)) transform.Rotate(0, turnSpeed * Time.deltaTime, 0);
if (Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(0, -turnSpeed * Time.deltaTime, 0);
if (Input.GetKeyDown(KeyCode.Space))
{
// Una bala, directamente hacia adelante. Dispara tres: a -spread, 0 y spread grados.
Instantiate(bulletPrefab, transform.position, transform.rotation);
}
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Física y jugabilidad
1Cuerpo rígido
Gravedad y masaEmpujar con AddForceSaltar con un impulsoFixedUpdate para físicaVelocidadCuerpos cinemáticosRepaso: plataforma de lanzamiento2Colisiones
OnCollisionEnter¿Qué golpeé?Romper al impactarDe pie sobre el sueloRebote y fricciónFormas de los collidersRepaso: muro destructible5Proyecto: Carrera de monedas
La bola rodanteMonedas para recoger