投影
相机投影决定如何将 3D 场景映射为 2D 图像。PlayCanvas 相机支持透视和正交两种投影。
透视投影
默认使用透视投影,它模拟人眼和真实相机的成像方式:对象越远,看起来越小。相机可见的空间范围称为视锥体,其形状是截头棱锥。

视锥体形状由视野角(fov)控制,单位为度,默认值为 45。默认沿垂直方向测量;将 horizontalFov 设为 true 可改为水平方向。较大的值能容纳更多场景,极大时呈现鱼眼效果;较小的值则呈现放大后的长焦效果。
正交投影
正交投影是一种平行投影:无论对象距离相机多远,其屏幕尺寸都保持不变。视锥体是长方体。正交投影常用于 2D、等距视角游戏,以及 CAD 风格的可视化。

由于视野角不适用,视图大小由 orthoHeight 设置:它表示以世界单位计量的可见空间高度的一半,默认值为 10。宽度根据宽高比推导。
按如下方式设置投影类型:
- 引擎
- 编辑器
- React
- Web Components
// 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
在层级面板中选中相机,在相机组件中将 Projection(投影)设为 Perspective(透视)或 Orthographic(正交)。界面会相应显示 Field of View(视野角)或 Ortho Height(正交高度)字段。
import { PROJECTION_ORTHOGRAPHIC } from 'playcanvas';
<Entity name="camera">
<Camera projection={PROJECTION_ORTHOGRAPHIC} orthoHeight={5} />
</Entity>
<!-- perspective is the default; add the orthographic flag to switch -->
<pc-entity name="camera">
<pc-camera orthographic ortho-height="5"></pc-camera>
</pc-entity>
裁剪平面
近、远裁剪平面限定视锥体的两端,也限定相机能看到的距离范围。比 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());