四元数如何与向量相乘?

Sam*_*tel 1 c# unity-game-engine

我正在开发第三人称射击游戏。我找到了这段代码。但我不能对此毫无意义。首先,它将四元数与“Vector3.forward”相乘,编译器没有显示任何内容。另外你能告诉我这段代码的主要逻辑吗?我知道死记硬背代码不是一个好习惯。那么你能给我解释一下代码吗?Quaternion.euler 的作用是将 euler 更改为四元数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour {
    [SerializeField]
    Transform target;
    [SerializeField]
    float distance;
    [SerializeField]
    float targetheight;

    private float x = 0;
    private float y = 0;

    void LateUpdate()
    {

        y = target.eulerAngles.y;

        Quaternion rotation = Quaternion.Euler(x, y, 0);
        Debug.Log(rotation);
        transform.rotation = rotation;

        var postion = target.position - (rotation *Vector3.forward* distance + new Vector3(0, -targetheight, 0));
        transform.position = postion;
    }
}
Run Code Online (Sandbox Code Playgroud)

Cru*_*ool 5

让我们来分解一下:

y = target.eulerAngles.y;
Run Code Online (Sandbox Code Playgroud)

这是Transform.eulerAngles()并为您提供目标的当前旋转Quaternion

然后将该旋转重新应用于目标,但移除绕 Z 轴的旋转。

Quaternion rotation = Quaternion.Euler(x, y, 0);
Debug.Log(rotation);
transform.rotation = rotation;
Run Code Online (Sandbox Code Playgroud)

这是Quaternion.Euler(x,y,z)并为您提供三度值的旋转。

最后是如下计算:

var postion = target.position - (rotation *Vector3.forward* distance + new Vector3(0, -targetheight, 0));
transform.position = postion;
Run Code Online (Sandbox Code Playgroud)

将 a 乘以Vector3a 即可Quaternion将旋转应用于向量。因此,在这种情况下,您将根据目标的旋转来旋转前向矢量(没有 Z 轴旋转,因为我们之前将其设置为 0)。然后将所得的前向矢量乘以一定的距离,得到目标当前面向方向前方某处的点,并根据变量降低targetheight

最后,从我们自己的当前位置中减去该计算,基本上以目标为点执行点反射。结果是,我们实际上最终得到了一个具有正高度的位置(最初我们使用的是负目标高度)并且位于目标面向方向的后面。