计算机图形学之投影
计算机图形学-投影
一、前言
在计算机图形学中,NDC(Normalized Device Coordinates) 是一种标准化的坐标表示方式,通常用于 3D 图形渲染管线中的投影变换和深度测试。
NDC坐标范围通常归一化到固定的区间。X和Y轴范围: [ − 1 , 1 ] [-1,1] [−1,1],表示屏幕的水平和垂直方向。Z轴范围通常是 [ − 1 , 1 ] [-1,1] [−1,1](OpenGL)或 [ 0 , 1 ] [0,1] [0,1](DirectX),表示深度信息。
NDC 在计算机视觉中作用:
- 适应不同分辨率和设备
- 透视除法,实现透视投影
- 方便深度计算和裁剪
- 方便视口映射到屏幕坐标
二、概念
个人理解,投影就是将可视空间内的模型转化为NDC坐标系的过程,因此涉及到平移、缩放变换。
基本变换过程如下图所示:
如下图所示,透视投影还多了一个步骤,要先“透视除法”(使得物体看起来近大远小),然后再按上面的步骤处理。
三、正交投影
下面推导过程中,坐标系采用右手系,相机位于原点,看向 -Z 方向。
3.1. 正交投影定义
在右手坐标系*中,设一个可视空间(视锥):
- 左、右边界: ( l , r ) ( l, r ) (l,r)
- 下、上边界: ( b , t ) ( b, t ) (b,t)
- 近平面和远平面: ( z near , z far ) ( z_{\text{near}}, z_{\text{far}} ) (znear,zfar)(注意:在右手系中, ( z near ) ( z_{\text{near}} ) (znear) 和 ( z far ) ( z_{\text{far}} ) (zfar) 都是负值)
将视锥内模型坐标转换为标准化设备坐标(NDC)。
3.2. 推导
将 [ l , r ] × [ b , t ] × [ z near , z far ] [l, r] \times [b, t] \times [z_{\text{near}}, z_{\text{far}}] [l,r]×[b,t]×[znear,zfar]变换到 [ − 1 , 1 ] [-1,1] [−1,1]的标准坐标系。
-
X 轴变换
x ′ = 2 x r − l − r + l r − l x' = \frac{2x}{r - l} - \frac{r + l}{r - l} x′=r−l2x−r−lr+l -
Y 轴变换
y ′ = 2 y t − b − t + b t − b y' = \frac{2y}{t - b} - \frac{t + b}{t - b} y′=t−b2y−t−bt+b -
Z 轴变换
z ′ = 2 z z near − z far − z near + z far z near − z far z' = \frac{2z}{z_{\text{near}} - z_{\text{far}}} - \frac{z_{\text{near}} + z_{\text{far}}}{z_{\text{near}} - z_{\text{far}}} z′=znear−zfar2z−znear−zfarznear+zfar
最终正交投影矩阵:
P ortho = [ 2 r − l 0 0 − r + l r − l 0 2 t − b 0 − t + b t − b 0 0 2 z near − z far − z near + z far z near − z far 0 0 0 1 ] P_{\text{ortho}} = \begin{bmatrix} \frac{2}{r - l} & 0 & 0 & -\frac{r + l}{r - l} \\ 0 & \frac{2}{t - b} & 0 & -\frac{t + b}{t - b} \\ 0 & 0 & \frac{2}{z_{\text{near}} - z_{\text{far}}} & -\frac{z_{\text{near}} + z_{\text{far}}}{z_{\text{near}} - z_{\text{far}}} \\ 0 & 0 & 0 & 1 \end{bmatrix} Portho=
r−l20000t−b20000znear−zfar20−r−lr+l−t−bt+b−znear−zfarznear+zfar1
四、透视投影
4.1、 透视投影定义
在右手坐标系*中,设一个可视空间(锥体):
- 视场角(Field of View,FOV): ( θ ) ( \theta ) (θ)
- 纵横比(Aspect Ratio): ( a = width height ) ( a = \frac{\text{width}}{\text{height}} ) (a=heightwidth)
- 近平面和远平面: ( z near , z far ) ( z_{\text{near}}, z_{\text{far}} ) (znear,zfar)
透视除法(根据远近,按规则缩放)。
变换成标准化设备坐标(NDC)中的立方体。
4.2、 透视投影矩阵推导
- X 轴和 Y 轴变换
近平面高度:
h = 2 ⋅ z near ⋅ tan ( θ / 2 ) h = 2 \cdot z_{\text{near}} \cdot \tan(\theta/2) h=2⋅znear⋅tan(θ/2)
近平面宽度:
w = a ⋅ h w = a \cdot h w=a⋅h
因此,X 轴和 Y 轴的变换为:
x ′ = 2 x w = x z near tan ( θ / 2 ) x' = \frac{2x}{w} = \frac{x}{z_{\text{near}} \tan(\theta/2)} x′=w2x=zneartan(θ/2)x
y ′ = 2 y h = y z near tan ( θ / 2 ) y' = \frac{2y}{h} = \frac{y}{z_{\text{near}} \tan(\theta/2)} y′=h2y=zneartan(θ/2)y - Z 轴变换
Z 轴的变换需要将 ( [ z near , z far ] ) ([z_{\text{near}}, z_{\text{far}}]) ([znear,zfar]) 映射到 ( [ − 1 , 1 ] ) ([-1,1]) ([−1,1]):
z ′ = z near + z far z near − z far + 2 z near z far z near − z far ⋅ 1 z z' = \frac{z_{\text{near}} + z_{\text{far}}}{z_{\text{near}} - z_{\text{far}}} + \frac{2z_{\text{near}} z_{\text{far}}}{z_{\text{near}} - z_{\text{far}}} \cdot \frac{1}{z} z′=znear−zfarznear+zfar+znear−zfar2znearzfar⋅z1
最终透视投影矩阵:
P persp = [ 1 a tan ( θ / 2 ) 0 0 0 0 1 tan ( θ / 2 ) 0 0 0 0 z near + z far z near − z far 2 z near z far z near − z far 0 0 − 1 0 ] P_{\text{persp}} = \begin{bmatrix} \frac{1}{a \tan(\theta/2)} & 0 & 0 & 0 \\ 0 & \frac{1}{\tan(\theta/2)} & 0 & 0 \\ 0 & 0 & \frac{z_{\text{near}} + z_{\text{far}}}{z_{\text{near}} - z_{\text{far}}} & \frac{2 z_{\text{near}} z_{\text{far}}}{z_{\text{near}} - z_{\text{far}}} \\ 0 & 0 & -1 & 0 \end{bmatrix} Ppersp=
atan(θ/2)10000tan(θ/2)10000znear−zfarznear+zfar−100znear−zfar2znearzfar0
透视投影矩阵引入了w 分量,确保透视除法能够正确执行,使远处物体变小。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)