Unity-Shader开发(二)
基础数学
Mathf
Math是C#封装的一个类,Mathf是Unity中封装的工具结构体,不仅包含了Math中的方法,还多了一些适用于游戏开发的方法
-
CeilToInt:向上取整 Mathf.CeilToInt(1.3f) == 2
-
FloorToInt:向下取整 Mathf.CeilToInt(1.3f) == 1
-
Clamp:钳制函数 Mathf.Clamp(10, 11, 20) == 11 Mathf.Clamp(21, 11, 20) == 20
-
Pow:一个数的n次方 Mathf.Pow(2, 3) == 8
-
RoundToInt:四舍五入 Mathf.RoundToInt(1.5f) == 2
-
Sqrt:开平方根 Mathf.Sqrt(4) == 2
-
IsPowerOfTwo:是否是2的n次方 Mathf.IsPowerOfTwo(4) == true
-
Sign:判断正负数 Mathf.Sign(10) == 1 Mathf.Sign(-3) == -1
-
Lerp :插值运算`Mathf.Clamp(start, end, t)` 公式—— **result = start + (end-start) * t**
- 用法一:先快后慢,无限接近
start = Mathf.Lerp(start, 10, Time.deltaTime) - 用法二:匀速变化,t>=1时,得到结果
time += Time.deltaTime
result = Mathf.Lerp(start, 10, time)
- 用法一:先快后慢,无限接近
三角函数
角度:1°
弧度:1radian
圆一周角度:360°
圆一周弧度:2Π radian
角度和弧度转换:
- 1 rad = (180 / Π)° = 180 / 3.14 ≈ 57.3°
- 1° = (Π / 180) =3.14 / 180 ≈ 0.01745 rad
Unity中角度和弧度转化:
- Mathf.Rad2Deg * rad 弧度转角度
- Mathf.Deg2Rad * angle 角度转弧度
正弦函数、余弦函数:
- sin:对边 / 斜边 Mathf.Sin(30 * Mathf.Deg2Rad) == 0.5
- cos:领边 / 斜边
反三角函数:
Mathf.Asin(0.5) * Mathf.Rad2Deg = 30
Mathf中的三角函数相关的函数,参数需要是弧度值
坐标系
世界坐标系、物理坐标系:
以世界中点/自己为原点,正前方为z轴,右边为x轴,头顶为y轴
屏幕坐标系:
原点为屏幕左下角,向右为x轴,向上为y轴
视口坐标系:
与屏幕坐标系类似,只是将坐标单位化 eg: 右上角(1,1)
向量
有数值大小,有方向的量
三维向量的几何意义:位置、方向
向量模长:.magnitude
向量归一化:.normalized
向量加减法几何意义:位置平移
位置向量±方向向量 == 新的位置向量
向量乘除标量几何意义:缩放
向量点乘 Vector3.Dot(A,B)
A•B =(a,b,c)•(d,e,f)= ad+be+cf
或者 A•B=|A||B|cosß
可以得到一个向量在自己向量方向上的投影
- 点乘结果>0:两个向量夹角为锐角
- 点乘结果=0:两个向量夹角为直角
- 点乘结果>0:两个向量夹角为钝角
所以点乘可以用来判断游戏物体间的前后关系和角度关系
向量叉乘 Vector3.Cross(A,B)
A(Xa, Ya, Za) X B(Xb, Yb, Zb) = (YaZb-ZaYb, ZaXb-XaZb, XaYb-YaXb)
结果是一个垂直于A,B向量的新向量, 假设A、B都是XZ平面的向量
- 新向量.y> 0 :B在A的右侧
- 新向量.y< 0 :B在A的左侧
所以可以用来判断游戏物体间的左右侧关系
线性代数
线性代数是一门研究向量和变换的数学学科
矩阵
矩阵是一种用来表示和处理数据的数学工具
矩阵是有m x n个标量组成的,通过方括号内的数值表来表示
程序中矩阵表示:
- 数组
- 嵌套列表
- 开发工具提供的类或结构体(Unity中的Matrix4x4、Matrix3x2结构体)
学习矩阵的目的是为了能在Shader开发中利用其进行相关数学计算
矩阵乘法
矩阵和标量乘法:直接让矩阵中的每一个标量乘以标量即可
矩阵和矩阵的乘法:
- 相乘条件:左列右行要相等 eg: (m x n) 、 (n x u) 可以相乘
- 相乘规则:左行乘右列 再相加
- 不满足交换律 AB ≠ BA
特殊矩阵
方块矩阵
简称方阵,特点是行列数相等
对角矩阵
是一种特殊的方阵,只有主对角线有值,其余元素全为零
单位矩阵
特殊的对角矩阵,主对角线元素为1
的对角矩阵
数量矩阵
特殊的对角矩阵,主对角线元素为同一值
转置矩阵
将原始矩阵的行和列互换得到的新矩阵
- 转置矩阵的转置等于原矩阵 (M^T^)^T^ = M
- 矩阵串接的转置等于方向串接各矩阵的转置 (AB)^T^ == B^T^ A^T^
逆矩阵
逆矩阵必须是一个方阵,并且不是所有矩阵都有逆矩阵
如果一个矩阵存在对应的逆矩阵,则称该矩阵是可逆的(非奇异的),如果不存在对应的逆矩阵,则称该矩阵是不可逆的(奇异的)
存在逆矩阵的判断条件:MM^-1^ = M^-1^M = I(单位矩阵)
计算矩阵的逆矩阵:
- 确定矩阵为方阵
- 计算矩阵的行列式(若行列式值为零,则该矩阵没有逆矩阵)
- 计算矩阵的代数余子式矩阵
- 计算标准伴随矩阵(转置代数余子式矩阵)
- 计算逆矩阵(标准伴随矩阵/行列式)
行列式
|M|结果是一个标量
低阶: 二阶、三阶 对角线法则:主对角线-副对角线
高阶:
- 初等变换
- 定理:n阶行列式D等于他的任意一行(或者列)的各元素与其对应的代数余子式的乘积之和
代数余子式矩阵
每个元素Cij = -1的i+j次幂 * 去掉第i行、j列组成的矩阵的行列式
标准伴随矩阵
原矩阵的代数余子式矩阵的转置矩阵
逆矩阵
逆矩阵为 标准伴随矩阵 / 行列式
性质:
- 逆矩阵的逆矩阵是原矩阵本身
- 矩阵乘以自己的逆矩阵为单位矩阵
- 单位矩阵的逆矩阵是它本身
- 转置矩阵的逆矩阵是逆矩阵的转置
- 矩阵串接相乘后的逆矩阵 等于反串接各个矩阵的逆矩阵 相乘
- 逆矩阵可以计算矩阵变换的反向变换
正交矩阵
正交矩阵是一种特殊的方阵,他的转置矩阵等于他的逆矩阵,他的转置矩阵也是正交矩阵