透视相机(perspective camera)
在透视相机渲染出来的 3D 场景中,远处的物体比较小,近处的物体比较大。
透视相机的属性
- 视野区域(FOV):人眼所能看到的视野一般是 180°,但是在显示器中,显示的区域没有那么大,FOV 用来控制视野区域的,一般是 60° - 90°。
- 比例(aspect):水平方向和垂直方向的方面比例,一般情况下可以设置成:
window.innerWidth / window.innerHeight
- 近距(near):近距属性设置场景和相机之间的距离,一般设置一个比较小的值(0.1)来渲染场景中的所有物体。
- 远距(far):远距设置相机能够看到多远的距离,过于小会导致场景的一部分不会被渲染;过大则会影响渲染性能。
- 聚焦(zoom):聚焦越大,物体越大。1 为正常,小于 1 为缩小,大于 1 为放大;如果是负数,场景会上下颠倒。一般用在正交相机中(orthographic camera),在透视相机中通过
position
的z
轴来实现聚焦。
FOV 决定了水平方向的视野,然后通过设置 aspect
来调整垂直方向和水平方向的比例,垂直方向的视野也就计算出来了,通过 near
和 far
来设置渲染的视野区域范围。
正交相机
正交相机渲染出来的场景,没有近大远小的效果,无法通过 FOV
,aspect
设置场景大小。而是通过设置位置距离来实现。
正交相机的属性
- left:被渲染场景左侧的距离(场景左侧的边框)
- right:被渲染场景右侧的距离(场景右侧的边框)
- bottom:被渲染场景底部的距离(场景下侧的边框)
- top:被渲染场景顶部的距离(场景上侧的边框)
- near:设置相机位置离场景的开始距离(近端)
- far:设置相机位置离场景的结束距离(远端)
- zoom:设置场景的聚焦,小于 1 则缩小,大于 1 则放大,如果是负数则场景会上下颠倒
设置完位置距离以后,距离之外的范围将不被渲染。
设置相机调试视角
为了利于调试,有时候需要知道当前相机的渲染范围,可以通过添加一个 helper 相机来显示当前的相机朝向的位置:
const helper = new THREE.CameraHelper(camera);
scene.add(helper);
// 场景更新时调用
helper.update();
相机控制器
通过不同的相机控制器,可以使相机具有不同的交互方式和视角,控制器有:
- ArcballControls
- 给场景外层添加一层遮罩,遮罩上有三根指示线,可以通过指示线拖动场景,双击聚焦场景,通过右键拖动场景。
- TrackBallControls
- 可以通过鼠标控制场景移动,缩放,旋转
- FlyControls
- 飞行相机,可以通过按键控制相机视角
- FirstPersonControls
- 第一人称相机,可以通过鼠标和按键控制相机视角
- OrbitControls
- 轨道相机, 可以通过鼠标控制相机视角,比较常用
PREVIOUSThree.js 之灯源介绍
NEXTThree.js 之材质