Three.js 之相机介绍

 

透视相机(perspective camera)

在透视相机渲染出来的 3D 场景中,远处的物体比较小,近处的物体比较大。

透视相机的属性

  1. 视野区域(FOV):人眼所能看到的视野一般是 180°,但是在显示器中,显示的区域没有那么大,FOV 用来控制视野区域的,一般是 60° - 90°。
  2. 比例(aspect):水平方向和垂直方向的方面比例,一般情况下可以设置成:window.innerWidth / window.innerHeight
  3. 近距(near):近距属性设置场景和相机之间的距离,一般设置一个比较小的值(0.1)来渲染场景中的所有物体。
  4. 远距(far):远距设置相机能够看到多远的距离,过于小会导致场景的一部分不会被渲染;过大则会影响渲染性能。
  5. 聚焦(zoom):聚焦越大,物体越大。1 为正常,小于 1 为缩小,大于 1 为放大;如果是负数,场景会上下颠倒。一般用在正交相机中(orthographic camera),在透视相机中通过 positionz 轴来实现聚焦。

FOV 决定了水平方向的视野,然后通过设置 aspect 来调整垂直方向和水平方向的比例,垂直方向的视野也就计算出来了,通过 nearfar 来设置渲染的视野区域范围。

正交相机

正交相机渲染出来的场景,没有近大远小的效果,无法通过 FOVaspect 设置场景大小。而是通过设置位置距离来实现。

正交相机的属性

  1. left:被渲染场景左侧的距离(场景左侧的边框)
  2. right:被渲染场景右侧的距离(场景右侧的边框)
  3. bottom:被渲染场景底部的距离(场景下侧的边框)
  4. top:被渲染场景顶部的距离(场景上侧的边框)
  5. near:设置相机位置离场景的开始距离(近端)
  6. far:设置相机位置离场景的结束距离(远端)
  7. zoom:设置场景的聚焦,小于 1 则缩小,大于 1 则放大,如果是负数则场景会上下颠倒

设置完位置距离以后,距离之外的范围将不被渲染。

设置相机调试视角

为了利于调试,有时候需要知道当前相机的渲染范围,可以通过添加一个 helper 相机来显示当前的相机朝向的位置:

  const helper = new THREE.CameraHelper(camera);
  scene.add(helper);

  // 场景更新时调用
  helper.update();

相机控制器

通过不同的相机控制器,可以使相机具有不同的交互方式和视角,控制器有:

  • ArcballControls
    • 给场景外层添加一层遮罩,遮罩上有三根指示线,可以通过指示线拖动场景,双击聚焦场景,通过右键拖动场景。
  • TrackBallControls
    • 可以通过鼠标控制场景移动,缩放,旋转
  • FlyControls
    • 飞行相机,可以通过按键控制相机视角
  • FirstPersonControls
    • 第一人称相机,可以通过鼠标和按键控制相机视角
  • OrbitControls
    • 轨道相机, 可以通过鼠标控制相机视角,比较常用