经纬志
首页 / three.js / API 文档

PerspectiveCamera

先看结论

透视相机,模拟人眼与镜头的近大远小,是三维场景的默认选择。

最后验证 2026-11-03 · three.js 0.160.0 · 更新 2026-10-27 · 引用本文
new THREE.PerspectiveCamera(fov, aspect, near, far) → PerspectiveCamera

构造参数

参数默认说明
fov50垂直视野角,单位度。数值越大越广角,边缘拉伸越明显
aspect1宽高比,应等于画布宽度除以高度
near0.1近裁剪面距离,比它更近的内容不绘制
far2000远裁剪面距离,比它更远的内容不绘制

属性

属性说明
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)。