跳到主要内容

投影

相机投影决定如何将 3D 场景映射为 2D 图像。PlayCanvas 相机支持透视和正交两种投影。

透视投影​

默认使用透视投影,它模拟人眼和真实相机的成像方式:对象越远,看起来越小。相机可见的空间范围称为视锥体,其形状是截头棱锥。

透视相机

视锥体形状由视野角(fov)控制,单位为度,默认值为 45。默认沿垂直方向测量;将 horizontalFov 设为 true 可改为水平方向。较大的值能容纳更多场景,极大时呈现鱼眼效果;较小的值则呈现放大后的长焦效果。

正交投影​

正交投影是一种平行投影:无论对象距离相机多远,其屏幕尺寸都保持不变。视锥体是长方体。正交投影常用于 2D、等距视角游戏,以及 CAD 风格的可视化。

正交相机

由于视野角不适用,视图大小由 orthoHeight 设置:它表示以世界单位计量的可见空间高度的一半,默认值为 10。宽度根据宽高比推导。

按如下方式设置投影类型:

// pc.PROJECTION_PERSPECTIVE (default) | pc.PROJECTION_ORTHOGRAPHIC
camera.camera.projection = pc.PROJECTION_ORTHOGRAPHIC;
camera.camera.orthoHeight = 5; // half-height of the view in world units

裁剪平面​

近、远裁剪平面限定视锥体的两端,也限定相机能看到的距离范围。比 nearClip(默认 0.1)更近或比 farClip(默认 1000)更远的内容不会渲染:

camera.camera.nearClip = 0.5;
camera.camera.farClip = 500;
备注

远近平面的距离比决定深度缓冲精度在场景中的分布。如果近平面距离相对远平面过小,远处表面可能无法获得足够精度来可靠区分,从而产生称为深度冲突(z-fighting)的闪烁。为避免这一问题,应在场景允许的范围内尽量增大近平面距离,并将远平面限制在必要范围内。

宽高比​

默认情况下,相机每帧根据渲染目标和视口自动计算宽高比(aspectRatioMode 为 ASPECT_AUTO),因此画布调整大小时图像不会被拉伸。对于为非方形像素显示器渲染等特殊情况,可将 aspectRatioMode 设为 ASPECT_MANUAL,并自行指定 aspectRatio。

视锥体剔除​

默认启用视锥体剔除(frustumCulling)。引擎会跳过包围盒完全位于相机视锥体之外的网格实例,从而显著减少大型场景中的绘制调用。只有需要无论可见与否都向 GPU 提交所有内容时,才应禁用它。

视锥体本身通过只读属性 frustum 暴露为 Frustum,可查询它来实现自定义可见性逻辑:

const visible = camera.camera.frustum.containsPoint(entity.getPosition());