法线矩阵

文章目录

原文链接

参见http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/
知乎这篇文章也不错。

正文

gl_NormalMatrix出现在很多顶点着色器中。这篇文章会解释什么是法线矩阵以及它是用来干什么的。本文灵感来源于《Mathematics for 3D Game Programming and Computer Graphics》 by Eric Lengyel。

许多计算是在观察空间里进行的。这与照明通常在这个空间中执行有关,否则与观察(眼睛)位置相关的效果(例如镜面反射光)将更难实现。

因此,我们需要一种方法将法线转换到观察空间。要将顶点转换到观察空间,我们可以编写:
在这里插入图片描述
为什么我们不能对法向量做同样的处理呢?法线是由3个浮点组成的向量,modelview矩阵是4×4的。其次,由于法线是一个向量,我们只想变换它的方向。包含方向的modelview矩阵区域是左上角的3×3子矩阵。为什么不把法线乘以这个子矩阵呢?

这可以通过以下代码轻松实现:
在这里插入图片描述
那么,gl_NormalMatrix只是简化代码编写或优化代码的捷径吗?不,不是真的。上面的代码行在某些情况下有效,但不是所有情况下都有效。

在这里插入图片描述

在上图中,我们看到一个三角形,有一个法向量和一个切向量。下图显示了modelview矩阵包含不等比缩放时发生的情况。
在这里插入图片描述
注意:如果缩放是一致的,那么法线的方向会被保留,长度会受到影响,但是这可以通过标准化很容易地修复。

在上图中,Modelview矩阵应用于所有顶点以及法线,结果显然是错误的:变换后的法线不再垂直于曲面。

我们知道向量可以表示为两点之间的差。考虑到切向量,它可以计算为三角形边的两个顶点之间的差。如果 P 1 P_1 P1 P 2 P_2 P2是定义边的顶点,我们知道:
在这里插入图片描述
考虑到向量可以写成最后一个分量为零的四分量元组,我们可以在等式的两边同时乘Modelview矩阵:
在这里插入图片描述

在这里插入图片描述
P 1 ′ 、 P 2 ′ P_1'、P_2' P1P2仍是变换后的三角形的顶点,所以 T ′ T' T仍然是切向量。因此,Modelview保留切线,但不保留法线。

考虑到用于向量T的相同方法,我们可以找到两点 Q 1 Q_1 Q1 Q 2 Q_2 Q2,使得:
在这里插入图片描述
主要的问题是,通过变换点 Q 2 ′ − Q 1 ′ Q_2'-Q_1' Q2Q1定义的向量不一定仍然是法向量(如上图所示)。法向量不像切向量那样定义为两点之间的差,它定义为垂直于表面的向量。

所以现在我们知道,我们不能在所有情况下应用Modelview来变换法向量。问题是,我们应该应用什么样的矩阵?

考虑一个3×3的矩阵G,让我们看看如何计算这个矩阵来正确地变换法向量。

我们知道,在矩阵变换前 T ˉ . N ˉ = 0 \bar{T}.\bar{N}=0 Tˉ.Nˉ=0,因为它们是互相垂直的。我们也知道,在转换后, T ˉ ′ . N ˉ ′ \bar{T}'.\bar{N}' Tˉ.Nˉ依然要等于0。T可以安全地乘以modelview的左上3×3子阵(T是向量,因此w分量为零),让我们称这个子阵为M。

假设矩阵G是变换法向量的正确矩阵,由此得出以下方程式:
在这里插入图片描述
点积可以转化为向量的积,因此:
在这里插入图片描述
注意,必须考虑第一个向量的转置,因为这是向量相乘所必需的。我们也知道乘法的转置就是转置的乘法,因此:
在这里插入图片描述
我们从N和T之间的点积为零开始,如果:
在这里插入图片描述
那么有:
在这里插入图片描述
这正是我们想要的。因此,我们可以基于M计算G:
在这里插入图片描述
因此,变换法线的正确矩阵是M矩阵的逆的转置。OpenGL在gl_NormalMatrix中为我们计算这个。

在本节的开头,有人指出使用Modelview矩阵在某些情况下是可行的。无论何时Modelview的3×3左上方子矩阵是正交的,我们都有:
在这里插入图片描述
这是因为对于正交矩阵,转置与逆矩阵相同。那么什么是正交矩阵?正交矩阵是所有列/行都是单位长度且相互垂直的矩阵。这意味着当两个向量被这样的矩阵相乘时,它们之间的夹角在被正交矩阵变换后与变换前是相同的。简单地说,变换保留了向量之间的角度关系,因此变换后的法线仍然垂直于切线!此外,它还保留了向量的长度。

那么什么时候才能确定M是正交的呢?当我们将几何操作限制为旋转和平移时,即在OpenGL应用程序中,我们只使用glRotate和glTranslate,而不使用glScale。这些操作保证M是正交的。注意:gluLookAt还创建了一个正交矩阵!

猜你喜欢

转载自blog.csdn.net/xiji333/article/details/115050008
今日推荐