线性代数:切线空间和法向量变换

       首先来说说空间的意义吧,最开始笛卡尔二维坐标系的创建是为了城镇基础建设规划使用的(前面我们也聊过),主要就是为了确定一个参考坐标系,将整个城镇的房屋设施赋予一个按照参考坐标系来的二维坐标值,假如还要考虑建筑物的高度,那么就需要一个三维参考坐标系去给建筑物赋予三维坐标值了。而我们使用这个三维坐标系规划整个城镇的基础建设,就需要规划哪些建筑物需要改变朝向可以得到最大日照(旋转),哪些建筑物需要改变面积适合不同消费人群购买(缩放),哪些建筑物则需要移动一下,可以方便城镇道路的规划(平移),那么我们就把这个虚拟的三维坐标系和这个坐标系所容纳的城镇叫做一个空间,更加准确的说应该叫做仿射空间(非线性空间)。

       ps:这里为什么特别强调叫仿射空间而非线性空间呢,因为我曾几何时学习一般都是去看博文,但是发现很多博文对于空间的理解不算完善,后面系统性学习的时候,了解到,线性也就必须满足如下两个条件:

       ①.f(x+y) = f(x) + f(y);

       ②.k*f(x) = f(k*x);

       而图形学中空间变换的平移是不符合线性规则的,前面我们推导三维缩放旋转,坐标点或向量只需要3x3的矩阵就能获得缩放旋转的效果了,而且也符合线性变换的要求。但是平移却不适用这种情况,这也是我们之前扩充“平移维度”的原因,如下:

       f(x) = x + (2,2,2);   //表示x经过f(x)平移变换

       那么f(x) + f(x) = 2*x + (4,4,4)

       同时f(x+x) = 2*x + (2,2,2)

       这也是为什么要扩充平移维度和齐次坐标以及仿射空间和仿射变换的原因之一。

       同时,一个顶点从模型空间变换到世界空间,我们可以理解为,模型空间仿射坐标系变换到了世界空间仿射坐标系,而顶点是不变的。

       上面随便聊一下,回到正题,也就是切线空间。

       首先切线是为了计算顶点法向量,顶点法向量这个参数是相当重要的,光照计算,反射计算,光线追踪都需要这个顶点法向量,这个很容易理解吧。

       一般情况下,一个美术人员(或者咱码农亲自上阵)在3dmax or maya中的建模空间构建一个网格体,不仅仅要构建网格顶点坐标,同时要构建网格顶点贴图uv,而且还需要构建网格顶点法向量,甚至切向量等。为什么要构建这么多向量,因为假如什么都不做就给一个建模空间中顶点坐标,那么导入到3D引擎那就是白白的或者黑黑的一团物体在那戳着,因为一个模型赋予贴图和光照信息,必须知道uv信息和法向量信息,就算我们使用代码在3D引擎中构建网格,也需要构建uvs和normals数组,上一张网上找的构建信息的贴图:

       

       但是这些向量信息都是在模型空间进行的,具体到我们使用3D引擎时候还需要经过MVP甚至其他特异矩阵变换。顶点坐标就无所谓了,随意变换,也是那个顶点。法向量就不同了,随便一个非等比例缩放变换甚至更奇怪的异型变换,就可能导致法向量错误,如下:

       

       这个三角网格被拍扁了,法向量也不在垂直于斜线,当然切线依旧还是那个正确的切线,因为切线是根据网格相邻两顶点计算出来的,所以就算变换矩阵再怎么奇特,切线也是正确的,这里我们把切线所在的向量叫切向量。

       那么此时我们就算是明确的感受到问题所在了,接下来就是怎么处理这种问题的推导了,如图:

       

       ps:这里我用手写主要是想顺便锻炼一下自己写字的能力,不然我都感觉自己不会写字了。

       看得出来吧,假设法向量并不是使用矩阵M变换得到的,而是使用新的矩阵N变换得到的,根据点积意义,就得到了如下两个关键公式:

       ①.Ta·Na = 0;

       ②.(M·Ta)·(N·Na) = 0;

       那么我们怎么得到矩阵N呢,接着往下推:

       

       基本上我们通过转置矩阵和逆矩阵的运算公式就能得到结果了。

       总结一下就是顶点经过一系列矩阵变换后,其法向量需要经过顶点变换矩阵的转置逆矩阵(或者逆转置矩阵)同步处理,就能得到新的正确的法向量。

       当然其中最关键的一点就是将列向量等价于矩阵以及将向量点积等价于向量矩阵转置的乘法,这两种形式有助于推导,顺便标注一下:

       ①.列向量 = n行1列矩阵

       ②.列向量A与B的点积 = 列向量A矩阵的转置与列向量B矩阵的乘积

       再次形象描绘一下:

       

       既然顶点变换和法向量变换是两种不同的矩阵变换,那么新的完整的需求就明确了,那就是在顶点或顶点构建的三角面上,存在一个固定的坐标系,当物体发生如缩放、旋转、平移、形变等变换后,这个坐标系也必须随着顶点(或顶点构建的三角面)同步变换,那么我们只需要计算这个坐标系变换到世界坐标系(因为光源方向, 视口方向都是在世界坐标系中)中的变换矩阵,那么根据这个矩阵就能处理坐标系内顶点(或向量)到世界坐标系的变换,这个所谓的坐标系也叫切线坐标系,也可以称为切线空间。

        前面我们已经通过切向量和法向量变换遇到的问题,推导出切线空间到世界空间的变换,是模型空间到世界空间变换矩阵的逆转置(转置逆)矩阵M,所以反过来世界空间到切线空间的变换矩阵,则是矩阵M的逆矩阵。这些变换过程我们后面就要用得上。

        so,我们接下来继续。

   

       

       

空间、空间、空间,为什么有这么多空间?前面我们说了有建模空间,世界空间,视口空间,裁剪空间,现在又来个切线空间,到底有些什么意义呢。

猜你喜欢

转载自blog.csdn.net/cui6864520fei000/article/details/86572317