当渲染3D场景并将变换应用于对象时,必须使用模型视图矩阵的转置逆来变换法线。因此,对于普通的$ n $,modelViewMatrix $ M $,转换后的普通$ n'$是

$$ n'=(M ^ {-1})^ {T} \ cdot n $$

变换对象时,很显然需要对法线进行相应的变换。但是为什么从数学上讲这是对应的转换矩阵呢?

评论

如果模型矩阵由平移,旋转和缩放组成,则无需进行反转置即可计算正态矩阵。只需将法线除以平方比例,再乘以模型矩阵即可。您可以将其扩展到具有垂直轴的任何矩阵,只需为要使用的矩阵的每个轴计算平方比例即可。我在博客中写了详细信息:lxjk.github.io/2017/10/01/Stop-Using-Normal-Matrix.html

#1 楼

这是需要逆转置的简单证明。假设我们有一个平面,由平面方程$ n \ cdot x + d = 0 $定义,其中$ n $是法线。现在,我想用某个矩阵$ M $变换该平面。换句话说,我想找到一个新的平面方程$ n'\ cdot Mx + d'= 0 $,它满足与先前平面方程完全相同的$ x $值。

为此,将两个平面方程式设置为相等就足够了。 (这放弃了任意缩放平面方程的能力,但这对参数并不重要。)然后,我们可以设置$ d'= d $并将其减去。我们剩下的是:将向量视为1列矩阵):

$$ {n'} ^ T Mx = n ^ T x $$

现在为所有$满足此条件x $,我们必须具有:

$$ {{n'} ^ TM = n ^ T $$

现在用$ n $求解$ n'$ ,

$$ \ begin {aligned} {n'} ^ T&= n ^ TM ^ {-1} \\
n'&=(n ^ TM ^ {-1 })^ T \\
n'&=(M ^ {-1})^ T n \ end {aligned} $$

保存!如果点$ x $由矩阵$ M $变换,则平面法线必须通过$ M $的反转置变换,以保留平面方程。

这基本上是点积。为了使点积在进行变换时保持不变,必须对两个点矢量进行相应但不同的变换。

在数学上,可以说法向量不是不是普通的向量,而是称为协向量(又称为协变向量,对偶向量或线性形式)的东西。协矢量基本上定义为“可以用矢量点缀以产生不变标量的事物”。为了实现这一点,它必须使用在普通矢量上运行的任何矩阵的逆转置进行变换。这适用于任何尺寸。

请注意,特别是在3D模式下,双矢量类似于辅助矢量。它们并不完全相同,因为它们具有不同的单位:副矢量的长度单位为倒数,而双矢量的长度单位为平方(面积),因此它们在缩放时的行为不同。但是,它们的定向方式确实相同,这对法线很重要。我们通常不关心法线的大小(无论如何我们总是将其归一化为单位长度),因此我们通常不必担心bivector和covector之间的差异。

评论


$ \ begingroup $
很棒的解释。但是,在2点上有点快,您会喜欢更多的细节:1.如何从点积跳到矩阵积? 2.在最后引用部分的第2行和第3行之间,发生了什么(n对我来说从左到右有点神奇地移动了)
$ \ endgroup $
–v.oddou
2015年9月16日在1:24

$ \ begingroup $
1.如果a和b是相同维的列矩阵,则(a ^ T)b与dot(a,b)相同。自己尝试一下数学! 2.(AB)^ T =(B ^ T)(A ^ T),而(A ^ T)^ T = A有关更多矩阵身份,请查看《矩阵食谱》
$ \ endgroup $
– Mokosha
2015年9月16日下午1:30

$ \ begingroup $
@ v.oddou是的,Mokosha是正确的。点积可表示为将1×n矩阵(行向量)与n×1矩阵(列向量)相乘;结果是一个1×1矩阵,其单个成分是点积。列向量的转置是行向量,因此我们可以将a·b写为a ^ T b。对于第二个问题,转置矩阵乘积等效于转置单个因子并颠倒其顺序。
$ \ endgroup $
–内森·里德(Nathan Reed)
2015年9月16日下午5:42



$ \ begingroup $
完美,现在一切都清楚了。都谢谢
$ \ endgroup $
–v.oddou
2015年9月16日下午6:09

$ \ begingroup $
@NathanReed(天哪,这使我回到了PowerVR的早期时代,在那里我们使用飞机为大多数物体建模)。可能还值得一提的是,出于优化目的,如果您的矩阵Mr只包含旋转(即正交),则Inverse(Mr)= Transpose(Mr),因此Trans(Inverse(Mr)= _ Mr_。您也可以在转换部分使用快捷方式,如果您知道缩放比例是一致的,则在SGL PowerVR图形库中的FWIW中,我们使用布尔值来跟踪转换矩阵是否具有这些属性,以节省正常转换的成本。
$ \ endgroup $
–西蒙F
2015年9月16日在8:32



#2 楼

这仅仅是因为法线并不是真正的向量!它们是由叉积创建的,这会产生双向量,而不是向量。代数在这些坐标上的工作方式大不相同,并且几何变换只是行为不同而已。

评论


$ \ begingroup $
法线也称为伪向量。作为一般性和经验法则,由叉积产生的所有内容(例如飞机)都将以类似的方式进行转换。
$ \ endgroup $
–马特西亚
17-10-4在17:03