PerspectiveCamera
透视相机,模拟人眼与镜头的近大远小,是三维场景的默认选择。
构造参数
| 参数 | 默认 | 说明 |
|---|---|---|
fov | 50 | 垂直视野角,单位度。数值越大越广角,边缘拉伸越明显 |
aspect | 1 | 宽高比,应等于画布宽度除以高度 |
near | 0.1 | 近裁剪面距离,比它更近的内容不绘制 |
far | 2000 | 远裁剪面距离,比它更远的内容不绘制 |
属性
| 属性 | 说明 |
|---|---|
fov | 垂直视野角,改完要调用 updateProjectionMatrix() |
aspect | 宽高比,容器尺寸变化时必须同步更新 |
near / far | 裁剪范围,直接影响深度精度 |
zoom | 缩放系数,大于 1 放大画面。与相机位置缩放不同,它只改投影 |
focus | 对焦距离,供景深后处理使用 |
filmGauge | 胶片规格,用于焦距与视野角互换 |
view | 偏移视图参数,由 setViewOffset 写入 |
方法
| 方法 | 说明 |
|---|---|
updateProjectionMatrix() | 任何投影相关属性改动后必须调用,否则画面不变 |
setViewOffset(w, h, x, y, vw, vh) | 把完整画面切成子视图,用于多屏拼接与大图渲染 |
clearViewOffset() | 取消子视图偏移 |
getEffectiveFOV() | 返回考虑 zoom 后的实际垂直视野角 |
getFocalLength() | 按当前视野角与胶片规格换算焦距 |
setFocalLength(mm) | 按焦距反推视野角 |
基本用法
const camera = new THREE.PerspectiveCamera(
45,
stage.clientWidth / stage.clientHeight,
0.5,
3000
);
camera.position.set(120, 80, 160);
camera.lookAt(0, 0, 0);
// 容器尺寸变化
function onResize() {
const w = stage.clientWidth;
const h = stage.clientHeight;
camera.aspect = w / h;
camera.updateProjectionMatrix();
renderer.setSize(w, h);
}
裁剪面怎么取
near 与 far 的比值决定了深度缓冲的可用精度。比值越大,
远处越容易出现深度冲突。一个经验做法是让 near 尽量大,
刚好不切掉近处物体即可;far 只覆盖实际可见范围。
城市级场景中,若 near 设为 0.1、far 设为 100000,
比值达到一百万,远处贴合地面的标牌与地面会交替闪烁。
把 near 提到 1,或开启 logarithmicDepthBuffer,
都能缓解,但后者有额外开销。
多视口与分屏
setViewOffset 让多个相机像拼图一样共同覆盖一个大画面。
做超大分辨率截图、多屏拼接或分屏对比时很有用,比开多个渲染器省资源。
// 左半屏:完整画面的左半部分
camera.setViewOffset(fullWidth, fullHeight, 0, 0, fullWidth / 2, fullHeight);
camera.updateProjectionMatrix();
renderer.setViewport(0, 0, halfWidth, height);
renderer.render(scene, camera);
// 右半屏
camera.setViewOffset(fullWidth, fullHeight, fullWidth / 2, 0, fullWidth / 2, fullHeight);
camera.updateProjectionMatrix();
renderer.setViewport(halfWidth, 0, halfWidth, height);
renderer.render(scene, camera);
正交还是透视
需要保持比例与平行关系的场景(平面图、剖面、工程量测)应当用
OrthographicCamera。透视相机在俯视大范围时会有明显的近大远小,
用它做量测会产生视觉误差。示意性三维场景则更适合透视,空间感更强。
lookAt 之后不要再叠加旋转。lookAt 会直接改写相机的四元数。
如果先设置 rotation 再调用 lookAt,后者会覆盖前者;
反过来,画面朝向会被两者的组合打乱。
经纬志(2026)。《PerspectiveCamera》。https://www.jingweizhi.com/three/api/perspective-camera.html(访问日期 2026-11-03)。