Skip to content

简介

SandMod 编辑器游戏项目中的 场景(Scene)、游戏对象(Game Object)都是 3D 的,但是玩家的移动设备屏幕是 2D 屏幕,因此 SandMod 需要捕捉视图并将其平面化处理,再进行于玩家设备中显示。这种功能 SandMod 使用 摄像机(Camera)来实现这一点。在 SandMod 中,您可以通过将一个 摄像机(Camera) 组件(Component)添加到游戏对象中来创建摄像机。

【Camera_Overview001.png】

场景预览窗口(Scene)中摄像机的样式及其显示效果。

定义摄像机的视野

摄像机所看到的内容由它的 变换(Transform)信息和 摄像机(Camera)组件(Component)的属性来定义的。变换位置定义了视点,其 本地坐标(Local)代表向前的 Z 轴方向定义视图的方向,本地坐标代表向上的 Y 轴定义屏幕的顶端和底部。摄像机(Camera)组件的属性值还定义了视图中区域的大小和形状。通过设置这些参数,摄像机能够显示其在当前屏幕上观察到的内容。当绑定摄像机组件的游戏对象移动和旋转时,显示的视图会随之移动和旋转。

【Camera_Overview002.png】

摄像机构成图,由游戏对象及其绑定的摄像机组件。

屏幕显示的外边缘由对应于屏幕四个角的发散线界定。如果这些线向后追踪到摄像机,它们最终会聚合到同一个点。在 SandMod 中,此点恰好位于摄像机的变换位置,也称为透视中心。从屏幕顶部和底部中心聚合到透视中心处的线所形成的角度称为 视角(FOV)。

【Camera_Overview003.png】

图像的发散角线以及两个裁剪面定义了视锥体。

任何落在图像边缘的发散线之外的物体对摄像机而言均不可见,但是针对摄像机渲染的内容还有另外两个限制。近剪裁面和远剪裁面是垂直于摄像机的 Z 轴的平面,两者沿中心线相隔一定的距离。比近剪裁面更靠近摄像机的任何对象以及比远裁剪面更远离摄像机的任何对象都不会被渲染。

【Camera_Overview004.png】

图像的发散角线以及两个裁剪面定义了视锥体。

如果物体、灯光和阴影距离较远,或这两个网格平面重叠,那它们显示在屏幕上会闪烁。发生闪烁是因为无法使用浮点数学精确计算位置,在每一帧中,网格、光或阴影的位置略有不同,因此它会不停在视锥体中显示和不显示。解决上述问题可以调整物体网格位置和 摄像机(Camera)组件的属性解决。

透视和正交摄像机

现实世界中的摄像机(或者你的眼睛)在观察外界事物时,物体距离视点越远,看起来越小。这种在日常生活中我们称作 透视(Perspective)效果,其在艺术和计算机图形领域被广泛应用。

有时需要在没有透视效果的条件下渲染视图,这样显示的对象不随距离变远而缩小的效果称为 正交(Orthographic)效果。

SandMod 的 摄像机(Camera)组件(Component)可设置摄像机在透视还是正交模式下观察场景。

【Camera_Overview005.png】【Camera_Overview006.png】
在透视模式下显示的同一场景在正交模式下显示的同一场景

被观察区域的形状

对于从当前位置能观察的最远距离方面,透视和正交摄像机都存在一定的限制。该限制由垂直于摄像机本地坐标轴 Z 轴方向的平面定义。此平面称为远裁剪面,因为与摄像机距离较远的对象将被裁剪(即,不在渲染范围内)。摄像机附近还有一个相应的近裁剪面,可观察的范围位于这两个平面之间,这个可观察的范围称为视体。

【Camera_Overview007.png】

透视与正交模式下的视体示意图。

在非透视模式下,无论距离远近,对象大小不变。这表示,正交摄像机的视体由两个裁剪面之间的长方体定义。

【Camera_Overview008.png】

正交模式下的视体示意图和构成。

在透视模式下,被观察的对象会随其与摄像机的距离增大而缩小。这表示场景中可视部分的宽度和高度随着距离的增大而增大。因此,透视摄像机的视体是四棱锥形状,其顶点位于摄像机位置而底部位于远裁剪面,因此透视模式下的视体也称为视椎体。不过,该形状并不是严格的四棱锥,因为顶部被近裁剪面截断。视椎体由远、近裁剪面的宽度与高度之比(或者称为:纵横比(Aspect Ratio))以及顶部与底部之间在顶点处的夹角(或者称为:视角,简称 FOV)定义。

【Camera_Overview009.png】

透视模式下的视体示意图和构成。

如何使用

👉 摄像机(Camera)组件,定义场景中的摄像机,设置摄像机的相关属性。

👉 多摄像机(Using More Than One Camera),编辑多摄像机动态切换的方法,以及渲染画中画的方法。

👉 摄像机射线(Rays From The Camera),基于对象在屏幕上的图像来定位对象的方法,能实现诸如点击场景中的对象等交互。

👉 摄像机和深度纹理(Cameras And Depth Textures),摄像机可以生成深度、深度 + 法线、运动矢量纹理,可用于后处理效果或实现自定义光照模型。