转置矩阵与原矩阵的关系(法向量变换矩阵)

在计算机图形学中,法向量(垂直于某个面的向量)有着广泛的应用,比如处理光照需要用到法向量来计算光线的入射角,最终渲染出逼真的场景。
3D建模工具设计出的模型文件一般都是包含了顶点坐标和每个面的法向量信息,也就是说法向量是已知的,模型一旦确定,每个面的法向量就确定了。但是,事情没有那么简单,场景要动起来才会丰富多彩,完全静止的东西往往缺乏生气,这就需要用到模型变换,比如平移、缩放(等比例/不等比例)、旋转等,而不管如何变换,法向量和对应面的垂直关系必须成立,否则场景渲染的效果就会失真甚至完全不正常。
3D模型是由大量的顶点坐标组成的,只要模型变换矩阵乘以顶点坐标就完成了模型的变换,但是法向量却不能直接与模型变换矩阵相乘,因为向量是有向的线段,而顶点坐标仅仅表示一个点,这个本质的不同导致变换矩阵与法向量相乘后很可能不再和变换后的面垂直。
举个简单的例子,参见下图,假设针对3D模型做沿y轴向上平移1个单位的变换,向量p为垂直于其中某个面的法向量。如果向量p=(1,0)执行同样的平移操作,则变成了向量p'=(1,1),p和p'并不是平行关系,显然针对法向量做相同的平移变换之后,p'不可能再垂直于平移后的平面,因为平面沿y轴向上平移1个单位之后仍然与变换前平面平行。

这仅仅是平移变换带来的问题,还有众多其他类型的变换,不太可能分析所有变换对法向量的影响是怎样的,然后进行一一修正。显然,需要找到一种通用的方法来处理法向量的变换。
假设p0与p1是变换前某平面上的两个点,切向量s=p1−p0,与之垂直的法向量为n;p0'和p1'为p0和p1变换后的点,变换后的切向量s′=p1′−p0′,变换后法向量为n',其中模型变换矩阵为M,法向量变换矩阵为M',变换后n'与s'需要互相垂直。

使用公式可以表示为:

s'和n'互相垂直,可以得知n'和s'的点积为0,所以有:

进一步对公式进行变换,可以得出:

T表示矩阵的转置,就是将原矩阵的行列互换
由于n⋅s=nT×s可以得出M′×M=I,因为只有I×s=s,这样就可以保证公式始终成立。

I表示单位矩阵
由M′T×M=I可得M′T=M−1,最终得出M′=(M−1)T,及法向量的变换矩阵为模型变换矩阵的逆转置矩阵。
