根据 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) 相比,它指向相反的方向。