贡献者: addis; ACertainUser
1当我们在平面上画三维物体时,我们需要某种投影算法把物体上的每个点对应到平面上的一点。以下介绍两种常用的方法,一种是平行投影(parallel projection),另一种是透视投影(perspective projection)。
1. 平行投影
顾名思义,平行投影是指在空间中指定一个方向(如图未完成),将三维物体上的每一点沿着该方向投影到与该方向垂直的平面上。工程制图中的正视图,侧视图等都属于平行投影。这种投影的特点是,空间中的任意两条平行线的投影仍然是平行线。平行投影是线性的,即一个线段若伸长若干倍,那么它的投影也会按照同样的比例伸长。
2. 透视投影
当人眼或相机观察一个三维物体时,使用的是透视投影。
图 1:透视投影示意图
我们在平面后方取一个固定点 称为焦点,要把物体上任意一点 投影到屏幕(对于眼睛而言,这是我们 “看到的图像”)上,先作直线 ,该直线与平面的交点 就是投影后的点。
图 2:“近大远小”:尽管两个正方体事实上是一样大的,但由于左侧的正方体离屏幕更远,因此看起来更小
透视投影不是线性的,且会使物体的投影呈现 “近大远小”,但仍可以保证直线的投影仍然为直线。由于人眼适应的是透视投影,因此运用透视投影作画,会让画面更显真实。
为什么透视投影要这样定义?我们先思考一种非常简单的相机,即小孔成像相机。根据光的直线传播,物体上的某点发出的(或反射的)光线只有经过小孔才能投影到孔后面的平面。如果按照这个模型,我们在计算透视投影时应该把焦点定义在屏幕之前,然而这么做有一个缺点就是投影后平面上的像是倒像。所以为了方便起见,我们保持焦点不变,但是把屏幕平移到焦点之前(焦距也不变),容易看出这样做的唯一改变就是把倒像变为正像,即点 的两个平面坐标分别取相反数。
如果我们将相机上的小孔改为焦距为 的小凸透镜,并假设物距远大于焦距,那么根据成像公式,凸透镜和平面(即底片)的距离就是焦距 。根据凸透镜成像原理,物体一点在底片上的像仍然会过凸透镜的中点,所以使用凸透镜的相机和使用小孔成像的相机得到的投影是相同的。至于人眼,人眼成像的原理和相机基本一致,虽然视网膜并不是一个平面,得到的成像是扭曲的,但大脑在处理图象是会自动纠正这种扭曲(例如我们看到的直线仍然是直的)。
3. 计算方法
无论是哪种投影,我们通常建立两个坐标系,一个是世界坐标系(world frame)} ,一个是相机坐标系(camera frame) 。一个基本的问题就是将一个系里面的坐标变换到另一个系中的坐标。这可以通过空间旋转矩阵,再加上一个平移完成(平移的矢量是两个坐标系原点之间的位移)。
图 3:转换坐标系的方法相当于平移并旋转所有的顶点
把所有要投影的点 ()的在世界系中的坐标(假设已知)记为一个 3 行 列矩阵,矩阵的第 列就是列矢量 。将 3 乘 3 的旋转矩阵左乘该矩阵,再给每行加上常数进行平移即可。完成后,我们就得到了相机系中的坐标矩阵,每一列是 。
平行投影
当我们做平行投影时,可以令相机系的 - 平面为投影平面,投影方向为 。即 投影后为 。
透视投影
当我们做透视投影时,可以令原点为焦点, 为平面的中点,平面与 轴垂直。相机系中的某点 投影后变为 ,即每个分量乘以 ,使得 分量等于 。
图 4:透视投影 ABC
或者更讲人话的,如 图 4 所示,我们依据计算机图形学的惯例2,以焦点为原点, 方向垂直指入屏幕,建立坐标系。
显而易见,透视投影其实是一个简单的相似三角形问题。假设物体的一个顶点 的坐标为 ,它在屏幕上对应点 的坐标为 3。先观察 坐标,显然:
即
同理
总结一下,透视投影是一个这样的过程:
真是简单的出乎意料!
未完成:另外开一篇文章分享平行投影和透视投影的 Matlab 代码
4. 3D 艺术画
见 3D 艺术画。
1. ^ 参考 Wikipedia 相关页面。
2. ^ 不同人有不同的习惯,因此你的参考教材、软件可能使用了其他的约定。
3. ^ 由于屏幕是二维的,所以目前而言 的 坐标 是无关紧要的。不过,为了以后进一步处理形状的遮挡顺序(显然,靠近屏幕的形状会遮住后面的形状),我们会定义 坐标。
致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者
热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。