📜  vector3 到四元数 C# (1)

📅  最后修改于: 2023-12-03 15:20:58.671000             🧑  作者: Mango

Vector3到四元数 C#

在3D图形学中,许多操作需要使用到向量(Vector)和欧拉角(Euler Angle)。而在实际开发中,很多情况下我们需要将向量旋转一定角度。这时我们就需要使用四元数(Quaternion)来实现。

Vector3和四元数的关系

Vector3是三维向量,它包含x、y、z三个分量,表示三维空间中的一个点、方向或大小。

四元数则是一种用来描述旋转的数学对象。它包含四个分量:x、y、z、w,其中x、y、z表示旋转轴的向量,w则表示旋转的角度。

在Unity中,我们可以使用Vector3的Rotate方法来对向量进行旋转,也可以使用Quaternion的FromToRotation方法来生成旋转所需的四元数。

使用Vector3进行旋转

使用Vector3的Rotate方法可以对一个向量进行绕轴旋转。Rotate方法有两个参数,第一个是要旋转的向量,第二个参数是旋转的角度。

下面是一个代码示例,它将向量(1,0,0)绕Y轴旋转90度:

Vector3 v = new Vector3(1, 0, 0);
v = Quaternion.Euler(0, 90, 0) * v;

这里我们使用了Quaternion的Euler方法来生成一个旋转四元数。Euler方法有三个参数,分别是绕X轴、Y轴、Z轴旋转的角度。

使用四元数进行旋转

使用四元数进行旋转的方法有很多,我们这里介绍两种常用的方法:FromToRotation和乘法运算。

FromToRotation方法

FromToRotation方法可以生成一个以原向量为起点,以目标向量为终点的旋转四元数。

下面的代码演示了如何将一个向量沿着另一个向量旋转90度:

Vector3 from = new Vector3(1, 0, 0);
Vector3 to = new Vector3(0, 1, 0);

Quaternion q = Quaternion.FromToRotation(from, to);
乘法运算

将两个四元数相乘,会得到一个新的旋转四元数,表示先进行第二个四元数的旋转,再进行第一个四元数的旋转。

下面的代码演示了如何将一个向量绕着另一个向量旋转90度:

Vector3 axis = new Vector3(0, 1, 0);
float angle = 90;

Quaternion q = Quaternion.AngleAxis(angle, axis);

Vector3 v = new Vector3(1, 0, 0);

v = q * v;
四元数的优势

相比欧拉角,四元数具有以下优势:

  • 避免万向锁:欧拉角存在万向锁问题,而四元数不存在。
  • 插值更容易:使用四元数可以更容易地进行插值。
  • 表示更清晰:四元数通过一个向量表示旋转轴,通过一个纯量表示旋转角度,更直观。
总结

Vector3和四元数是3D图形学中最基础、最重要的概念之一。掌握它们之间的关系和使用方法,可以让我们更快、更准确地实现3D图形学中的操作。