Unity Shader:(三)数学基础

一、矢量和标量

矢量:包含了方向。如 以10km/h的速度向北骑行。

区别于:矢量是一个相对量,所在位置不重要,只要模和方向一致就是相等的。而点表示的就是一个位置。

标量:只有没有方向。如 家距离学校1公里。

 

矢量运算:记住矢量的位置并不重要,可以通过移动矢量的位置,来做矢量运算。

B点到A点的位移可以用a-b得到的矢量表示。

 

 

 

 

单位矢量:在实际使用中,我们常常只关注矢量的方向,不关注大小,把矢量转换成单位矢量的过程叫做归一化

 

数学公式是:单位矢量=矢量/矢量的模

 

 

 

矢量乘法:点积和叉积 (重中之重!!!) 

 

点积:结果是一个标量,表示两个向量的相似度,值越大越相似。

数学公式一:a·b = (ax,ay,az)·(bx,by,bz) = ab+ ab+ abz

 

几何意义:a·b等同于b在a方向上的投影值再乘以a的长度。

 

 

 数学公式二:a·b = |a||b|cosθ

叉积:结果是一个矢量,表示两个向量组成平面的法向量。

 

 

数学公式一:a×b = (ax,ay,az)×(bx,by,bz) = ( ab- aby , ababababx )

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矩阵,第一步做模型变换(将顶点坐标从模型空间转换到世界空间);

第二步做观察变换(顶点坐标从世界空间转换到观察空间);

第三步做投影变换(顶点坐标从观察空间转换到裁剪空间)。

---------------------------------------------------------------------------------------------------------------------------------------

 

posted @   番茄玛丽  阅读(299)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示