更新于 

附录E:逆转置矩阵

一般使用两种变换矩阵对法向量进行变换
  • 模型视图矩阵的 逆转置矩阵
  • 模型矩阵

具体使用哪种要视物体变换的类型而定。

坐标变换与法向量变换的关系
坐标变换与法向量变换的关系

变换与法向量

平移

平移变换与法向量变换的关系
平移变换与法向量变换的关系
变换问题

平移的物体实际上法向量不会改变,
但是如果模型视图矩阵中包含平移矩阵的话,
原法向量会被当做点平移

解决方法

既然4维模型视图矩阵中与平移相关的只有 第4行第4列
剩下的 3x3子矩阵 都是与旋转和缩放有关的,
那就只取其左上角的 3x3子矩阵 对法向量进行变化就好了

旋转

旋转变换与法向量变换的关系
旋转变换与法向量变换的关系
较为简单的旋转变换
简单理由1

如果只进行旋转变换,
则直接对法向量使用相同的旋转矩阵就能直接实现法向量变换。
即旋转时时:

顶点变换矩阵 = 法向量变换矩阵

简单理由2

旋转后无需进行 归一化处理

缩放

情况1:缩放因子相同

那么法向量自然不变:

  • 顶点缩放矩阵 = 法向量变换矩阵
  • 需要进行 归一化处理
情况2:缩放因子不同
缩放因子不同时的法向量变换
缩放因子不同时的法向量变换
  • 这种情况必须使用 模型矩阵的逆转置矩阵
  • 变换后法向量必须进行 归一化处理

逆转置矩阵的数学推理

假设
  • 物体顶点矢量为 s
  • 垂直于 s 的法向量为 n
  • s 进行变换的模型矩阵为 M
  • n 进行变换的矩阵为 M‘
  • 变换后的物体顶点矢量为 s’
  • 变换后的法向量为 n’
已知条件

由于 ns 垂直, n’s’ 垂直
所以有:

n · s = 0
n’· s‘= 0
s’ = M × s
n’ = M’ × n

开始推导

∵ n’· s’ = 0
∴ (M’ × n)·(M × s) = 0
∵ A · B = AT × BT
∴ (M’ × n)T ×(M × s)T = 0
∵ (A × B)T = BT × AT
∴ nT × M‘T × MT × sT = 0
∵ nT × sT = n · s = 0
∴ 要满足等式,必须有 M’T × MT = I
∴ M’ = (M^-1)T
总结: 法向量的变换矩阵即是模型矩阵的逆转置矩阵