关于法线变换矩阵的思考。
1,法线变换与顶点变换一致吗?
看到很多demo上都是将法线与顶点乘以同一个矩阵进行变换,于是自己也就一直这么做。 最近重新温习渲染管线,发现原来两者的变换矩阵是不一样的(都是不求甚解惹得祸)。法线变换矩阵与顶点变换矩阵的关系推导如下: (参考)
考虑平面 n = [a, b, c, d] ,该平面任一点p = [x, y, z, 1] 满足下面条件: nt p = ax + by + cz + d = 0 如果将整个空间进行R矩阵变换,显然点p的变换矩阵为R。设平面n的变换矩阵为Q,则有变换过后的点p1 及变换过后的平面n1 : p1 = R p n1 = Q n 显然,两者同样满足: n1t p1 = 0 => (Q n)t (R p) = 0 => nt Qt R p = 0 如果Qt R = I (单位矩阵)则有 nt Qt R p = nt I p = nt p = 0。故 有: Qt R = I => Qt = R-1 => Q = (R-1)t 也就是说向量变换矩阵,是对应顶点变换矩阵的逆再转置。
2,那些demo错了吗? 话又说回来,难道平时看的那些demo都写错了?可是感觉两者效果也没啥差别啊。为了进行统一光照运算,我们需要将模型空间的法向量变换到世界空间或者摄像机空间。而这一系列的变换都可以分解为位移、缩放和旋转变换。 其实只要没有非等比例的缩放变换,法线变换与顶点变换的矩阵是相同的。
1,位移变换矩阵T 不影响法线,因为法线的w分量为0。想想也明白,法线与具体位置是无关的。 2,旋转变换矩阵R 是正交矩阵。也就有旋转矩阵的逆等于其转置Rt=R-1。 3,缩放矩阵S 是一个对角矩阵。若进行等比例缩放,不影响法线方向。
设顶点变换矩阵 G = S*R*T. 则有对应法线变换矩阵K = (G-1)t = ( (S*R*T) -1)t 由于T 不影响法线,故,K = ( (S*R) -1)t = ( R -1 * S-1)t = (S-1)t *(R-1)t 又有 Rt=R-1 ,所以 K = (S-1)t *(Rt)t = (S-1)t *R = (St )-1*R = S-1*R 若S为等比例缩放 则K == R == S*R*T == G。 也就是说 若为等比例缩放变换,则法线变换矩阵等价于顶点变换矩阵。 所以平时,我们只要在模型空间到世界空间不进行非等比例的拉伸,就可以直接统一用一个变换矩阵了。 |