Unity Shader:(三)数学基础
一、矢量和标量
矢量:包含了模和方向。如 以10km/h的速度向北骑行。
区别于点:矢量是一个相对量,所在位置不重要,只要模和方向一致就是相等的。而点表示的就是一个位置。
标量:只有模没有方向。如 家距离学校1公里。
矢量运算:记住矢量的位置并不重要,可以通过移动矢量的位置,来做矢量运算。
B点到A点的位移可以用a-b得到的矢量表示。
单位矢量:在实际使用中,我们常常只关注矢量的方向,不关注大小,把矢量转换成单位矢量的过程叫做归一化。
数学公式是:单位矢量=矢量/矢量的模
矢量乘法:点积和叉积 (重中之重!!!)
点积:结果是一个标量,表示两个向量的相似度,值越大越相似。
数学公式一:a·b = (ax,ay,az)·(bx,by,bz) = ax bx + ay by + az bz
几何意义:a·b等同于b在a方向上的投影值再乘以a的长度。
数学公式二:a·b = |a||b|cosθ
叉积:结果是一个矢量,表示两个向量组成平面的法向量。
数学公式一:a×b = (ax,ay,az)×(bx,by,bz) = ( ay bz - az by , az bx - ax bz , ax by - ay bx )
ax ay az 很不好记吧。下次遇到怎么办呢?先在草稿纸上把两个向量列出来,如左边所示。
求x要遮住第一列,然后按yz的顺序,画叉叉。
bx by bz 求y要遮住第二列,然后按zx的顺序,画叉叉。
求z要遮住第三列,然后按xy的顺序,画叉叉。
数学公式二:|a×b| = |a||b|sinθ
________________________________________________________________________________________________________________
例题:场景中有一个NPC位于点P处,他的前方用矢量V表示,玩家在X点处。
Q1: 判断玩家在NPC的哪个方向? (X-P)·V 大于0表示玩家和NPC之间的夹角<90°,玩家在NPC前方。小于0表示夹角>90°,玩家在NPC后方。等于0表示夹角=90°,玩家在NPC左/右。
Q2: NPC的视角角度是φ,判断玩家是否在NPC视角内? 全视角角度是φ,代表能看到左右φ/2的角度。通过点乘 (X-P)·V=|(X-P)||V|cosθ 公式反求得cosθ,cosθ>=cosφ/2表示θ<=φ/2,能看见。
Q3:NPC的观察距离也有限制? |X-P| <= 观察距离
二、矩阵
1. 方块矩阵(方阵):行和列相等的矩阵。
2. 对角矩阵:除了对角线上的元素外其余都为0。
3. 单位矩阵:对角线上元素都是1的对角矩阵,任何矩阵乘以单位矩阵都还是原来的矩阵。
4. 转置矩阵:转换行列矩阵,r×c变成c×r矩阵,Cij 变成 Cji 。(AB)T = BT AT 。
5. 逆矩阵:方阵乘以它的逆矩阵结果为单位矩阵。一个矩阵可以表示一个变换,那么逆矩阵就可以还原这个变换。
6. 正交矩阵:方阵乘以它的转置矩阵结果为单位矩阵。欸?跟上一个好像。所以也有,正交矩阵的转置矩阵和逆矩阵相等。
这有什么用呢?因为Shader里经常需要求还原矩阵,可以用这个性质直接求转置矩阵更简单。
但要先判断是否是正交矩阵,所以就有了更重要的推论:正交矩阵的每一行/列元素是单位矢量,而且元素之间互相垂直。
——————————————————————————————————————————————————————————————
矩阵的几何意义:可以用矩阵来表示一个变换,这个变换包括:旋转、缩放、平移。
基础变换矩阵共同点:[M3×3 t3×1]
[01×3 1]
M表示旋转和缩放,t表示平移。
所以,平移矩阵的长相应该只跟t有关,M是单位矩阵表示不做旋转和缩放变换。
平移矩阵:[1 0 0 tx]
[0 1 0 ty]
[0 0 1 tz]
[0 0 0 1]
所以,缩放矩阵跟M有关。
缩放矩阵:[kx 0 0 0]
[0 kx 0 0]
[0 0 kx 0]
[0 0 0 1]
旋转矩阵,这就比较复杂了,绕x,y,z轴旋转的矩阵不一样!不过旋转矩阵是正交矩阵。
绕X轴旋转θ度:[1 0 0 0]
[0 cosθ -sinθ 0]
[0 sinθ cosθ 0]
[0 0 0 1]
------------------------------------------------------------
绕Y轴旋转θ度:[cosθ 0 sinθ 0]
[0 1 0 0]
[-sinθ 0 cosθ 0]
[0 0 0 1]
------------------------------------------------------------
绕Z轴旋转θ度:[cosθ -sinθ 0 0]
[sinθ cosθ 0 0]
[0 0 1 0]
[0 0 0 1]
复合变换:既旋转又缩放还平移。我们约定的变换顺序是:先缩放,再旋转,后平移。如果用数学表达式,那么这是三个矩阵,计算顺序从右往左。
三、空间变换
1.模型空间(局部空间):看到局部你应该懂了。对应Unity里的局部坐标。
2. 世界空间:根据上一个你应该也懂了。对应Unity里的世界坐标。
3. 观察空间(摄像机空间):你要看模型的正面,那么相机的正向和模型的正向是对着的。所以观察空间的坐标系是不一样的。观察空间是右手坐标系,Z轴是反的。
---------------------------------------------------------------------------------------------------------------------------------------
说到这里不得不说说顶点着色器。
顶点着色器通常串联成一个MVP矩阵,第一步做模型变换(将顶点坐标从模型空间转换到世界空间);
第二步做观察变换(顶点坐标从世界空间转换到观察空间);
第三步做投影变换(顶点坐标从观察空间转换到裁剪空间)。
---------------------------------------------------------------------------------------------------------------------------------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!