Note. 我最近在重构Atrc,没有再采用本文对摄像机的建模方法,原因参见此文

原文

最近在试着实现light tracing算法,需要手推各种摄像机模型的measurement function,打算把结果总结在这里。这篇文章内容是比较trivial的,只是需要把它们完全理清楚才好实现。

本文一律使用右手坐标系,且视轴正方向为垂直向上的方向。此外,本文的讨论并不立足于实时渲染,因此不会涉及到透视投影变换、齐次坐标系等话题。

所有内容的实现均可在我的GitHub上找到。

Pinhole Camera

顾名思义,小孔摄像机模型中,光只能通过一个理论上大小可以忽略的孔洞进入摄像机内部,并命中成像平面上的感光元器件。我们假设这个布满感光元器件的接收设备是一个矩形,且在世界坐标系中宽度为,高度为,并以它的几何中心为原点,在该平面上建立一个简单的二维坐标系,用来表示元器件平面上的位置。这一坐标系被称为感光元器件坐标系,记作,其有效的坐标取值范围是(注意像素下标虽然是整数,但像素坐标系中的点未必是):

元器件所接收到的信号最后要转换为一副二维图像上的颜色。设图像宽高分别为像素和像素,以左上角为原点,则有效的像素坐标范围为。我们把这个坐标系称为像素坐标系,记作间的关系是非常明显的:

除了间的转换,我们还需要把中的坐标转换为世界坐标系中的射线的能力。为了简化问题,我们先考虑一个本地坐标系中的情况:摄像机的小孔位于原点,正面朝向方向,小孔和元器件平面的距离为,则给定中的坐标中的射线原点和方向可以表示为:

最后,我们引入图形学中非常常见的本地坐标系与世界坐标系间的变换。假设摄像机可以先被旋转,再被平移。令表示摄像机旋转后的正面朝向,中的平面上任意一个不平行于的单位向量被变换到中的结果,则中的中分别对应:

由于旋转是个线性变换,所以可以用一个矩阵来表示,且可以被构造为:

再加上一个平移偏移量,我们就得到了间的转换方法:

其中表示方向,表示位置;表示的其实是,因为旋转矩阵是单位正交矩阵,所以可以通过转置来快速求它的逆。间的转换方法适用于后文中所有的摄像机模型。

Measurement Function

在讨论基于光线追踪的真实感渲染技术时,我们总是说:只要对任意点和方向能够求解出,就算是大功告成了。但是仔细一想:图像上的每个像素实际上都对应了场景中的一小块区域,和该像素的颜色间是怎么建立起联系的呢?

设像素在场景中对应的元器件区域为,对每个和方向处的元器件对来自的光都会产生一定的响应,并影响到最终我们观察到的的颜色。设该响应的强度可以用函数表示,那么像素的颜色为:

以小孔摄像机为例,如果我们简单地认为像素的颜色为在意义上通过小孔击中的所有radiance的平均值,那么为:

其中表示将向量归一化。这个式子的意思是对上的每个点,只有从小孔所在的方向来的光可以对的颜色作出贡献。

把这一节和上一节的内容结合起来,就可以实现小孔摄像机模型了。随便画个图看看:

其实它和图形学中常用的透视投影摄像机是等价的。此外,小孔摄像机拍摄的图像上下左右都颠倒了,为了方便展示,我把它翻转了回来。下文中展示的图像也做了类似的必要处理。

Thin Lens Camera

理想的小孔摄像机在现实中是不存在的,因为光没法通过一个没有大小的孔洞来照亮整个传感元器件平面。本节讨论一种简化的凸透镜摄像机模型,它假设透镜的厚度可以被忽略。

考虑将一个薄凸透镜放置在数轴的原点处,一束平行光沿着方向击中透镜,它们将汇聚于轴上的一点,该点和原点间的距离称为薄凸透镜的焦距,记作。对位于距原点)的物体,它所发出的光穿过凸透镜后也会汇聚于一点,设该汇聚点距原点为),则满足以下关系:

也就是说,给定元器件平面和透镜的距离,我们可以通过上式计算出来。在三维空间中,这样一个和透镜中心距离为的平面被称为焦平面,位于焦平面上的物体上的每个点所发出的光都将汇聚到元器件平面上的一点,而不在焦平面上的点所发出的光在穿过透镜后则会汇聚到元器件平面上的一个圆内,若该圆的大小超过了一个像素,那么我们将观察到模糊的物体,也就是所谓的景深效果。

简单起见,给定元器件平面上的点,我们认为薄凸透镜上的每一点都会对所响应的亮度作出同等的贡献,而每个也都对像素的颜色作出同等的贡献。此外,我们也希望能够满足归一化约束:

为此,我们首先把改写到上,其中是薄凸透镜在场景中对应的区域:

由于每个都对的颜色作出同等的贡献,因而:

表示某个和无关的数。代入归一化条件后我们可以得到:

这就成功解出了

容易验证以下三个关系的正确性:

其中是元器件平面和凸透镜间的距离,是凸透镜半径。把这三个式子代入上面的表达式中,再把换成与之相等的摄像机朝向,就得到了:

凸透镜半径取得越大,不在焦平面上的物体显得越模糊。下图的元器件平面宽度为2m,距离透镜1m,透镜半径为20cm(这参数已经超出我对摄像机的认知了,不过请不要在意这些细节),可以看到景深效果非常夸张:

Environment Camera

环境摄像机不是现实中能有的摄像机——它捕获四面八方的光线,将上下左右前后所有的景物都记录到一幅图像上。对任意一个入射方向,设是它沿垂直轴的旋转角度,是与水平面的夹角。令:

并将作为纹理坐标(原点在图像左上角),就能获得一幅描述了环境光照的图像。

环境摄像机的感光元器件就比较邪门儿了,它是一个球。我们暂且把这个球放置在原点,用表示其半径,则对应球面上的点为:

这个点上的感光器件只对一个方向来的光有响应,那就是来自的光。于是,给定像素坐标系中的点,其对应的射线是:

设像素中的范围为,则它所对应的元器件区域为:

我们假设上的每个点对的颜色有相同的贡献量,于是:

解得:

随便画个图看看:

Measurement Equation on Film

对环境摄像机的探究就算是大功告成了吗?其实不然。在之前讨论的两个摄像机模型中,如果我们在像素中均匀采样像素平面上的点,那么这也等价于在上均匀采样,进而可以通过均匀采样和求均值来估计。而在环境摄像机模型中,像素上的均匀分布并不等价于上的均匀分布,因而在中,像素范围内的各点对的贡献是不等的。我们把measurement equation中的换到上试试:

其中,中某个像素的左上角,则是的右下角;是将中的点转换为上的点的函数,则是衡量的重要程度的函数,从计算的角度看比更为直接。

根据的定义,,因此如果我们在内均匀采样,那么概率密度函数将是值为1的常函数,这就给出了用蒙特卡路方法估算的公式:

其中是采样数,分别是第次采样得到的中的点和入射方向,是在选中了后选中的条件概率密度。

接下来我们来尝试导出之间的关系。设可以被写作参数曲面中像素上的点间构成双射,且具有一大坨我在这里不想写的良好数学性质,那么我们可以把对的积分换到的参数空间上:

所满足的方程在形式上和上式非常相似:

于是满足:

其中上的对应点。我们把小孔摄像机的代入上式,就能得到它的

对薄凸透镜模型也有类似的结论:

对环境摄像机,注意到:

于是:

若取摄像机球体半径为1(这与最后的结论无关),那么:

其中对应的的范围边界。从上式可以解得: