Menu
CoddyTech

四元数

本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 43 课,共 71 课。

Quaternion 是 Unity 中表示旋转的类型:transform.rotation 就是一个 Quaternion,Quaternion.Euler 的返回值也是如此。它的四个数字 x、y、z 和 w 不是角度,你也不需要自己设置它们。处理旋转时,你要做的是相乘。旋转乘以向量会改变向量的方向:

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

旋转要放在左边:Vector3.forward * transform.rotation 无法编译。第三行会根据对象自身的旋转来旋转偏移量,因此无论对象朝向哪里,lamp 都是对象沿自身方向上方 1 个单位、前方 2 个单位处的点。

一个旋转乘以另一个旋转,会组合这两次旋转。transform.rotation * Quaternion.Euler(0, 90, 0) 表示先进行对象自身的旋转,再绕它自身的 y 轴旋转四分之一圈;交换顺序后,这次四分之一圈旋转的轴就是世界的 y 轴。对于保持直立的对象,两种方式的结果相同。对于倾斜 30 度的飞机,它们的结果不同,因为飞机自身的 y 轴也会随之倾斜:

Quaternion banked = Quaternion.Euler(0, 0, 30);
Quaternion own = banked * Quaternion.Euler(0, 90, 0);    // 机头(0.87, 0.5, 0):转弯时向上爬升
Quaternion world = Quaternion.Euler(0, 90, 0) * banked;  // 机头(1, 0, 0):保持水平

Quaternion.identity 表示完全不旋转,也就是传给 Instantiate 的那个值。乘以它不会改变任何东西,而 transform.rotation = Quaternion.identity; 会让对象恢复到未旋转的姿态。

challenge icon

挑战

中等

让空格键发射 3 颗会随枪转向的子弹。

  1. 将 Instantiate 那一行替换为 for (int i = -1; i <= 1; i++)。
  2. 在循环中设置 Quaternion aim = transform.rotation * Quaternion.Euler(0, i * spread, 0);。
  3. 沿子弹的方向向前 1 个单位生成每颗子弹:Instantiate(bulletPrefab, transform.position + aim * Vector3.forward, aim);。

点击“开始”,转向并开火:3 颗子弹会呈扇形散开,彼此相隔 20 度。然后点击“检查”。

亲手试试

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))
        {
            // 现在只发射一颗子弹,直线向前。改为发射三颗,角度分别为 -spread、0 和 spread 度。
            Instantiate(bulletPrefab, transform.position, transform.rotation);
        }
    }
}

物理与游戏玩法中的所有课

自己练习: Unity 在线编辑器