法线变换、逆转置、伴随转置 - 知乎 (zhihu.com)
Shader
- 此时的normal是在世界空间下的normal
- 因为顶点根据模型矩阵进行了更新,所以normal也要进行更新
- 更新方式是通过下面这种方式
attribute vec3 vNormal;
layout (location = 1) in vec3 normal;
vNormal = mat3(transpose(inverse(model))) * normal;
简单论证
引理:若两向量垂直,其中一个缩放S,另一个缩放 ,它们还垂直。
证:
- 设
即
,
(因为是缩放矩阵,所以只有斜对线才有),
- a用S缩放得a',b用
缩放得b'。
- 则
,
,
,
,
- 所以
。
应用
- 矩阵M将
变成为
,
法线为N。
- 求构造矩阵X,将N变换为与
垂直的向量N'。
解:
- 设
(其中
为旋转矩阵,
为缩放矩阵)。
到
变换过程如下:
- 现在来构造N到N'的变换过程,根据引理知,只要照抄
到
的变换过程并将
替换为
,即可保证每步法线都与三角面垂直,从而最终N'与
垂直:
- 所以
- (旋转矩阵逆等于转置
,缩放矩阵是对角阵
,所以)
- 所以
注: (1)一般情况下不能保证向量经
变换后仍是单位长度,故需进行单位化。 (2)如果
中所有
均为单位阵,即无缩放,则
。即:无缩放时可直接用M作为法线变换矩阵,不用单位化。 (3)如果
中所有
的对角线元素均相等(假设均为
),即等比缩放,则
,所以
,其中系数
会在单位化时消除。所以:只有等比缩放时可直接用M作为法线变换矩阵,需要单位化。或者如果知道缩放系数k的值,用
作为法线变换矩阵,则无需单位化。