Menu
CoddyTech

Quaternionen

Teil des Abschnitts Physik und Gameplay der Unity-Journey von Coddy. Lektion 41 von 63.

Ein Quaternion ist der Unity-Typ für eine Rotation: transform.rotation ist ein solcher Typ, und auch das, was Quaternion.Euler zurückgibt. Seine vier Zahlen x, y, z und w sind keine Winkel, und du musst sie nie selbst festlegen. Bei Rotationen multiplizierst du. Eine Rotation mal einem Vektor dreht den Vektor:

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

Die Rotation steht links: Vector3.forward * transform.rotation lässt sich nicht kompilieren. Die dritte Zeile dreht einen Versatz entsprechend der Eigenrotation des Objekts. Daher ist lamp der Punkt 1 Einheit über und 2 Einheiten vor dem Objekt, gemessen in dessen eigenen Richtungen, ganz gleich, in welche Richtung es zeigt.

Eine Rotation mal einer Rotation kombiniert die beiden Drehungen. transform.rotation * Quaternion.Euler(0, 90, 0) bedeutet die Rotation des Objekts, gefolgt von einer Vierteldrehung um seine eigene y-Achse. Bei vertauschter Reihenfolge erfolgt die Vierteldrehung um die y-Achse der Welt. Bei einem aufrecht stehenden Objekt ergibt beides dasselbe Ergebnis. Bei einem um 30 Grad geneigten Flugzeug ist das nicht der Fall, denn seine eigene y-Achse ist ebenfalls geneigt:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // Nase (0.87, 0.5, 0): Sie steigt beim Drehen
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // Nase (1, 0, 0): Sie bleibt auf gleicher Höhe

Quaternion.identity bedeutet überhaupt keine Drehung – das ist die Rotation, die du an Instantiate übergeben hast. Eine Multiplikation damit ändert nichts, und transform.rotation = Quaternion.identity; versetzt ein Objekt zurück in seine ungedrehte Pose.

challenge icon

Aufgabe

Mittel

Die Kanone dreht sich mit den Pfeiltasten nach links und rechts, und mit der Leertaste wird eine Kugel geradeaus abgefeuert. Ändere die Leertaste so, dass sie stattdessen eine Streuung von drei Kugeln abfeuert: eine geradeaus, eine um spread (20) Grad nach rechts von der Ausrichtung der Kanone gedreht und eine um 20 Grad nach links. Die Streuung muss sich mit der Kanone drehen.

  • Jede Kugel zeigt in ihre eigene Richtung (das fertige Bullet-Skript bewegt sie entlang ihrer Vorwärtsrichtung).
  • Jede Kugel startet 1 Einheit vom Mittelpunkt der Kanone entfernt, entlang ihrer eigenen Richtung.

Drücke Play, drehe dich und feuere, dann Check.

Probier es selbst

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))
        {
            // Eine Kugel, geradeaus. Feuere drei ab: -spread, 0 und spread Grad.
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Physik und Gameplay