法线矩阵
为什么需要法线矩阵
之前我们计算的坐标都是世界坐标,但法线向量却是局部空间的,应该把法线向量也转换到世界空间才对。但把法线向量转换到世界空间,不能简单的乘以模型矩阵,模型矩阵中可能会有位移、缩放、旋转等变换。
首先,法线向量只有方向意义,没有位置意义,因此不能对法线进行位移操作。
其次,法线向量虽然不能位移,但可以跟随平面做旋转和缩放操作。如果是旋转,法线向量直接跟随旋转即可,但如果是缩放,等比例缩放还算简单,再标准化一次就行,非等比例缩放就麻烦了,因为非等比例缩放会导致向量的各个分量缩放比例不同,从而影响向量的方向,导致法向量不再垂直于平面。
为了解决这个问题,将法向量从局部空间向世界空间转换时需要专门的转换矩阵,我们称之为法线矩阵。
法线矩阵推导
根据法线性质可知,平面上任一向量都与法线向量垂直, 即它们的数量积为0。
设平面上任一向量为 v ⃗ \vec{v} v,法线向量为 n ⃗ \vec{n} n,转换矩阵为 M M M,法线矩阵为 S S S,转换后的平面向量为 v ′ ⃗ \vec{v'} v′,转换后的法线向量为 n ′ ⃗ \vec{n'} n′,则有
v ′ ⃗ = M v ⃗ n ′ ⃗ = S n ⃗ n ⃗ ⋅ v ⃗ = ( n x n y n z ) ⋅ ( v x v y v z ) = n x v x + n y v y + n z v z = ( n x n y n z ) ⋅ ( v x v y v z ) = ( n ⃗ ) T ⋅ v ⃗ = 0 \vec{v'}=M\vec{v}\\ \vec{n'}=S\vec{n}\\ \vec{n}\cdot \vec{v}=\left( \begin{array}{ccc}n_x \\ n_y \\ n_z \end{array} \right)\cdot \left( \begin{array}{ccc}v_x \\ v_y \\ v_z \end{array} \right)=n_xv_x+n_yv_y+n_zv_z= \left( \begin{array}{ccc}n_x & n_y & n_z \end{array} \right)\cdot \left( \begin{array}{ccc}v_x \\ v_y \\ v_z \end{array} \right)=(\vec{n})^T\cdot \vec{v}=0\\ v′=Mvn′=Sn