在计算机视觉中,相机模型通常涉及到的坐标系有世界、相机、归一化平面、像素坐标系等。然而,在图形学里面,在NeRF、3D Gaussian Splatting等三维重建方法,在OpenGL中,会遇到一个NDC(Normalized Device Coordinates,归一化设备坐标)坐标系。这里,将仔细地讲解各个坐标系,以及推导公式。
1、世界坐标系
这个坐标系不做过多的介绍,可前往针孔相机模型推导这里学习。在世界坐标系中,假设一个任意的点为:,这里用齐次坐标进行表达。
2、相机坐标系
这个坐标系也不做过多的介绍, 可前往针孔相机模型推导这里学习。在相机坐标系中,任意一个点为:。从世界坐标系转换到相机坐标系,需要一个外参矩阵,也就是旋转矩阵R和平移矩阵T。用公式表达为:
需要注意的是,在上式中用的不是齐次表达。
3、裁剪和NDC坐标系
这两个坐标系可以一起讲,只相差了一个齐次的除法。例如,在裁剪坐标系下,一个点为,其中
为齐次坐标表达的第4维,即齐次尺度因子,作为透视除法的分母,控制近大远小。通常,
的大小为深度值,也即
。
从裁剪坐标系转到NDC坐标系,非常的简单,公式如下:
则NDC坐标系下一个点的齐次表达为 。
从上述表达可以看到,裁剪坐标系和NDC坐标系其实是一回事,就差了一个透视除法。
3.1 相机到裁剪坐标系推导
接下来,最为重要的是,我怎么将相机坐标系转换到裁剪坐标系。两个坐标系之间的变换,通常是使用一个投影矩阵P,也就是:
核心问题,就在于,如何推导获得这个P矩阵(4*4的矩阵)。在图1中,用AI生成了一个图,详细地表达了上面我推导的公式和关系。

图1:相机坐标系到裁剪坐标系的变换示意图(AI生成)
在裁剪坐标系中,有两个很重要的概念,就是近平面和远平面。相机理论上可以看到从相机前方一直延伸到无穷远的区域,但是图形渲染必须要明确,视椎体中哪些点保留,哪些点丢弃。因此,定义了一个近平面和远平面,只有处于这两个平面之间的区域,才会保留并投影。
定义近平面深度值为,远平面深度值为
。将
投影到近平面上,根据相似三角形,公式为:
在近平面上,为了将坐标值归一化到-1,1之间,需要除以近平面投影面的宽度和高度
。
相机的视场角大小fovX和fovY是已知的,则可以根据相机视场角大小推导出和
的大小,推导的过程如下图所示(AI生成):

在获得和
之后,对
和
的值做一个归一化,就可得到ndc坐标系中的坐标值,公式如下:
如果,我们令,那么上式表达就可以转为一个矩阵表达P,并用齐次坐标进行表达,整理后如下:
上式中,左边是裁剪坐标系,只需要都除以一个就变成了NDC坐标系。在上式中,投影矩阵P中还存在两个未知数,就是A和B。接下来,推到获取A和B。
除以,就可以得到NDC坐标,因为
的,因此公式如下:
当近平面的点代入的时候,;远平面的点代入的时候,
,根据这个约束,可得到方程:
通过上面两个方程,就可以直接解出A和B的值,分别为:
到这里,就获得了完成的投影矩阵P,通过该矩阵,可以先将相机坐标系转到裁剪坐标系,再除以一个齐次因子,就转到了NDC坐标系。