【Unity】Unity常用类:向量Vector3、四元数Quaternion

  • Post author:
  • Post category:其他


Vector3

Vector3类是Unity常用类之一,通常用来表示3D向量和点,有时也可以用来表示欧拉旋转。Vector3使用给定的 x、y、z 分量创建新向量。

构造函数

public Vector3 (float x, float y, float z);

静态变量

Vector3提供了一些静态变量,方便使用常用的方向,例如Vector3.up代表了Vector3(0, 1, 0)。
在这里插入图片描述

变量

变量名 作用
magnitude 返回该向量的长度。(只读)
normalized 返回 magnitude 为 1 时的该向量。(只读)
sqrMagnitude 返回该向量的平方长度。(只读)
this[int] 分别使用 [0]、[1]、[2] 访问 x、y、z 分量。
x 向量的 X 分量。
y 向量的 Y 分量。
z 向量的 Z 分量。

运算符

在这里插入图片描述

常用方法(静态)

函数名 作用
Angle 返回 from 与 to 之间的角度

(

±

180

°

)

(\pm180°)

(±180°),以点乘方式计算。

ClampMagnitude 返回 vector 的副本,其大小被限制为 /maxLength/。
Cross 返回两个向量的叉积。
Normalize 使该向量的长度变为 1。
Project 向一条线做投影,将向量投影到另一个向量上。
ProjectOnPlane 向一个平面做投影,将向量投影到由法线定义的平面上(法线与该平面正交)。第二个参数为垂直于要投影的面的向量
Dot 两个向量的点积。
Lerp 在两个点之间进行线性插值。
OrthoNormalize 将向量标准化并使它们彼此正交。
Reflect 从法线定义的平面反射一个向量。
MoveTowards 匀速移动。计算 current 指定的点与 target 指定的点之间的位置,移动距离不超过 maxDistanceDelta 指定的距离。

OrthoNormalize(正交标准化)

OrthoNormalize (ref Vector3 normal, ref Vector3 tangent, ref Vector3 binormal);
标准化 tangent 并确保其与 normal 正交,binormal 为副向量。

空间中的点通常使用xyz轴系的坐标指定。但如果有任意三个向量为标准化向量(大小为1),且彼此正交(互相垂直),他们就可以被认定为轴。

正交标准化可以用来生成新的坐标系,但与正常坐标系不同的是,其正切向量与副向量是不固定的。

Reflect(反射)

从法线定义的平面反射一个向量。Vector3 Reflect (Vector3 inDirection, Vector3 inNormal);
在这里插入图片描述

Lerp(线性插值)

Lerp用于在两个点之间进行线性插值。

普通用法:由快到慢移动,且不能到达目标点。

// 起点不固定,终点和比例固定。
Vector3.Lerp(position, targetPosition, 0.1f);

起点不固定,终点和比例固定。

Lerp自然运动:需要结合AnimationCurve(动画曲线)类使用:

Vector3.Lerp(Vector3.zero, targetPosition, curveObj.Evaluate(0.1f));

此运动不会超过终点,使用LerpUnclamped方法可以超过终点。
Evaluate方法传入一个 x 会返回一个 y(运动曲线上的 y )。x到1后终止。

Quaternion

四元数用三个分量 x, y, z 和一个标量 w 来表示旋转。它们结构紧凑,不受万向锁影响,可以轻松插值。 Unity 内部使用四元数来表示所有旋转。

构造函数

public Quaternion (float x, float y, float z, float w);

使用给定的 x、y、z、w 分量构造新的四元数。

静态变量

identity:同一性旋转,与世界坐标保持一致。该四元数对应于“no rotation”- 对象与世界轴或父轴完全对齐。

例:用脚本创建物体,第三个参数角度可使用,使用后所创建的物体将于世界坐标一致。

变量

变量名 作用
eulerAngles 返回或设置旋转的欧拉角表示。
normalized 返回 magnitude 为 1 时的该四元数。(只读)
this[int] 分别使用 [0]、[1]、[2]、[3] 访问 x、y、z 、w 分量。
x 四元数的 X 分量。除非您十分了解四元数,否则不要直接进行此种修改。
y 四元数的 Y 分量。除非您十分了解四元数,否则不要直接进行此种修改。
z 四元数的 Z 分量。除非您十分了解四元数,否则不要直接进行此种修改。
w 四元数的 W 分量。请勿直接修改四元数。

常用方法

Eular(欧拉角转四元数)

用于将欧拉角转为四元数。
public static Quaternion Euler (float x, float y, float z);
x,y,z沿某个轴旋转多少度。

四元数转欧拉角

Quaternion qt = this.transform.rotation;
Vector3 eular = qt.eulerAngles;

AngleAxis

创建一个围绕 axis 旋转 angle 度的旋转。

public static Quaternion AngleAxis (float angle, Vector3 axis);

AngleAxis(50, Vector3.up) 与 Eular(0, 50, 0) 作用相同。但如果旋转轴不是主轴,则Eular无用。

LookRotation

获取注释旋转的角度,如直接将角度赋值给Transform,则与调用 LookAt 方法效果相同。如果使用Lerp等方法动态做旋转,则可实现曲线运动,Look只管 z 轴。

Angle

获取两个四元数之间的角度。返回两个旋转 a 和 b 之间的角度(以度为单位)。

FromToRotation

创建一个从 fromDirection 旋转到 toDirection 的旋转。

public static Quaternion FromToRotation (Vector3 fromDirection, Vector3 toDirection);

通常使用此方法来做轴旋转(对Transform进行转转),使其一个轴(如 y 轴)跟随世界空间中的目标方向。

例如:把y轴旋转到z轴

// 把y轴旋转到z轴
this.transform.rotation = Quaternion.FromToRotation(Vector3.up, transform.forward);

运算符

在这里插入图片描述


更多内容请查看总目录【Unity】Unity学习笔记目录整理


版权声明:本文为xiaoyaoACi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。