Skip to content

透视相机

透视相机通过定义一个 四棱台形的可视范围(视锥体 Frustum) 来决定渲染内容。模拟了人眼的真实成像方式,物体会表现出 “近大远小” 的透视效果。这非常适合构建具有纵深感的 3D 场景、动态运镜演出(如推拉镜头),以及利用深度差异实现自然的 视差滚动 (Parallax) 背景。

使用 regPerspectiveCamera 函数,可以帮助我们快速创建一个正交相机(并返回一个句柄)。

export const view = regPerspectiveCamera("main", c => {});

替换默认相机

// 默认的正交相机
export const view = regCamera("main", c => {});
// 替换为透视相机
export const view = regPerspectiveCamera("main", c => {});

要注意,尽管相机之间有种类之分,但所有相机的名称都不能重复!

regPerspectiveCamera 接受两个参数。

regPerspectiveCamera(
"main", // 第一个参数
c => {}, // 第二个参数
);
  • main 是相机的名称,可以任意指定(但不能与其他相机重名)。
  • 第二个参数则是相机的配置函数,可以在这里指定相机的视锥体等。
    我们只需要修改 c => { ... } 内部的内容;这里的 c 是一个构建器,可以任意指定其名称。

regPerspectiveCamera 函数会返回一个相机句柄,可以通过这个句柄来引用这个相机。

export const view = regPerspectiveCamera("main");
  • view 是一个相机句柄,其名称可以任意指定(但不能与其他句柄重复)。
  • export const 表示 view 是一个全局变量,可以在其他文件中引用。

regPerspectiveCamera 的第二个参数(可选)是一个配置函数,可以在这里指定相机的的视锥体等。

视口边界

  • fov:视场角,垂直 Vertical FOV,单位为角度。
  • aspect:宽高比,即视口宽度除以高度。

深度范围

  • near, far:定义视体在 Z 轴上的前、后边界。
    只有 Z 轴坐标位于 [near, far] 区间内的物体才会被渲染。
默认值
r => {
r.fov = 45;
r.aspect = 16 / 9;
r.near = 0.1;
r.far = 10000; // 对于 1080p 的画面,一般至少设置为 10000
};
  • zoom 属性用于缩放相机视口,类似于相机的数码变焦,仅放大画面,不改变透视关系。
默认值
r => {
r.zoom = 1;
};