法向量矩阵

906 阅读4分钟

1-法向量矩阵的概念

先简单认识一下法线的作用。

在同样的光源下,入射光线和着色点法线的夹角,会影响着色点的受光程度。

image-20211026183025315

由上图可知,光线I 和法线n的夹角越小,着色点的受光程度就越大。

在实际开发中,我们必然会对模型进行变换操作,比如用模型矩阵缩放模型。

image-20220627083817200

由上图可知,当我们用模型矩阵对模型进行非等比缩放时,模型的法线是不能直接使用模型矩阵进行变换的。因为这时候的法线可能无法与模型表面保持垂直关系,那在用它计算光照效果的时候就会出错。

这时候,我们就大胆的猜测一下:我们能不能以模型矩阵为自变量写一个函数出来,这个函数会返回一个法向量矩阵。用这个法向量矩阵乘以变换前的模型法线后,便可以得到正确的垂直于变换后的模型表面的法线。

image-20220627090005502

有了猜测,我们便可以大胆去推导。不过推导之前,我们还要做好基础知识的储备。

2-必备基础

2-1-逆矩阵

2-1-1-逆矩阵的概念

逆矩阵就好比咱们学习除法的时候,一个实数的倒数。

如:

2的倒数是1/2。

那么,矩阵m的倒数就是1/m。

只不过,1/m不叫做矩阵m的倒数,而是叫做矩阵m的逆矩阵。

在数学中,矩阵m的逆矩阵通常这么写:

img

2-1-2-逆矩阵的特性

已知:

  • 矩阵m
  • 矩阵n

可得:

1.矩阵与其逆矩阵的相乘结果为单位矩阵

因为:

2*1/2=1

所以:

img

注:单位矩阵通常记做I

2.矩阵m除以矩阵n就等于矩阵m乘以矩阵n的逆矩阵

因为:

3/2=3*1/2

所以:

img

2-2-转置矩阵

2-2-1-转置矩阵的概念

转置矩阵就是将一个矩阵的行列互换。

例如,已知矩阵A:

img

矩阵A的转置矩阵就是:

img

注:在数学中,一个矩阵的转置矩阵通常会在其右上角加个T。

2-2-2-转置矩阵的特性

1.列向量的转置是一个行向量,行向量的转置是一个列向量。

  • 列向量可以看做是一个n行1列的矩阵。
  • 行向量可以看做是一个1行n列的矩阵。

数学中,默认的向量就是列向量,如向量a(x,y,z)默认就是这样:

img

向量a的转置矩阵就是一个行向量:

img

2.行向量与列向量的乘积就是点积。

img

由此我们可以推出:行向量a点积行向量b,就等于把行向量a转置成列向量后,再乘以行向量b。

img

3.列向量和行向量的乘积依旧可以按照矩阵乘法的规则走。

img

4.矩阵m乘以矩阵a后的转置矩阵,等于矩阵a的逆矩阵乘以矩阵m的逆矩阵。

img

注意:

  • 矩阵乘法的顺序,不能写乱了。
  • 上式的a也可以是一个默认的列向量。

基础知识我们先说到这,关于逆矩阵转置矩阵的相关知识还有很多,大家可以自己去基维百科学习,我这里就只说了我们后面说法向量矩阵时能用到的知识点。

3-法向量矩阵推导

image-20220627214606626

已知:

  • 三角面ABC
  • 三角面ABC的法线n
  • 三角面ABC的切向量t=AB
  • 模型矩阵m
  • 三角面A'B'C'是经过模型矩阵变换后的三角面ABC
  • 三角面A'B'C'的法线n'
  • 三角面A'B'C'的切向量t'=A'B'

求:法向量矩阵g,使g*n=n'

解:

根据已知条件可知:

img

img

image-20220627234735141

接下来我们可以尝试考虑一下,法向量矩阵g 在什么情况下可以让n'*t'=0

因为:

img

所以,我们只要在下面的算法中:

img

让n的转置矩阵不会发生任何改变即可。

所以,根据单位矩阵的性质,我们只要让下式成立即可:

img

通过上面的等式,我们便可以解出法向量矩阵g:

img

img

现在,我们便求出法向量g来了。

扩展:

在webgl的着色器里,我们可以这样来写:

g = transpose(inverse(mat3(m));
  • transpose(matrix) 返回矩阵matrix的转置矩阵
  • inverse(matrix) 返回矩阵matrix的逆矩阵
  • mat3(m) 是为了去掉模型矩阵m里的位移因子,因为法线的变换不受模型位置影响。