WebGL normal 法线 旋转 逆矩阵转置

758 阅读1分钟

法线变换、逆转置、伴随转置 - 知乎 (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的值,用 [公式] 作为法线变换矩阵,则无需单位化。