计算机图形学中MVP变换的理论推导

发布于:2025-05-18 ⋅ 阅读:(17) ⋅ 点赞:(0)

计算机图形学中MVP变换的理论推导

课程地址:Computing the Pixel Coordinates of a 3D Point

知识铺垫:矩阵的真实内涵

矩阵的每一列/行(左乘和右乘的区别)代表了新坐标系的基向量在原基向量构成的坐标系中的坐标,这些新基向量(单位轴)构成新坐标系(用矩阵表示)

如果此时用这个矩阵乘一个向量,则向量中每个元素的含义是新坐标系中每个轴的对应分量,三个轴分量线性组合得到一个新坐标,这个坐标就是用这个新坐标系描述的
例如:矩阵A乘以向量d得到一个新向量f,矩阵A中的每一列代表用原坐标系(标准正交基)中的新向量作为新坐标系的基向量,向量d表示新坐标系中三个轴的对应分量,这些分量线性组合得到新向量f,整个过程可以描述为矩阵A将向量d变换到向量f



总之,矩阵的每一列或行元素代表在原坐标系 ( 1 , 0 , 0 ) 、 ( 0 , 1 , 0 ) 、 ( 0 , 0 , 1 ) (1,0,0)、(0,1,0)、(0,0,1) (1,0,0)(0,1,0)(0,0,1)中找三个正交向量作为新基向量(坐标系的轴),之后矩阵乘别的向量就是用这个新基向量线性组合得到新向量

世界坐标系

世界坐标系描述了一切,包括相机的位置、物体的顶点等等,为了能够让我们看见世界坐标系中的物体,我们就需要将世界坐标系中的顶点转到相机视角下,这样才能让我们看到某个视角下的物体
我们假设世界坐标系为identity matrix,即
( 1 , 0 , 0 0 , 1 , 0 0 , 0 , 1 ) \begin{pmatrix} 1,0,0\\ 0,1,0\\ 0,0,1 \end{pmatrix} 1,0,00,1,00,0,1
我们可以定义一个模型,比如这里的立方体,我可以假想一个坐标系(原点(0,0,0)+三个互相垂直的轴),我可以在这个假想的坐标系中直接写出立方体的每个顶点的坐标
p 1 = [ − 0.5 , − 0.5 , 0.5 ] p 2 = [ − 0.5 , 0.5 , 0.5 ] p 3 = [ − 0.5 , 0.5 , − 0.5 ]   … … p_1=[-0.5, -0.5, 0.5]\\ p_2=[-0.5, 0.5, 0.5]\\ p_3=[-0.5, 0.5, -0.5]\\ ~\\ …… p1=[0.5,0.5,0.5]p2=[0.5,0.5,0.5]p3=[0.5,0.5,0.5] ……
其实这些坐标都是我们在想象的一个空间坐标系(并非真的用代码实现了一个坐标系)内描述的这些顶点,该坐标系原点为 [ 0 , 0 , 0 ] [0,0,0] [0,0,0],三个轴互相垂直

重点!!!务必理解,我们并非明确地变换坐标系;而是平移、缩放和旋转对象(顶点)完成所谓坐标系的转换。一个 4x4 矩阵表示这些变换,并且该矩阵可以被视为一个坐标系也就是说我们对这些顶点乘以一个变换矩阵就相当于换了一个坐标系

世界坐标系到相机坐标系的变换(相机外参矩阵)


相机外参矩阵的结构


每个相机的初始位置其实是与我们想象的“世界坐标系”重合的,我们需要将这些定义在世界坐标系的顶点乘以一个矩阵(本质是变换,看作一个新坐标系)转换到用其他坐标系表示,这个矩阵就是world_to_camera矩阵(相机外参矩阵),这个矩阵的构成:

齐次坐标:在三维空间中,为了能用矩阵同时表示旋转和平移,引入四维齐次坐标,将三维点 ( x , y , z ) (x,y,z) (x,y,z)表示为 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1)
矩阵结构:4×4 矩阵可分为两部分:
左上 3×3 子矩阵 𝑅:表示旋转,用于对齐世界坐标系的轴到相机坐标系的轴(即相机的方向基向量)
右上 3×1 向量 𝑡:表示平移,用于将世界原点“搬到”相机原点的位置(注意是逆变换,所以常带负号)


将旋转和平移整合到一个矩阵中就是这里所说的相机外参矩阵M

相机外参矩阵中的平移向量

相机外参矩阵中的旋转矩阵

知识铺垫:
旋转一共三个自由度,绕 x , y , z x,y,z x,y,z旋转,如果分别绕x、y、z轴旋转可以得到三个方向上的旋转矩阵 R x 、 R y 、 R z R_x、R_y、R_z RxRyRz,而相机外参矩阵中的旋转矩阵是这三者的乘积
R = R x ∗ R y ∗ R z R=R_x*R_y*R_z R=RxRyRz
下图来自:TEK5030 - Computer Vision

推导 R x 、 R y 、 R z R_x、R_y、R_z RxRyRz,顶点 P w P_w Pw原先用坐标系 X w Y w Z w X_wY_wZ_w XwYwZw表示,现在用新坐标系 X c Y c Z c X_cY_cZ_c XcYcZc表示,也就是说顶点 P w P_w Pw原先用坐标系 X w Y w Z w X_wY_wZ_w XwYwZw的三个基向量线性组合而成,现在想要用新坐标系 X c Y c Z c X_cY_cZ_c XcYcZc基向量线性组合表示顶点 P w P_w Pw重新命名为 P c P_c Pc
下图来自:计算机视觉之— 相机内参与外参

相机外参矩阵中的旋转矩阵是三个单纯绕轴旋转矩阵的乘积
R = R x ∗ R y ∗ R z R=R_x*R_y*R_z R=RxRyRz
先对世界坐标系描述的顶点做旋转R,之后再进行平移 t 得到了用新坐标系(相机坐标系)描述的顶点

向量与点的区别
(1)向量(如基向量)只关心起点到终点的方向与长度,通常被视为从原点出发的箭头;它们本身不附带“起点位置”的信息。

(2)点 才有“坐标位置”,平移才会改变它。

旋转(R):将世界坐标系的向量或点围绕原点旋转到相机坐标系方向。
平移(t):将旋转后的点平移到相机中心位置。
向量 只经过旋转,不经历步骤 平移;
而 点 则经历旋转+平移,最终同时拥有新的方向和位置

世界坐标系与相机坐标系互转的应用场景

(1)从相机坐标系转到世界坐标系(相机外参矩阵的逆c2w)应用场景
在多视图立体重建或 SLAM(同步定位与建图)等应用中,每台相机先以其自身坐标系表示重建出的三维点,为了融合这些不同相机获得的数据,需要将它们变换到同一世界坐标系。
将来自多台相机或多时刻的点统一到全球参照系,用于点云拼接、稠密建图和地图创建

三维模型点未知,仅知道模型在相机坐标系下点的坐标(模型的一部分点),这时候我们想要得到三维模型的所有点,就需要把每帧相机坐标系下的点都统一转换到世界坐标系下

P w = P c ∗ M c 2 w P_w=P_c*M_{c2w} Pw=PcMc2w
P w . x = P c . x ∗ M 00 + P c . y ∗ M 10 + P c . z ∗ M 20 + M 30   P w . y = P c . x ∗ M 01 + P c . y ∗ M 11 + P c . z ∗ M 21 + M 31   P w . z = P c . x ∗ M 02 + P c . y ∗ M 12 + P c . z ∗ M 22 + M 32 P_w.x=P_c.x*M_{00}+P_c.y*M_{10}+P_c.z*M_{20}+M_{30}\\ ~\\ P_w.y=P_c.x*M_{01}+P_c.y*M_{11}+P_c.z*M_{21}+M_{31}\\ ~\\ P_w.z=P_c.x*M_{02}+P_c.y*M_{12}+P_c.z*M_{22}+M_{32} Pw.x=Pc.xM00+Pc.yM10+Pc.zM20+M30 Pw.y=Pc.xM01+Pc.yM11+Pc.zM21+M31 Pw.z=Pc.xM02+Pc.yM12+Pc.zM22+M32

(2)从世界坐标系转到相机坐标系(相机外参矩阵w2c)应用场景

渲染、投影或相机标定(Camera Calibration)过程中,需要将已知的三维模型点映射到相机坐标系下,以便进一步投影到图像平面

M w 2 c = M c 2 w − 1   P c = P w ∗ M w 2 c M_{w2c}=M_{c2w}^{-1}\\ ~\\ P_c=P_w*M_{w2c} Mw2c=Mc2w1 Pc=PwMw2c
P c . x = P w . x ∗ M 00 + P w . y ∗ M 10 + P w . z ∗ M 20 + M 30   P c . y = P w . x ∗ M 01 + P w . y ∗ M 11 + P w . z ∗ M 21 + M 31   P c . z = P w . x ∗ M 02 + P w . y ∗ M 12 + P w . z ∗ M 22 + M 32 P_c.x=P_w.x*M_{00}+P_w.y*M_{10}+P_w.z*M_{20}+M_{30}\\ ~\\ P_c.y=P_w.x*M_{01}+P_w.y*M_{11}+P_w.z*M_{21}+M_{31}\\ ~\\ P_c.z=P_w.x*M_{02}+P_w.y*M_{12}+P_w.z*M_{22}+M_{32} Pc.x=Pw.xM00+Pw.yM10+Pw.zM20+M30 Pc.y=Pw.xM01+Pw.yM11+Pw.zM21+M31 Pc.z=Pw.xM02+Pw.yM12+Pw.zM22+M32

相机空间到裁剪空间(投影变换矩阵)


投影变换矩阵 = 透视投影 + 正交投影 投影变换矩阵=透视投影+正交投影 投影变换矩阵=透视投影+正交投影

在 OpenGL/DirectX 等渲染管线中,投影变换矩阵(GL_PROJECTION)把相机空间(View Space)顶点变换到裁剪空间(Clip Space)

( x c , y c , z c , w c ) − > ( x c w c , y c w c , z c w c ) (x_c,y_c,z_c,w_c)->(\frac{x_c}{w_c},\frac{y_c}{w_c},\frac{z_c}{w_c}) (xc,yc,zc,wc)>(wcxc,wcyc,wczc)

1.应用视椎体裁剪(Frustum Clipping)参数(近裁剪面、远裁剪面、左右上下边界)
2.内置宽高比(Aspect Ratio)与视场角(FOV)
3.保留深度信息以便后续深度测试

投影变换矩阵 M perp M_{\text{perp}} Mperp的推导过程:

相机视锥体如下图所示

透视投影矩阵推导


利用变换前后的不变关系求解未知部分



由以上两个等式关系求解方程组

由此得到透视投影(视锥体压缩)矩阵 M perp->ortho M_{\text{perp->ortho}} Mperp->ortho

正交投影矩阵推导

接下来推导正交投影矩阵(将长方体压缩边长为2的正方体)
即将长方体盒子 [ l , r ] × [ b , t ] × [ n , f ] [l,r]×[b,t]×[n,f] [l,r]×[b,t]×[n,f]压缩到标准立方体 [ − 1 , 1 ] 3 [-1,1]^3 [1,1]3

第一步:把视锥盒子平移,让视锥盒子(长方体)中心对齐到相机坐标系原点
注意:视锥盒子(长方体)做了平移


第二步:把长方体盒子压缩到标准立方体
如果不把长方体盒子中心移动到相机坐标系原点而直接压缩就不会得到标准立方体
注意z轴反向了


由此我们得到正交投影矩阵 M ortho M_{\text{ortho}} Mortho


视锥体压缩为长方体,为什么要将长方体中心移动到相机坐标系原点?长方体变为标准立方体,为什么要将z轴反向?
这样做能保证线性变换中心对齐、方向一致,最终以简洁统一的方式进行裁剪与插值。



视场角的作用
用于构建透视投影矩阵
在透视投影中,Fovy 和 Fovx 是计算投影矩阵的重要参数,具体过程如下:
1.假设已知近裁剪平面距离为 n,垂直视场角为 Fovy,则近裁剪平面的垂直高度 h = 2 n t a n ( F o v y 2 ) h=2n tan(\frac{Fovy}{2}) h=2ntan(2Fovy)

2.结合画面的宽高比 a s p e c t = w h aspect=\frac{w}{h} aspect=hw(w为水平宽度),可以计算出近裁面的水平宽度 w = a s p e c t × h w=aspect×h w=aspect×h

3.这些尺寸参数(w、h、n)进一步用于推导透视投影矩阵的具体元素,确保三维场景按正确的透视关系(近大远小)映射到二维屏幕。

同理,若给定水平视场角Fovx和近裁面距离n,可计算出水平宽度 w = 2 n t a n ( F o v x 2 ) w=2ntan(\frac{Fovx}{2}) w=2ntan(2Fovx),再结合宽高比得到垂直高度 h = w a s p e c t h=\frac{w}{aspect} h=aspectw




请添加图片描述

相机坐标系中齐次坐标经过投影变换矩阵转换到齐次裁剪空间

齐次裁剪空间到NDC空间

裁剪操作(齐次裁剪空间即单位立方体中执行)



透视除法

透视除法是计算机图形学中实现真实感透视效果的核心机制,通过将顶点坐标除以其深度信息(存储在 w 分量中),实现了近大远小的视觉效果,并将坐标统一到标准化设备空间,为后续的视口变换和光栅化提供了基础。这一步骤是透视投影矩阵与最终屏幕显示之间的桥梁,直接决定了三维场景在二维屏幕上的呈现效果。




NDC空间到屏幕空间(视口变换)

在计算机图形学中,视口变换(Viewport Transformation) 是图形管线的最后阶段,负责将标准化设备坐标(NDC)转换为屏幕上的像素坐标。这一步骤决定了三维场景如何最终显示在二维显示器上
下图来自:计算机图形管线 13.视口变换




网站公告

今日签到

点亮在社区的每一天
去签到