浅析3D透视投影矩阵:从人眼视觉到数学推导

🔍 VisionCore Pro | 多模态智能语义分析平台

VisionCore Pro 是一款基于 OpenAI CLIP (Contrastive Language-Image Pre-training) 架构的企业级多模态视觉分析工具。通过先进的深度学习技术,该平台实现了图像与文本之间的深度语义对齐,支持零样本(Zero-shot)图像识别与分类,为企业视觉资产数字化、智能监控及内容审核提供高效的技术支撑。

浅析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=znx,y=zny.
这体现了透视效果:远处的点(|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=Pxyz1,

其中

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=znx,y=zny.

目标
将 ( 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+rl2(xl)=rl2x(r+l).
同理,
y n d c = 2 y ′ − ( t + b ) t − b . y_{ndc} = \frac{2y' - (t+b)}{t-b}. yndc=tb2y(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=rlz2nx(r+l).

这说明了:

  • 透视除法中将引入 1/z(这里 ( z<0 )),实现“近大远小”;
  • 同时有一个常数项 r + l r − l \frac{r+l}{r-l} rlr+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} 配合。 z1wclip=zG=1z1znz1

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=zAxB.

要求:此表达式应与上一步得到的
[
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}. zArl2nz1A=rl2n.
  • 常数项:
    − 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}. Brlr+lB=rlr+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=zCyD.
要求与
y n d c = − 2 n   y / z − ( t + b ) t − b y_{ndc} = \frac{-2n\,y/z - (t+b)}{t-b} yndc=tb2ny/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=tb2n,D=tbt+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=EzF.

要求

  • 当 ( z = -n ) 时, ( z_{ndc} = -1 );
  • 当 ( z = -f ) 时, ( z_{ndc} = 1 )。

分别代入得到两个条件:

  1. ( z = -n ) 时:
    − E − F − n = − E + F n = − 1. -E - \frac{F}{-n} = -E + \frac{F}{n} = -1. EnF=E+nF=1.
  2. ( 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. nFE=1E=nF+1.
  • 从第二个方程:
    F f − E = 1 ⇒ E = F f − 1. \frac{F}{f} - E = 1 \quad \Rightarrow\quad E = \frac{F}{f} - 1. fFE=1E=fF1.

令两式相等:
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=fF1nFfF=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(n1f1)=2F=n1f12=nffn2=fn2nf.
将 ( 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=n2nf/(fn)+1=fn2f+1=fn2f+(fn)=fnf+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=rl2n0000tb2n00rlr+ltbt+bfnf+n100fn2fn0.
这就是在该给定视锥体参数模型下,通过一步步的数学推导得到的透视投影矩阵。

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=rn0000tn0000fnf+n100fn2fn0.
定义近裁剪面上的边界参数为
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)10000fnf+n100fn2fn0.

推导逻辑总结

任务目标:构造矩阵 ( 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=znx,y=zny
  • 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]zndcz=nz=f11

推导步骤
利 用 区 间 线 性 映 射 , 将 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 透视投影矩阵。\\ 线xy[1,1]wclip=zz1xyzzclip=Ez+FEF4×4

小结

为了模拟人眼视觉效果,从人眼视觉特性的经验到几何模型的抽象,最后从数学模型的推导,解释了如何根据透视效应对观察空间坐标进行变换,直到转换为标准化设备坐标系。不得不说,我们还是在追随造物主的脚后跟。

Reference

GAMES101

您可能感兴趣的与本文相关的镜像

🔍 VisionCore Pro | 多模态智能语义分析平台

🔍 VisionCore Pro | 多模态智能语义分析平台

AI应用
PyTorch
CLIP

VisionCore Pro 是一款基于 OpenAI CLIP (Contrastive Language-Image Pre-training) 架构的企业级多模态视觉分析工具。通过先进的深度学习技术,该平台实现了图像与文本之间的深度语义对齐,支持零样本(Zero-shot)图像识别与分类,为企业视觉资产数字化、智能监控及内容审核提供高效的技术支撑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值