#6857 Score: 0
Panneiria
Participant
2 pts

我刚才突然开窍了哈哈,你试一下让inv_trans = view * model,效果是一样的。原理简单说的话,是我们在变换模型的缩放、位置和旋转的时候,只有旋转会真的影响到法线,因为法线是方向向量,w是0。
解释清楚一点,就是我们想要view space里模型的法线在世界坐标中表示的方向。那模型经历了一系列的缩放、平移和旋转,而其中只有旋转会影响法线。当我们用view * model去乘法线的时候,法线就经历了与模型一样的旋转(缩放其实也会生效,但是反正要归一化所以无所谓),而平移是无效的。于是我们就有了法线在世界坐标中表示的方向。
那原代码中的inv_trans其实我觉得有点怪怪的,虽然效果一样。如果我们不考虑平移,(view * model).inverse()这个矩阵会对法线进行与模型相反的缩放效果和相反的旋转效果,而inv_trans会对法线进行与模型相反的缩放效果(缩放效果在对角线上所以转置不影响)和与模型相同的旋转效果(旋转矩阵的逆与转置相同),那么我们也就得到了和对法线施加view * model这个矩阵一样的有效效果。