法线变换
法向量是垂直于物体表面的单位向量,在图形渲染管线种,我们需要将物体变换到世界坐标系下,那么法向量是否也需要变换到世界坐标系呢? 基本正确,但是不是一个简单的模型矩阵就能搞定的。
首先,法向量只是一个方向向量,不能表达空间中的特定位置,同时,法向量没有齐次坐标,这里意味着,位移不应该影响到法向量。因此,如果我们打算把法向量乘以一个模型矩阵,我们就要从矩阵中移除位移部分,只选用模型矩阵左上角3×3的矩阵(注意,我们也可以把法向量的w分量设置为0,再乘以4×4矩阵;这同样可以移除位移)。对于法向量,我们只希望对它实施缩放和旋转变换。
其次,如果模型实行了不等比缩放,顶点的改变会导致法向量不垂直于物体表面了。
我们需要专门的法线变换矩阵来解决上述问题。
Normal = mat3(transpose(inverse(model))) * aNormal;
先说结论,法线变换是模型变换的逆矩阵的转置。
法线变换矩阵推导
下图是均匀缩放后的法线图
非均匀缩放的时候,其实法线方向应该还是垂直于物体表面
我们假设三角形斜面的顶点是P1, P2。
T=P2-P1
我们将一个向量写成齐次坐标的方式,那么w分量为0.那么,我们可以写出以下等式:
T * ModelView =(P2-P1)* ModelView;
那么,可以得出:
T * ModelView =P2 * ModelView - P1 * ModelView;
T' = P2' -P1'
我们这里假设P2’和P1’是变换后的三角形的顶点,这里我们认为T’(T)是三角形的切线空间。不管怎么变换,TN=0.现在假设有一个33的矩阵G是法线变换的矩阵,那么
N'.T' = (GN) .MT = 0
可以得出:
GNMT = 0
NT = 0
在NT中间插入I(单位矩阵)
那么可以得出:
可以解出
参考文献:
https://learnopengl.com/Lighting/Basic-Lighting
http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/