根据OpenGL红皮书的附录F,一个常规的3D变换矩阵M可以用于计算对法向量的作用,如下所示:
然而,虽然与转换后法线相关联的正交平面确实平行于转换后的表面,但转换后的法线向量本身可能指向我所期望的相反方向,即'进入'表面而不是'从表面出去'。
normalTransformed = transpose(inverse(M)) * normal
然而,虽然与转换后法线相关联的正交平面确实平行于转换后的表面,但转换后的法线向量本身可能指向我所期望的相反方向,即'进入'表面而不是'从表面出去'。
如果我希望normalTransformed指向正确的方向(即当其附加到的表面未转换时指向的方向相同),我应该如何在数学上实现?
示例
假设我的表面法线为(0,0,1),我的变换是Z方向上的平移10。变换矩阵M如下:
1 0 0 0
0 1 0 0
0 0 1 10
0 0 0 1
转置(逆M)然后是:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 -10 1
应用于表面法线(0,0,1),即在齐次坐标中表示为(0,0,1,1),得到:
normalTransformed = (0,0,1,-9)
回到非齐次坐标:
(0,0,-1/9)
归一化为长度1:
(0,0,-1)
与原始法线向量(0,0,1)相比,该向量指向相反的方向。