分类
Math

游戏开发的数学基础 —— 法线变换

法线(normal),也被称为法矢量(normal vector)。模型的一个顶点往往会携带额外的信息,而顶点法线就是其中一种信息。当我们变换一个模型个的时候,不仅需要变换它的顶点,还需要变换顶点法线,以便在后续处理(如片元着色器)中计算光照等。

切线(tangent),也被称为切矢量(tangent vector)。切线也是模型顶点携带的一种信息。它通常与纹理空间对其,而且与法线方向垂直。

顶点的切线和法线互相垂直

由于法线和切线都是方向矢量,不会受平移的影响。我们可以使用\(3×3\)的变换矩阵\(M_{A→B}\)来变换顶点。

$$ T_B=M_{A→B}T_A $$

其中\(T_A和T_B\)分别表示在坐标空间\(A\)下和坐标空间\(B\)下的切线方向。但如果使用\(M_{A→B}\)来变换法线,得到新的法线方向可能不会与表面垂直,如:

transform_normal.png-40.6kB

我们知道一个顶点的切线\(T_A\)和法线\(N_A\)必须垂直,即\(T_A \cdot N_A=0\)。给定变换矩阵\(M_{A→B}\)。想找到一个矩阵\(G\)来变换发现\(N_A\),使得变换后的法线仍然与切线垂直,即

$$ T_B \cdot N_B=(M_{A→B}T_A) \cdot (GN_A)=0 \\
(M_{A→B}T_A) \cdot (GN_A)=(M_{A→B}T_A)^T (GN_A)=T^T_AM^T_{A→B}GN_A=T^T_A(M^T_{A→B}G)N_A=0 $$

由于\(T_A \cdot N_A=0\),因此如果\(M^T_{A→B}G=I\),那么上式成立。即,如果\(G=(M^T_{A→B})^{-1}=(M^{-1}_{A→B})^T\),即使用原变换矩阵的逆转置矩阵来变换法线就可以得到正确的结果。

如果变换矩阵\(M_{A→B}\)是正交矩阵,那么\(M^{-1}_{A→B}=M^T_{A→B}\),也就是我们可以使用用于变换顶点的变换矩阵来直接变换法线。如果变换只包括旋转变换,那么这个变换矩阵就是正交矩阵。而如果变换只包含旋转和统一缩放,不包含非统一缩放,我们可以用同意缩放系数k来得到变换矩阵\(M_{A→B}\)的逆转置矩阵\((M^T_{A→B})^{-1}=\frac{1}{k}M_{A→B}\)。

“游戏开发的数学基础 —— 法线变换”上的4,161条回复

I’ve been exploring for a little for any high-quality articles
or weblog posts on this kind of house . Exploring in Yahoo I eventually stumbled
upon this website. Reading this info So i am happy
to exhibit that I’ve a very good uncanny feeling I found out
exactly what I needed. I most undoubtedly will make certain to do not overlook this site and give it a
look on a relentless basis.

发表评论

邮箱地址不会被公开。

2 + 4 =