📅  最后修改于: 2023-12-03 15:20:58.671000             🧑  作者: Mango
在3D图形学中,许多操作需要使用到向量(Vector)和欧拉角(Euler Angle)。而在实际开发中,很多情况下我们需要将向量旋转一定角度。这时我们就需要使用四元数(Quaternion)来实现。
Vector3是三维向量,它包含x、y、z三个分量,表示三维空间中的一个点、方向或大小。
四元数则是一种用来描述旋转的数学对象。它包含四个分量:x、y、z、w,其中x、y、z表示旋转轴的向量,w则表示旋转的角度。
在Unity中,我们可以使用Vector3的Rotate方法来对向量进行旋转,也可以使用Quaternion的FromToRotation方法来生成旋转所需的四元数。
使用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方法可以生成一个以原向量为起点,以目标向量为终点的旋转四元数。
下面的代码演示了如何将一个向量沿着另一个向量旋转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图形学中的操作。