Menu
CoddyTech

Quaternions

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

Un Quaternion est le type de Unity qui représente une rotation : transform.rotation en est un, 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 manipuler 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. Ainsi, lamp est le point situé 1 unité au-dessus et 2 unités devant l’objet, selon 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 s’effectue autour de l’axe y du monde. Pour un objet à la verticale, 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 par une rotation ne change rien, et transform.rotation = Quaternion.identity; remet un objet dans sa pose sans rotation.

challenge icon

Défi

Moyen

Fais en sorte que la barre d’espace tire une salve de trois balles qui pivote avec le canon.

  1. Remplace la ligne Instantiate par for (int i = -1; i <= 1; i++).
  2. À l’intérieur, définis Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);.
  3. Fais apparaître chaque balle à 1 unité dans la direction visée : Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);.

Appuie sur « Jouer », tourne et tire : les trois balles s’écartent en éventail, à 20 degrés les unes des autres. Puis clique sur « Vérifier ».

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);
        }
    }
}

Toutes les leçons de Physique et gameplay

Entraînez-vous par vous-même : Playground Unity