Menu
CoddyTech

Quaternions

Fait partie de la section Physique et gameplay du Journey Unity de Coddy. Leçon 41 sur 63.

Un Quaternion est le type utilisé par Unity pour représenter une rotation : transform.rotation en est une, tout comme la valeur renvoyée par Quaternion.Euler. Ses quatre nombres x, y, z et w ne sont pas des angles, et tu n'as jamais besoin de les définir toi-même. Pour combiner des rotations, tu les multiplies. Une rotation multipliée par un vecteur fait tourner ce vecteur :

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 rotation se place à gauche : Vector3.forward * transform.rotation ne compile pas. La troisième ligne fait tourner un décalage selon la rotation propre de l'objet ; lamp correspond donc au point situé 1 unité au-dessus et 2 unités devant l'objet dans ses propres directions, quelle que soit son orientation.

Une rotation multipliée par une autre rotation combine les deux rotations. transform.rotation * Quaternion.Euler(0, 90, 0) correspond à la rotation de l'objet, suivie d'un quart de tour autour de son propre axe y ; si tu inverses l'ordre, le quart de tour se fait autour de l'axe y du monde. Pour un objet droit, les deux donnent le même résultat. Pour un avion incliné de 30 degrés, ce n'est pas le cas, car son propre axe y est incliné avec lui :

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // nez (0.87, 0.5, 0) : il monte en tournant
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // nez (1, 0, 0) : il reste à l’horizontale

Quaternion.identity représente l'absence totale de rotation, celle que tu as passée à Instantiate. La multiplier ne change rien, et transform.rotation = Quaternion.identity; remet un objet dans sa pose sans rotation.

challenge icon

Défi

Moyen

Le canon tourne avec les flèches gauche et droite, et la barre d’espace tire une balle droit devant. Fais en sorte que la barre d’espace tire plutôt une salve de trois balles : une droit devant, une tournée de spread (20) degrés vers la droite par rapport à la direction du canon, et une tournée de 20 degrés vers la gauche. La dispersion doit tourner avec le canon.

  • Chaque balle est orientée dans sa propre direction (le script Bullet fourni la fait avancer dans sa direction avant).
  • Chaque balle commence à 1 unité du centre du canon, dans sa propre direction.

Appuie sur Play, tourne et tire, puis Check.

Essayez vous-même

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))
        {
            // Une balle, droit devant. Tire-en trois : à -spread, 0 et spread degrés.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Physique et gameplay