三维投影

                     

贡献者: addis; ACertainUser

  • 本文存在未完成的内容。

  1当我们在平面上画三维物体时,我们需要某种投影算法把物体上的每个点对应到平面上的一点。以下介绍两种常用的方法,一种是平行投影(parallel projection),另一种是透视投影(perspective projection)

1. 平行投影

   顾名思义,平行投影是指在空间中指定一个方向(如图未完成),将三维物体上的每一点沿着该方向投影到与该方向垂直的平面上。工程制图中的正视图,侧视图等都属于平行投影。这种投影的特点是,空间中的任意两条平行线的投影仍然是平行线。平行投影是线性的,即一个线段若伸长若干倍,那么它的投影也会按照同样的比例伸长。

2. 透视投影

   当人眼或相机观察一个三维物体时,使用的是透视投影。

图
图 1:透视投影示意图

   我们在平面后方取一个固定点 $F$ 称为焦点,要把物体上任意一点 $P$ 投影到屏幕(对于眼睛而言,这是我们 “看到的图像”)上,先作直线 $PF$,该直线与平面的交点 $P'$ 就是投影后的点。

图
图 2:“近大远小”:尽管两个正方体事实上是一样大的,但由于左侧的正方体离屏幕更远,因此看起来更小

   透视投影不是线性的,且会使物体的投影呈现 “近大远小”,但仍可以保证直线的投影仍然为直线。由于人眼适应的是透视投影,因此运用透视投影作画,会让画面更显真实。

   为什么透视投影要这样定义?我们先思考一种非常简单的相机,即小孔成像相机。根据光的直线传播,物体上的某点发出的(或反射的)光线只有经过小孔才能投影到孔后面的平面。如果按照这个模型,我们在计算透视投影时应该把焦点定义在屏幕之前,然而这么做有一个缺点就是投影后平面上的像是倒像。所以为了方便起见,我们保持焦点不变,但是把屏幕平移到焦点之前(焦距也不变),容易看出这样做的唯一改变就是把倒像变为正像,即点 $P'$ 的两个平面坐标分别取相反数。

   如果我们将相机上的小孔改为焦距为 $f$ 的小凸透镜,并假设物距远大于焦距,那么根据成像公式,凸透镜和平面(即底片)的距离就是焦距 $f$。根据凸透镜成像原理,物体一点在底片上的像仍然会过凸透镜的中点,所以使用凸透镜的相机和使用小孔成像的相机得到的投影是相同的。至于人眼,人眼成像的原理和相机基本一致,虽然视网膜并不是一个平面,得到的成像是扭曲的,但大脑在处理图象是会自动纠正这种扭曲(例如我们看到的直线仍然是直的)。

3. 计算方法

   无论是哪种投影,我们通常建立两个坐标系,一个是世界坐标系(world frame)} $S$,一个是相机坐标系(camera frame) $S'$。一个基本的问题就是将一个系里面的坐标变换到另一个系中的坐标。这可以通过空间旋转矩阵,再加上一个平移完成(平移的矢量是两个坐标系原点之间的位移)。

图
图 3:转换坐标系的方法相当于平移并旋转所有的顶点

   把所有要投影的点 $P_i$($i = 1, \dots, N$)的在世界系中的坐标(假设已知)记为一个 3 行 $N$ 列矩阵,矩阵的第 $i$ 列就是列矢量 $ \boldsymbol{\mathbf{P}} _i = (x_i, y_i, z_i) ^{\mathrm{T}} $。将 3 乘 3 的旋转矩阵左乘该矩阵,再给每行加上常数进行平移即可。完成后,我们就得到了相机系中的坐标矩阵,每一列是 $ \boldsymbol{\mathbf{P}} _i' = (x_i', y_i', z_i') ^{\mathrm{T}} $。

平行投影

   当我们做平行投影时,可以令相机系的 $x$-$y$ 平面为投影平面,投影方向为 $- \hat{\boldsymbol{\mathbf{z}}} $。即 $(x_i', y_i', z_i')$ 投影后为 $(x_i', y_i')$。

透视投影

   当我们做透视投影时,可以令原点为焦点,$(0, 0, f)$ 为平面的中点,平面与 $z$ 轴垂直。相机系中的某点 $(x_i', y_i', z_i')$ 投影后变为 $(x_i' f/z_i', y_i' f/z_i')$,即每个分量乘以 $f/z_i'$,使得 $z$ 分量等于 $f$。

图
图 4:透视投影 ABC

   或者更讲人话的,如 图 4 所示,我们依据计算机图形学的惯例2,以焦点为原点,$-z$ 方向垂直指入屏幕,建立坐标系。

   显而易见,透视投影其实是一个简单的相似三角形问题。假设物体的一个顶点 $P$ 的坐标为 $(x,y,z)$,它在屏幕上对应点 $P'$ 的坐标为 $(x',y')$3。先观察 $y$ 坐标,显然: $$\frac{y}{z}=\frac{y'}{n}~,$$ 即 $$y'=\frac{n}{z}y~.$$ 同理 $$x'=\frac{n}{z}x~.$$

   总结一下,透视投影是一个这样的过程: $$P: (x,y,z) \to P': \left( \frac{n}{z}x, \frac{n}{z}y \right)~.$$ 真是简单的出乎意料!

  

未完成:另外开一篇文章分享平行投影和透视投影的 Matlab 代码

4. 3D 艺术画

   见 3D 艺术画


1. ^ 参考 Wikipedia 相关页面
2. ^ 不同人有不同的习惯,因此你的参考教材、软件可能使用了其他的约定。
3. ^ 由于屏幕是二维的,所以目前而言 $P'$ 的 $z$ 坐标 $z'$ 是无关紧要的。不过,为了以后进一步处理形状的遮挡顺序(显然,靠近屏幕的形状会遮住后面的形状),我们会定义 $z'$ 坐标。

                     

© 小时科技 保留一切权利