摄像机所看到的内容由它的变换和摄像机 (Camera) 组件来定义。变换位置定义了视点,其向前的 (Z) 轴定义了视图方向,向上的 (Y) 轴定义了屏幕的顶端。Camera 组件的设置还定义了视图中区域的大小和形状。通过设置这些参数,摄像机能够在当前屏幕上显示其“观察”到的内容。当游戏对象移动和旋转时,显示的视图会随之移动和旋转。
对于从当前位置能“观察”的最远距离方面,透视和正交摄像机都存在一定的限制。该限制由垂直于摄像机向前 (Z) 方向的平面定义。此平面称为_远裁剪面_,因为与摄像机距离较远的对象将被“裁剪”(即,不在渲染范围内)。摄像机附近还有一个相应的_近裁剪面_;可观察的距离范围位于这两个平面之间。
在非透视模式下,无论距离远近,对象大小不变。这表示,正交摄像机的视体由两个裁剪面之间的长方体定义。
使用透视摄像机时,对象会随其与摄像机的距离增大而缩小。这表示场景中可视部分的宽度和高度随着距离的增大而增大。因此,透视摄像机的视体不是一个长方体,而是金字塔形状,其顶点位于摄像机位置而底部位于远裁剪面。不过,该形状并不是严格的金字塔形,因为顶部被近裁剪面截断了;这种被截断的金字塔形状称为_平截头体。由于平截头体的高度并非常量,平截头体由其宽度与高度之比(称为_宽高比_)以及顶部与底部之间在顶点处的夹角(称为_可视角度_,即 FOV_)定义。请参阅关于了解视锥体的页面,了解更多详细说明。
__视锥体__一词表示看起来像顶部切割后平行于底部的金字塔的实体形状。这是透视摄像机可以看到和渲染的区域的形状。以下思维实验应该有助于解释为什么会这样。
想象一下,将一根直杆(例如扫帚柄或一支铅笔)正对着摄像机,然后拍照。如果杆垂直于摄像机镜头保持在图片中心位置,那么只有其一端可在图片上显示为圆圈;所有其他部分都会被遮挡。如果将杆向上移动,下侧将开始变得可见,但可通过向上倾斜杆再次将其隐藏。如果继续向上移动杆并进一步将其向上倾斜,则圆形末端最终将到达图片的顶部边缘。此时,在世界空间中由此杆跟踪的界线上方的任何对象在图片上都不可见。
杆可以很容易地向左、向右或向下(或者水平和垂直方向的任何组合方式)移动或旋转。“隐藏”杆的角度仅取决于它在两个轴上距离屏幕中心的距离。
这一思维实验的意义在于,摄像机图像中的任何一点实际上都对应于世界空间中的一条线,在图像中只能看到这条线上的一个点。这条线上该位置背后的一切都会被遮挡。
图像的外边缘由对应于图像四个角的发散线界定。如果这些线向后追踪到摄像机,它们最终会聚合到同一个点。在 Unity 中,此点恰好位于摄像机的变换位置,也称为透视中心。从屏幕顶部和底部中心聚合到透视中心处的线所形成的角度称为可视角度(通常缩写为 FOV)。
如上所述,任何落在图像边缘的发散线之外的物体对摄像机而言均不可见,但是针对摄像机渲染的内容还有另外两个限制。近剪裁面和远剪裁面平行于摄像机的 XY 平面,两者沿中心线相隔一定的距离。比近剪裁面更靠近摄像机的任何对象以及比远裁剪面更远离摄像机的任何对象都不会被渲染。
图像的发散角线以及两个裁剪面定义了截头金字塔:视锥体。