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

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

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

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

  • 相关阅读:
    [数据结构]图的DFS和BFS的两种实现方式
    [算法]两个栈实现一个队列
    [数据结构]手动实现队列
    [数据结构]手动实现栈
    [数据结构]手动实现单链表
    Hive分组取Top K数据
    HBase解决海量图片存储方案
    非结构化数据存储方案
    头条面试题之实现两个线程轮流打印字符串
    [算法]最大连续子数组和,最长重复子串,最长无重复字符子串
  • 原文地址:https://www.cnblogs.com/tomatokely/p/15881379.html
Copyright © 2020-2023  润新知