文章目录
- 一、Mathf
- 二、坐标系
- 三、向量 Vector3
- 四、四元数 Quaternion
一、Mathf
(一)Mathf 和 Math
Math 是 C# 中封装好的用于数学计算的工具类 —— 位于 System 命名空间中
Mathf 是 Unity 中封装好的用于数学计算的工具结构体 —— 位于 UnityEngine 命名空间中
他们都是提供来用于进行数学相关计算的
Mathf 和 Math 中的相关方法几乎一样
但 Mathf 是 Unity 专门封装的,不仅包含 Math 中的方法,还多了一些适用于游戏开发的方法
所以我们在进行 Unity 游戏开发时,使用 Mathf 中的方法用于数学计算即可
(二)常用方法
- PI
- Abs - 取绝对值
- CeilToInt - 向上取整
- FloorToInt - 向下取整
- Clamp - 钳制函数
- Max / Min - 获取最大 / 小值
- Pow - 一个数的 n 次幂
- RoundToInt - 四舍五入
- Sqrt - 返回一个数的平方根
- IsPowerOfTwo - 判断一个数是否是 2 的 n 次方
- Sign - 判断正负数
(三)Lerp 方法
Lerp 函数公式:
其中,t 为插值系数,取值范围为 0 ~ 1
函数调用:
应用:控制物体移动
(四)三角函数
二、坐标系
(一)世界坐标系
原点:世界的中心点
轴向:世界坐标系的三个轴向是固定的
(二)物体坐标系
原点:物体的中心点(建模时决定)
轴向:
物体右方为 x 轴正方向
物体上方为 y 轴正方向
物体前方为 z 轴正方向
(三)屏幕坐标系
原点:屏幕左下角
轴向:
向右为 x 轴正方向
向上为 y 轴正方向
最大宽高:
(四)视口坐标系
原点:屏幕左下角
轴向:
向右为 x 轴正方向
向上为 y 轴正方向
特点:
左下角为(0, 0)
右上角为(1, 1)
和屏幕坐标类似,将坐标单位化
(五)坐标转换
三、向量 Vector3
(一)向量模长和单位向量
(二)调试画线
(三)向量点乘
(四)向量叉乘
(五)向量插值运算
- 线性插值
- 球形插值
四、四元数 Quaternion
(一)欧拉角
由三个角度 (x, y, z) 组成 ,在特定坐标系下用于描述物体的旋转量
空间中的任意旋转都可以分解成绕三个互相垂直轴的三个旋转角组成的序列
heading-pitch-bank 是一种最常用的旋转序列约定,即 Y - X - Z 约定
heading:物体绕自身的对象坐标系的 Y 轴,旋转的角度
pitch:物体绕自身的对象坐标系的 X 轴,旋转的角度
ban:物体绕自身的对象坐标系的 Z 轴,旋转的角度
Inspector 窗口中调节的 Rotation 就是欧拉角
this.transform.eulerAngles 得到的就是欧拉角角度
- 优点:
- 直观、易理解
- 存储空间小(三个数表示)
- 可以进行从一个方向到另一个方向旋转大于180度的角度
- 缺点:
- 同一旋转的表示不唯一
例如,Rotation(x, y, z) = Rotation(x + 360, y + 360, z + 360) - 万向节死锁
(二)万向节死锁
万向节死锁的意义就是在 X 轴转 90度的情况下,后面左乘 Z(绕基坐标下 Z)与右乘 Y(绕自身 Y,实际与基坐标 Z 一样了)实际效果是相同的,丧失了自由度。
例如,在 Unity 中,将 Rotation 中的 X 设置为 90,之后调节 Y 和调节 Z 的大小,物体的转动都会是沿一个角度的。
(三)四元数简介
四元数是简单的超复数,由实数加上三个虚数单位组成 主要用于在三维空间中表示旋转
四元数原理包含大量数学相关知识,较为复杂,比如:复数、四维空间等等
因此此处我们只对其基本构成和基本公式进行讲解,如想深入了解数学原理请从数学层面去查找资料了解它
- 四元数的构成
一个四元数包含一个标量和一个 3D 向量
[w, v],w为标量,v为 3D 向量,即[w, (x, y, z)]
对于给定的任意一个四元数: 表示 3D 空间中的一个旋转量
- 轴角对
在 3D 空间中,任意旋转都可以表示绕着某个轴旋转一个旋转角得到
对于给定旋转,假设为绕着 n 轴,旋转 β 度,n 轴为 (x, y, z)
那么可以构成四元数为
四元数 Q = [cos(β / 2), n · sin(β / 2)]
四元数 Q = [cos(β / 2), x · sin(β / 2), y · sin(β / 2), z · sin(β / 2)]
四元数 Q 则表示绕着轴 n,旋转 β 度的旋转量 - Unity 中的 Quaternion
Quaternion 是 Unity 中表示四元数的结构体
- 四元数和欧拉角转换
(四)常用方法
- 单位四元数
单位四元数表示没有旋转量(角位移)
当角度为 0 或者 360 度时,对于给定轴都会得到单位四元数
[1, (0, 0, 0)]和[-1, (0, 0, 0)] 都是单位四元数,表示没有旋转量
- 插值运算
四元数中同样提供如同 Vector3 的插值运算:Lerp 和 Slerp
在四元数中 Lerp 和 Slerp 只有一些细微差别,由于算法不同,Slerp 的效果会好一些
Lerp 的效果相比 Slerp 更快但是如果旋转范围较大效果较差,所以建议使用 Slerp 进行插值运算
- 方向转四元数
LookRoataion 方法可以将传入的面朝向量转换为对应的四元数角度信息
当人物面朝向想要改变时,只需要把目标面朝向传入该函数,便可以得到目标四元数角度信息,之后将人物四元数角度信息改为得到的信息即可达到转向
(五)实现缓慢看向目标
(六)四元数计算
- 四元数乘四元数
q3 = q1 * q2
两个四元数相乘得到一个新的四元数,代表两个旋转量的叠加,相当于旋转
注意:旋转相对的坐标系是物体自身坐标系
- 四元数乘向量
v2 = q1 * v1(顺序不能反)
四元数乘向量返回一个新向量,可以将指定向量旋转对应四元数的旋转量,相当于旋转向量