1-法向量矩阵的概念
先简单认识一下法线的作用。
在同样的光源下,入射光线和着色点法线的夹角,会影响着色点的受光程度。
由上图可知,光线I 和法线n的夹角越小,着色点的受光程度就越大。
在实际开发中,我们必然会对模型进行变换操作,比如用模型矩阵缩放模型。
由上图可知,当我们用模型矩阵对模型进行非等比缩放时,模型的法线是不能直接使用模型矩阵进行变换的。因为这时候的法线可能无法与模型表面保持垂直关系,那在用它计算光照效果的时候就会出错。
这时候,我们就大胆的猜测一下:我们能不能以模型矩阵为自变量写一个函数出来,这个函数会返回一个法向量矩阵。用这个法向量矩阵乘以变换前的模型法线后,便可以得到正确的垂直于变换后的模型表面的法线。
有了猜测,我们便可以大胆去推导。不过推导之前,我们还要做好基础知识的储备。
2-必备基础
2-1-逆矩阵
2-1-1-逆矩阵的概念
逆矩阵就好比咱们学习除法的时候,一个实数的倒数。
如:
2的倒数是1/2。
那么,矩阵m的倒数就是1/m。
只不过,1/m不叫做矩阵m的倒数,而是叫做矩阵m的逆矩阵。
在数学中,矩阵m的逆矩阵通常这么写:
2-1-2-逆矩阵的特性
已知:
- 矩阵m
- 矩阵n
可得:
1.矩阵与其逆矩阵的相乘结果为单位矩阵
因为:
2*1/2=1
所以:
注:单位矩阵通常记做I
2.矩阵m除以矩阵n就等于矩阵m乘以矩阵n的逆矩阵
因为:
3/2=3*1/2
所以:
2-2-转置矩阵
2-2-1-转置矩阵的概念
转置矩阵就是将一个矩阵的行列互换。
例如,已知矩阵A:
矩阵A的转置矩阵就是:
注:在数学中,一个矩阵的转置矩阵通常会在其右上角加个T。
2-2-2-转置矩阵的特性
1.列向量的转置是一个行向量,行向量的转置是一个列向量。
- 列向量可以看做是一个n行1列的矩阵。
- 行向量可以看做是一个1行n列的矩阵。
数学中,默认的向量就是列向量,如向量a(x,y,z)默认就是这样:
向量a的转置矩阵就是一个行向量:
2.行向量与列向量的乘积就是点积。
由此我们可以推出:行向量a点积行向量b,就等于把行向量a转置成列向量后,再乘以行向量b。
3.列向量和行向量的乘积依旧可以按照矩阵乘法的规则走。
4.矩阵m乘以矩阵a后的转置矩阵,等于矩阵a的逆矩阵乘以矩阵m的逆矩阵。
注意:
- 矩阵乘法的顺序,不能写乱了。
- 上式的a也可以是一个默认的列向量。
基础知识我们先说到这,关于逆矩阵和转置矩阵的相关知识还有很多,大家可以自己去基维百科学习,我这里就只说了我们后面说法向量矩阵时能用到的知识点。
3-法向量矩阵推导
已知:
- 三角面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'
解:
根据已知条件可知:
接下来我们可以尝试考虑一下,法向量矩阵g 在什么情况下可以让n'*t'=0
因为:
所以,我们只要在下面的算法中:
让n的转置矩阵不会发生任何改变即可。
所以,根据单位矩阵的性质,我们只要让下式成立即可:
通过上面的等式,我们便可以解出法向量矩阵g:
现在,我们便求出法向量g来了。
扩展:
在webgl的着色器里,我们可以这样来写:
g = transpose(inverse(mat3(m));
- transpose(matrix) 返回矩阵matrix的转置矩阵
- inverse(matrix) 返回矩阵matrix的逆矩阵
- mat3(m) 是为了去掉模型矩阵m里的位移因子,因为法线的变换不受模型位置影响。