![](https://csdnimg.cn/release/download_crawler_static/729436/bg1.jpg)
3D 变换中法向量变换矩阵的推导
潘李亮 2003-11-23
xheartblue@etang.com
在一个 3D 几何管道中,输入的顶点要经过一系列的变换,最终变换到一个投影空间里
来,去掉最后的一个 Z-坐标后就是一个规格化的 2D 的屏幕坐标。变换通常分成两个步骤,
一是视图/模型变换(D3D 里把这个分开成了两个变换世界变换和视图变换),二是投影变换
Project.
当我们不去为一个顶点指定一个法向量的时候,一个多边形的顶点的法向量会由系统
自动计算生成,计算的方法是由交成这个顶点的两条边做个叉积(叉积的时候注意叉积的方
向),这个步骤通常在变换到视图空间后进行的。所以通常情况下我们是没有必要关心法向
量是如何变换到视空间中来的。(为何是视图空间?而不是投影完成后的投影空间?原因是
光照等计算都是在需要视图空间中的参数进行的。投影空间中的坐标只是为了裁剪和 Z-Test
用的)。
那么何时需要我们自己去关心法向量是如何变换的呢?这个谁也说不上来。但是肯定
是需要的,比如你自己写一个 Vertex Shader 的时候,也许你需要用到法向量,这时就需要
你用正确的变换方法把它变换到视图空间中来------当然你自己如果要写一个软件渲染器的
话……。下面我先来用数学公式严密的推导出变换公式,再来解释一些其他的误区。
假设:我们的 Model View 变换矩阵为
, 为世界空间中的法向量, 为
世界空间中的两个顶点,两个顶点所在的平面和
垂直。则我们很快就有如下的关系
,即 和 的点积为零。在这里提醒大家一下。点积也可以看做是
一种运算。所以我们把它写 ---------(1)。(
WV
M
0
N
21
,PP
N
0)(
21
=−• PPN
21
PP − N
(⊗ )
21
− PPN =
T
在这里表示矩阵相乘,
为 的转置矩阵,下同)。
T
PP )(
21
−
(
1
P )
2
P−
如果我们标记
为 变换到视空间中的点和对应的法向量,同理我们
也有
--------(2)
'
'
2
'
1
,, NPP
)
2
'
−
T
P
NPP ,,
21
0(
1
''
=⊗ PN
TT
wv
T
wv
T
wv
PPPPMPMPM )()(
1
2
'
12121
−=−⊗=⊗−⊗ ----------(3)
联立 1,2,3 得:
T
T
wv
TT
T
wv
T
wv
TT
wv
T
T
NMNNMN
MNN
PPPPM
PPN
PPN
⊗=⇒⊗=⇒
⊗
′
=⇒
−=−⊗
=−⊗
=−⊗
−1''
1
2
'
121
2
'
1
''
21
)()()(
)(
)()(:3
0)(:2
0)(:1
步推算变换矩阵,还要做进一因为我们使用的左乘的
到这里我们已经得到法向量的变换公式为 。其中 为 Model View 变换矩
1
)(
−
T
wv
M
wv
M