Bingo, Computer Graphics & Game Developer

Camera Model

Pinhole Camera Model

本文为在Scratchapixel上学习相机模型时的个人理解。本文不做翻译或搬运工作,只描述个人学习上的理解。

PS: 这一章略过Depth of field(景深)的概念

易混淆概念解读

Camera Parameter Description
Focal Length eye到真实film平面的距离,与光圈一道用于计算FOV/AVO。焦距容易和虚拟相机中的虚拟film平面到eye之间的距离混淆,虚拟film平面一般位于近裁剪面
Camera Aperture 光圈定义了真实相机的物理维度,与焦距一道用于计算FOV/AVO。同时光圈的两个维度也定义了film gate aspect ratio大小。Wiki中列举了大多数常见的film参数。
Clipping Planes 远近裁剪面是虚拟的平面,其位于摄像机的视锥体中,只有在远近裁剪面中的对象才会被渲染。由于画布经常与近裁剪面放置在一起,因此要提防与Focal Length概念混淆。
Image Size 输出图像的尺寸/像素,图像尺寸定义了resolution gate aspect ratio。

由以上的这些概念可以推导计算出下面这些变量的值

Variable Decription
Angle of View 由Focal Length与Film Size(Camera Aperture)计算得到
Canvas/Screen Window 其宽高比例与真实光圈定义得到的film gate aspect ratio一致,可以根据Canvas Size以及光圈快门宽高比例计算得到
Film Gate Aspect Ratio film widthfilm height\frac{\text{film width}}{\text{film height}},这里film为真实相机的胶卷尺寸
Resolution Gate Aspect Ratio image widthimage height\frac{\text{image width}}{\text{image height}},这里image为输出的像素宽高比图像的

光圈(Aperature):本质上,在平红相机模型中,光圈就是暗室上的那个小洞。但是在现实生活中光圈(pin hole camera model)有一系列的问题。

首先,较大的光圈将会产生模糊的图像(在物体上的同一个位置反射的光子有较大概率在背景布上重叠),但可以大大增大进光量减少曝光时间(曝光时间越长,那么拍摄非静止物体就会模糊)。

然而,为了得到一个边缘清晰锐利可辨的图像,减小光圈直径又是必要的,但这也要求曝光时间增加来提高画面亮度,这也提高了画面模糊的概率。

上述概念可由下两动图解释









为了解决曝光时间和边缘锋利的矛盾,人们将平红相机的洞替换为了凸透镜。如图所示,更大的光圈可以带来更佳的进光量,减少曝光时间,同时,他也可以将一定距离内的物体上反射的光重新在背景布上汇聚(不同的焦距将会带来不同的景深)。

景深表示在场景中,可见的最远的物体和最近的物体之间的距离(边缘锋利可辨)。因此平红相机的景深为无限大,因为他只是简单的讲光路重现在背景布上,不存在透镜相机的光路汇集的情况。





视角(Angle of View/AOV, Field of View/FOV):视角与两个参数息息相关,底片尺寸与焦距。也就是说改变两者中的任何一个都会引起视角的变化。






> 相同的焦距不同的底片大小将会导致最终图像的内容变少





同样的若想要在不同的底片大小上获得一致的内容,那么就要适当的调整焦距大小,这也就带来清晰度的影响。因为底片越大,相同的内容展示的也就越清晰。

同时这三个参数都是互相衔接的,也就是只要知道三者中的任何两个,就可以计算出剩下一个参数的大小。当然数字相机拍摄的画面已经不再受到底片的大小的影响了(传感器大小)。

胶片框比例(File Gate Radio)与图像分辨率比例(Resolution Gate Ratio):这两者是很有可能不一致的,那么这时候你使用的相机就是变形镜头。

两者比例不同时,你可能面临画面选择的问题。因此Maya给出两个选项:过扫描(Oversan)和填充(Fill)如下图。





基本未知量推导





相机原点就可以理解为Eye所在位置

tan(θH2)=AB=(Film Aperture Width25.4)2Focal Length.\begin{array}{l}
\tan({\theta_H \over 2}) & = & {A \over B} \\& = & \color{red}{\dfrac {\dfrac { (\text{Film Aperture Width} * 25.4) } { 2 } } { \text{Focal Length} }}.
\end{array}

θ\theta是FOV(视角/视野),可以通过arctan(AB)arctan(\frac{A}{B})求解显示得到。

CanvasSizeCanvas Size也就是所谓的近裁剪面,因此近裁剪面的位置不同,画布的大小也会随之改变。当近裁剪面位于z=0z = 0位置时,相应计算而来的CanvasSize=0Canvas Size = 0

tan(θH2)=AB=Canvas Width2Znear,Canvas Width2=tan(θH2)Znear,Canvas Width=2tan(θH2)Znear.\begin{array}{l}
\tan({\theta_H \over 2}) = {A \over B} =
\dfrac{\dfrac{\text{Canvas Width} } { 2 } } { Z_{near} }, \\
\dfrac{\text{Canvas Width} } { 2 } = \tan({\theta_H \over 2}) Z_{near},\\
\text{Canvas Width}= 2
\color{red}{\tan({\theta_H \over 2})} * Z_{near}.
\end{array}

只要得到Canvas Size就可以通过aspect ratio以及简单的坐标变换得到[left, top, right, bottom]各自的值。

right=(Film Aperture Width25.4)2Focal LengthZnear.\begin{array}{l}
\text{right} = \color{red}{\dfrac {\dfrac { (\text{Film Aperture Width} 25.4) } { 2 } } { \text{Focal Length} }} Z_{near}.
\end{array}

top=(Film Aperture Height25.4)2Focal LengthZnear.\text{top} = \color{red}{\dfrac {\dfrac { (\text{Film Aperture Height} 25.4) } { 2 } } { \text{Focal Length} }} Z_{near}.


PBRT中的相机坐标系变换

  • Camera Space: 以相机的origin作为坐标轴的中心,z轴作为视线方向,y轴作为抬头方向(up direction),用于判断一个物体是否对于相机本身是否可见会非常的方便。
  • Screen Space: 屏幕空间本身是在图像面板上定义出的,尽管被称之为屏幕空间,但z值依然是有意义的(相关于远近裁剪面,其范围为[0,1][0, 1])。
  • Normalized device coordinate(NDC) space : 这是一个真实图像被渲染的坐标系,xy的范围都在[0,1][0, 1]之间,z值和屏幕空间坐标系一样有效,本质上也就是屏幕空间线性转换而来。
  • Raster Space: 本质上他和NDC Space并没有太大的差别,唯独的区别就是他的xy范围在[0,xResolution][0, xResolution][0,yResolution][0, yResolution]