浅析3D透视投影矩阵:从人眼视觉到数学推导
以右手系,观察视角向负z轴为例(与OpenGL一致)。
人眼感知视觉特性
-
人眼对三维空间的透视感知(近大远小)。
-
人眼对近距离物体的几何细节和遮挡关系更敏感(如物体边缘、表面凹凸),而远处物体细节感知较弱。
透视几何模型抽象
- 人眼视锥空间:

- 视锥体(Frustum)参数:
- 近裁剪面距离:( n > 0 )(在摄像机空间中,近裁剪面处 ( z = -n ))
- 远裁剪面距离:( f > n )(在摄像机空间中,远裁剪面处 ( z = -f ))
- 近裁剪面上的左右边界:( l ) 和 ( r )
- 近裁剪面上的上下边界:( b ) 和 ( t )
- 几何关系:

设摄像机位于原点,视线沿负 z 轴,对于摄像机空间中任一点 ( (x, y, z) )(其中 ( z < 0 )),它在近裁剪面(( z = -n ))上的投影 ( (x’, y’, -n) ) 满足:
x
′
=
−
n
z
x
,
y
′
=
−
n
z
y
.
x' = \frac{-n}{z}\,x,\quad y' = \frac{-n}{z}\,y.
x′=z−nx,y′=z−ny.
这体现了透视效果:远处的点(|z|较大)在近裁剪面上的投影缩小,符合人眼视觉透视规律。
-
标准化设备坐标系(NDC, Normalized Device Coordinates):
希望将近裁剪面上 ( x’ ) 的范围 ([l,,r]) 线性映射到 ([-1,1]),( y’ ) 的范围 ([b,,t]) 映射到 ([-1,1]);同时对 z 做特殊映射,使得:-
当 ( z = -n )(近裁剪面)时映射为 z n d c = − 1 ; z_{ndc} = -1 ; zndc=−1;
-
当 ( z = -f )(远裁剪面)时映射为 z n d c = 1 。 z_{ndc} = 1 。 zndc=1。
-
透视矩阵任务目标
应用透视投影矩阵(Perspective Projection Matrix),将三维顶点坐标映射到二维屏幕空间,模拟人眼自然视角。
任务描述:
构造一个 4×4 的透视投影矩阵,使得将摄像机空间中的三维点
P
=
(
x
,
y
,
z
,
1
)
T
P = (x,\, y,\, z,\, 1)^T
P=(x,y,z,1)T
经过该矩阵变换,再经过透视除法后,能将视锥体内的点映射到标准设备坐标(NDC)空间,其中:
- x 和 y 坐标应从视锥体近裁剪面上给定的区域线性映射到 ([-1,1]),同时需要引入“近大远小”的透视效果;
- z 坐标要映射为一个适合深度测试的区间(例如 OpenGL 中为 ([-1,1])),并且符合靠近摄像机区域变化更快,远处变化慢的深度值分布。
数学模型定义
按照映射需求得到变换前后坐标基本关系:
x:在摄像机空间中,点的 x 坐标经过投影会与 x 本身和 z 值有关,而不会受到 y 或常数项的直接影响;
y:同理,y 坐标只应依赖于 y 和 z;
z:而 z 坐标(用于深度映射)则只需根据 z(加上一个常数偏移)进行调整,保证深度测试时近裁剪面和远裁剪面的正确映射;
w:最后,为了实现透视除法,我们需要生成一个 w 分量,该分量仅与 z 有关,从而在后续归一化时引入1/z 效果。
变换过程总览关系:
观察空间View/Camera→(透视投影变换)→裁剪空间Clip Space→(裁剪+透视除法)→标准设备空间NDC
基于上述关系构造一个矩阵 ( P ) 使得
(
x
c
l
i
p
y
c
l
i
p
z
c
l
i
p
w
c
l
i
p
)
=
P
(
x
y
z
1
)
,
\begin{pmatrix} x_{clip} \\ y_{clip} \\ z_{clip} \\ w_{clip} \end{pmatrix} = P \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix},
⎝⎜⎜⎛xclipyclipzclipwclip⎠⎟⎟⎞=P⎝⎜⎜⎛xyz1⎠⎟⎟⎞,
其中
P = ( A 0 B 0 0 C D 0 0 0 E F 0 0 G 0 ) . P = \begin{pmatrix} A & 0 & B & 0 \\[1mm] 0 & C & D & 0 \\[1mm] 0 & 0 & E & F \\[1mm] 0 & 0 & G & 0 \end{pmatrix}. P=⎝⎜⎜⎜⎛A0000C00BDEG00F0⎠⎟⎟⎟⎞.
并通过透视除法
(
x
n
d
c
,
y
n
d
c
,
z
n
d
c
)
=
(
x
c
l
i
p
w
c
l
i
p
,
y
c
l
i
p
w
c
l
i
p
,
z
c
l
i
p
w
c
l
i
p
)
,
(x_{ndc},\, y_{ndc},\, z_{ndc}) = \left(\frac{x_{clip}}{w_{clip}},\, \frac{y_{clip}}{w_{clip}},\, \frac{z_{clip}}{w_{clip}}\right),
(xndc,yndc,zndc)=(wclipxclip,wclipyclip,wclipzclip),
使得最终获得的
(
x
n
d
c
,
y
n
d
c
,
z
n
d
c
)
(x_{ndc},\, y_{ndc},\, z_{ndc})
(xndc,yndc,zndc) 分别满足上述 NDC 映射要求,同时产生正确的透视缩放效果。
推导过程
1 透视几何与近裁剪面的映射
已知:
在几何上,任一点 ( (x,y,z) ) 在近裁剪面上的投影为
x
′
=
−
n
z
x
,
y
′
=
−
n
z
y
.
x' = \frac{-n}{z} x,\quad y' = \frac{-n}{z} y.
x′=z−nx,y′=z−ny.
目标:
将 ( x’ ) 从区间 ([l, r]) 线性映射到 ([-1,1])。利用区间线性映射公式:
x
n
d
c
=
−
1
+
2
r
−
l
(
x
′
−
l
)
=
2
x
′
−
(
r
+
l
)
r
−
l
.
x_{ndc} = -1 + \frac{2}{r-l}(x' - l) = \frac{2x' - (r+l)}{r-l}.
xndc=−1+r−l2(x′−l)=r−l2x′−(r+l).
同理,
y
n
d
c
=
2
y
′
−
(
t
+
b
)
t
−
b
.
y_{ndc} = \frac{2y' - (t+b)}{t-b}.
yndc=t−b2y′−(t+b).
代入 ( x’ = -\frac{n}{z}x )(注意负号)得:
x
n
d
c
=
−
2
n
z
x
−
(
r
+
l
)
r
−
l
.
x_{ndc} = \frac{-\frac{2n}{z}x - (r+l)}{r-l}.
xndc=r−l−z2nx−(r+l).
这说明了:
- 透视除法中将引入 1/z(这里 ( z<0 )),实现“近大远小”;
- 同时有一个常数项 r + l r − l \frac{r+l}{r-l} r−lr+l 完成平移调整。
2 构造齐次坐标下的矩阵
我们设矩阵 ( P ) 的形式为:
P
=
(
A
0
B
0
0
C
D
0
0
0
E
F
0
0
G
0
)
.
P = \begin{pmatrix} A & 0 & B & 0 \\[1mm] 0 & C & D & 0 \\[1mm] 0 & 0 & E & F \\[1mm] 0 & 0 & G & 0 \end{pmatrix}.
P=⎝⎜⎜⎜⎛A0000C00BDEG00F0⎠⎟⎟⎟⎞.
目标是在矩阵乘法后得到:
x
c
l
i
p
=
A
x
+
B
z
,
y
c
l
i
p
=
C
y
+
D
z
,
z
c
l
i
p
=
E
z
+
F
,
w
c
l
i
p
=
G
z
.
\begin{aligned} x_{clip} &= A\,x + B\,z,\\[1mm] y_{clip} &= C\,y + D\,z,\\[1mm] z_{clip} &= E\,z + F,\\[1mm] w_{clip} &= G\,z. \end{aligned}
xclipyclipzclipwclip=Ax+Bz,=Cy+Dz,=Ez+F,=Gz.
为 了 引 入 几 何 中 的 1 z 缩 放 , 通 常 我 们 令 w c l i p = − z ( 即 G = − 1 ) 这 样 透 视 除 法 后 会 出 现 1 − z 因 子 , 与 − n z 中 的 1 z 配 合 。 为了引入几何中的\frac{1}{z} 缩放,通常我们令 w_{clip} = -z (即 G = -1)\\这样透视除法后会出现\frac{1}{-z}因子,与 \frac{-n}{z} 中的 \frac{1}{z} 配合。 为了引入几何中的z1缩放,通常我们令wclip=−z(即G=−1)这样透视除法后会出现−z1因子,与z−n中的z1配合。
3 推导 x 分量
经矩阵变换后,x 分量有:
x
c
l
i
p
=
A
x
+
B
z
,
w
c
l
i
p
=
−
z
.
x_{clip} = A\,x + B\,z,\quad w_{clip} = -z.
xclip=Ax+Bz,wclip=−z.
因此透视除法后:
x
n
d
c
=
x
c
l
i
p
w
c
l
i
p
=
A
x
+
B
z
−
z
=
−
A
z
x
−
B
.
x_{ndc} = \frac{x_{clip}}{w_{clip}} = \frac{A\,x + B\,z}{-z} = -\frac{A}{z} x - B.
xndc=wclipxclip=−zAx+Bz=−zAx−B.
要求:此表达式应与上一步得到的
[
x_{ndc} = \frac{-2n,x/z - (r+l)}{r-l}
]
相等。
对比得:
- 对 ( x ) 的系数:
− A z ⟺ − 2 n r − l 1 z ⇒ A = 2 n r − l . -\frac{A}{z} \quad\Longleftrightarrow\quad -\frac{2n}{r-l}\frac{1}{z}\quad \Rightarrow\quad A = \frac{2n}{r-l}. −zA⟺−r−l2nz1⇒A=r−l2n. - 常数项:
− B ⟺ − r + l r − l ⇒ B = r + l r − l . -B \quad\Longleftrightarrow\quad -\frac{r+l}{r-l}\quad \Rightarrow\quad B = \frac{r+l}{r-l}. −B⟺−r−lr+l⇒B=r−lr+l.
4 推导 y 分量
类似地,对 y 分量:
y
c
l
i
p
=
C
y
+
D
z
,
w
c
l
i
p
=
−
z
,
y_{clip} = C\,y + D\,z,\quad w_{clip} = -z,
yclip=Cy+Dz,wclip=−z,
得到
y
n
d
c
=
−
C
z
y
−
D
.
y_{ndc} = -\frac{C}{z}y - D.
yndc=−zCy−D.
要求与
y
n
d
c
=
−
2
n
y
/
z
−
(
t
+
b
)
t
−
b
y_{ndc} = \frac{-2n\,y/z - (t+b)}{t-b}
yndc=t−b−2ny/z−(t+b)
相等,则:
C
=
2
n
t
−
b
,
D
=
t
+
b
t
−
b
.
C = \frac{2n}{t-b},\quad D = \frac{t+b}{t-b}.
C=t−b2n,D=t−bt+b.
5 推导 z 分量
对于 z 分量,设
z
c
l
i
p
=
E
z
+
F
,
w
c
l
i
p
=
−
z
,
z_{clip} = E\,z + F,\quad w_{clip} = -z,
zclip=Ez+F,wclip=−z,
则透视除法后
z
n
d
c
=
z
c
l
i
p
w
c
l
i
p
=
E
z
+
F
−
z
=
−
E
−
F
z
.
z_{ndc} = \frac{z_{clip}}{w_{clip}} = \frac{E\,z + F}{-z} = -E - \frac{F}{z}.
zndc=wclipzclip=−zEz+F=−E−zF.
要求:
- 当 ( z = -n ) 时, ( z_{ndc} = -1 );
- 当 ( z = -f ) 时, ( z_{ndc} = 1 )。
分别代入得到两个条件:
- ( z = -n ) 时:
− E − F − n = − E + F n = − 1. -E - \frac{F}{-n} = -E + \frac{F}{n} = -1. −E−−nF=−E+nF=−1. - ( z = -f ) 时:
− E + F f = 1. -E + \frac{F}{f} = 1. −E+fF=1.
解这两个方程:
- 从第一个方程:
F n − E = − 1 ⇒ E = F n + 1. \frac{F}{n} - E = -1 \quad \Rightarrow\quad E = \frac{F}{n} + 1. nF−E=−1⇒E=nF+1. - 从第二个方程:
F f − E = 1 ⇒ E = F f − 1. \frac{F}{f} - E = 1 \quad \Rightarrow\quad E = \frac{F}{f} - 1. fF−E=1⇒E=fF−1.
令两式相等:
F
n
+
1
=
F
f
−
1
⇒
F
n
−
F
f
=
−
2.
\frac{F}{n} + 1 = \frac{F}{f} - 1 \quad \Rightarrow\quad \frac{F}{n} - \frac{F}{f} = -2.
nF+1=fF−1⇒nF−fF=−2.
解得:
F
(
1
n
−
1
f
)
=
−
2
⇒
F
=
−
2
1
n
−
1
f
=
−
2
f
−
n
n
f
=
−
2
n
f
f
−
n
.
F\left(\frac{1}{n} - \frac{1}{f}\right) = -2 \quad \Rightarrow\quad F = \frac{-2}{\frac{1}{n} - \frac{1}{f}} = \frac{-2}{\frac{f-n}{nf}} = \frac{-2nf}{f-n}.
F(n1−f1)=−2⇒F=n1−f1−2=nff−n−2=f−n−2nf.
将 ( F ) 代入 ( E = \frac{F}{n} + 1 ):
E
=
−
2
n
f
/
(
f
−
n
)
n
+
1
=
−
2
f
f
−
n
+
1
=
−
2
f
+
(
f
−
n
)
f
−
n
=
−
f
+
n
f
−
n
.
E = \frac{-2nf/(f-n)}{n} + 1 = -\frac{2f}{f-n} + 1 = \frac{-2f + (f-n)}{f-n} = -\frac{f+n}{f-n}.
E=n−2nf/(f−n)+1=−f−n2f+1=f−n−2f+(f−n)=−f−nf+n.
6 确定 w 分量
我们之前已经设定 w c l i p = − z w_{clip} = -z wclip=−z(即矩阵最后一行为 (0,0,-1,0) )。
7 得到最终透视投影矩阵
将所有系数代入矩阵形式,我们得到:
P
=
(
2
n
r
−
l
0
r
+
l
r
−
l
0
0
2
n
t
−
b
t
+
b
t
−
b
0
0
0
−
f
+
n
f
−
n
−
2
f
n
f
−
n
0
0
−
1
0
)
.
P = \begin{pmatrix} \displaystyle \frac{2n}{r-l} & 0 & \displaystyle \frac{r+l}{r-l} & 0 \\[1mm] 0 & \displaystyle \frac{2n}{t-b} & \displaystyle \frac{t+b}{t-b} & 0 \\[1mm] 0 & 0 & \displaystyle -\frac{f+n}{f-n} & \displaystyle -\frac{2fn}{f-n} \\[1mm] 0 & 0 & -1 & 0 \end{pmatrix}.
P=⎝⎜⎜⎜⎜⎜⎜⎜⎛r−l2n0000t−b2n00r−lr+lt−bt+b−f−nf+n−100−f−n2fn0⎠⎟⎟⎟⎟⎟⎟⎟⎞.
这就是在该给定视锥体参数模型下,通过一步步的数学推导得到的透视投影矩阵。
8 引入视角参数的矩阵形式
为了适应视角效果动态调整的需求,引入视场角FOV和宽高比Aspect Ratio,以更加直观地调整投影视野效果 。
对于大部分情况的对称视锥体,有
l
=
−
r
,
b
=
−
t
.
l = -r,\quad b = -t.
l=−r,b=−t.
原矩阵可以化简为
P
=
(
n
r
0
0
0
0
n
t
0
0
0
0
−
f
+
n
f
−
n
−
2
f
n
f
−
n
0
0
−
1
0
)
.
P = \begin{pmatrix} \displaystyle \frac{n}{r} & 0 & 0 & 0 \\[1mm] 0 & \displaystyle \frac{n}{t} & 0 & 0 \\[1mm] 0 & 0 & \displaystyle -\frac{f+n}{f-n} & \displaystyle -\frac{2fn}{f-n} \\[1mm] 0 & 0 & -1 & 0 \end{pmatrix}.
P=⎝⎜⎜⎜⎜⎜⎛rn0000tn0000−f−nf+n−100−f−n2fn0⎠⎟⎟⎟⎟⎟⎞.
定义近裁剪面上的边界参数为
tan
(
fovy
2
)
=
t
n
,
aspect
=
r
t
.
\tan\left(\frac{\text{fovy}}{2}\right)=\frac{\text{t}}{n} ,\quad \text{aspect}=\frac{\text{r}}{t} .\\
tan(2fovy)=nt,aspect=tr.
引入视角参数整理矩阵得到
P
=
(
1
tan
(
fovy
2
)
⋅
aspect
0
0
0
0
1
tan
(
fovy
2
)
0
0
0
0
−
f
+
n
f
−
n
−
2
f
n
f
−
n
0
0
−
1
0
)
.
P = \begin{pmatrix} \displaystyle \frac{1}{\tan\left(\frac{\text{fovy}}{2}\right) \cdot \text{aspect}} & 0 & 0 & 0 \\[2mm] 0 & \displaystyle \frac{1}{\tan\left(\frac{\text{fovy}}{2}\right)} & 0 & 0 \\[2mm] 0 & 0 & \displaystyle -\frac{f+n}{f-n} & \displaystyle -\frac{2fn}{f-n} \\[2mm] 0 & 0 & -1 & 0 \end{pmatrix}.
P=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛tan(2fovy)⋅aspect10000tan(2fovy)10000−f−nf+n−100−f−n2fn0⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞.
推导逻辑总结
任务目标:构造矩阵 ( P ) 使得摄像机空间的点经过矩阵变换和透视除法后,能够得到标准设备坐标,同时正确反映透视效果和深度映射。
已知条件:
- 视锥体参数 n , f , l , r , b , t ; n,\,f,\,l,\,r,\,b,\,t ; n,f,l,r,b,t;
- 投影几何关系: x ′ = − n z x , y ′ = − n z y ; x'=\frac{-n}{z}x,\; y'=\frac{-n}{z}y ; x′=z−nx,y′=z−ny;
- NDC 目标: x n d c , y n d c ∈ [ − 1 , 1 ] , 且 z n d c 在 z = − n 和 z = − f 时 分 别 为 − 1 和 1 。 x_{ndc}, y_{ndc} \in [-1,1] ,且 z_{ndc} 在 z=-n 和 z=-f 时分别为 -1 和 1。 xndc,yndc∈[−1,1],且zndc在z=−n和z=−f时分别为−1和1。
推导步骤:
利
用
区
间
线
性
映
射
,
将
x
′
与
y
′
从
视
锥
体
内
的
实
际
区
间
映
射
到
[
−
1
,
1
]
;
设
计
齐
次
坐
标
矩
阵
,
利
用
设
定
w
c
l
i
p
=
−
z
将
几
何
中
出
现
的
1
z
引
入
透
视
除
法
;
对
比
透
视
除
法
前
后
各
分
量
的
表
达
式
,
分
别
确
定
x
、
y
分
量
中
矩
阵
的
对
应
系
数
;
对
z
分
量
,
设
定
z
c
l
i
p
=
E
z
+
F
并
利
用
两
个
边
界
条
件
求
解
E
和
F
;
最
终
整
理
得
出
完
整
的
4
×
4
透
视
投
影
矩
阵
。
利用区间线性映射,将 x' 与 y' 从视锥体内的实际区间映射到 [-1,1];\\ 设计齐次坐标矩阵,利用设定 w_{clip}=-z 将几何中出现的 \frac{1}{z} 引入透视除法;\\ 对比透视除法前后各分量的表达式,分别确定 x、y 分量中矩阵的对应系数;\\ 对 z 分量,设定 z_{clip} = E\,z + F 并利用两个边界条件求解 E 和 F ;\\ 最终整理得出完整的 4×4 透视投影矩阵。\\
利用区间线性映射,将x′与y′从视锥体内的实际区间映射到[−1,1];设计齐次坐标矩阵,利用设定wclip=−z将几何中出现的z1引入透视除法;对比透视除法前后各分量的表达式,分别确定x、y分量中矩阵的对应系数;对z分量,设定zclip=Ez+F并利用两个边界条件求解E和F;最终整理得出完整的4×4透视投影矩阵。
小结
为了模拟人眼视觉效果,从人眼视觉特性的经验到几何模型的抽象,最后从数学模型的推导,解释了如何根据透视效应对观察空间坐标进行变换,直到转换为标准化设备坐标系。不得不说,我们还是在追随造物主的脚后跟。
1369

被折叠的 条评论
为什么被折叠?



