从零开始学习three.js(3):常用控制器详解

697 阅读3分钟

在 Three.js 中,控制器(Controls)是实现用户与3D场景交互的核心组件。通过不同的控制器,开发者可以轻松实现场景的旋转、平移、缩放、自由飞行等多种交互效果。本文将详细介绍几种常用控制器,并提供代码示例与配置指南。

一、OrbitControls(轨道控制器)

适用场景:适用于大多数需要旋转、缩放、平移查看的场景(如模型展示、地图浏览)。

基本使用

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

// 初始化控制器
const controls = new OrbitControls(camera, renderer.domElement);

// 启用阻尼效果(惯性滑动)
controls.enableDamping = true;
controls.dampingFactor = 0.05;

// 限制缩放范围
controls.minDistance = 5;
controls.maxDistance = 50;

// 自动旋转
controls.autoRotate = true;

主要属性和方法

  • controls.rotateSpeed:旋转速度,默认值为 1.0。
  • controls.zoomSpeed:缩放速度,默认值为 1.2。
  • controls.panSpeed:平移速度,默认值为 0.3。
  • controls.staticMoving:静态移动,如果为 true,则没有惯性效果。
  • controls.dynamicDampingFactor:动态阻尼系数,用于控制惯性效果。

注意事项

  • 需在动画循环中调用 controls.update(),尤其是启用阻尼后。
  • 窗口大小变化时需更新控制器:controls.handleResize()

二、FlyControls(飞行控制器)

适用场景:第一人称视角的自由飞行(如太空探索、3D游戏)。

基本使用

import { FlyControls } from 'three/examples/jsm/controls/FlyControls.js';

const controls = new FlyControls(camera, renderer.domElement);

// 配置移动和旋转速度
controls.movementSpeed = 10;
controls.rollSpeed = Math.PI / 6;

操作方式

  • WASD: 前后左右移动。
  • 鼠标移动: 调整视角。
  • Q/E: 垂直升降。
  • R/F: 俯仰(Pitch)旋转。

适用场景

  • 需要复杂自由移动的场景,但需较高的学习成本。

三、TrackballControls(轨迹球控制器)

适用场景:需要突破固定旋转轴限制的自由视角(如医学图像浏览)。

特点

  • 允许任意方向旋转,无固定“上下”方向。
  • 支持拖拽、缩放、旋转组合操作。

基本使用

import { TrackballControls } from 'three/examples/jsm/controls/TrackballControls.js';

const controls = new TrackballControls(camera, renderer.domElement);
controls.rotateSpeed = 2.0;
controls.zoomSpeed = 1.2;

主要属性和方法

  • controls.autoForward:如果设为 true,摄像机将自动向前移动。
  • controls.dragToLook:如果设为 true,用户只能通过拖拽来环视四周。
  • controls.movementSpeed:移动速度。
  • controls.rollSpeed:旋转速度。
  • controls.update(delta) :更新控制器状态,需要在动画循环中调用。

注意

  • 长时间使用可能导致摄像机方向混乱,需提供“复位”功能。

四、FirstPersonControls(第一人称控制器)

FirstPersonControls 提供了沉浸式的第一人称视角,用户可以通过键盘控制摄像机在场景中移动。

基本使用

import { FirstPersonControls } from 'three/examples/jsm/controls/FirstPersonControls.js';

const controls = new FirstPersonControls(camera, renderer.domElement);
controls.movementSpeed = 100; // 设置移动速度
controls.lookSpeed = 0.005; // 设置旋转速度

主要属性和方法

  • controls.movementSpeed:移动速度。
  • controls.lookSpeed:旋转速度。
  • controls.lookVertical:是否允许垂直方向旋转。
  • controls.constrainVertical:是否限制垂直方向的旋转范围。

五、TransformControls(变换控制器)

适用场景:3D编辑器中的物体平移、旋转、缩放操作。

基本使用

import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';

const controls = new TransformControls(camera, renderer.domElement);
scene.add(controls);

// 绑定到目标物体
controls.attach(mesh);

// 监听变换事件
controls.addEventListener('dragging-changed', (event) => {
  orbitControls.enabled = !event.value; // 操作时禁用OrbitControls
});

模式切换

controls.setMode('translate'); // 'translate' | 'rotate' | 'scale'

六、其他控制器

  1. FirstPersonControls:类似FlyControls,但行为更接近传统FPS游戏。
  2. DragControls:实现物体拖拽选择功能。
  3. DeviceOrientationControls:利用手机陀螺仪控制视角。

总结与选择建议

控制器交互特点适用场景
OrbitControls轨道旋转+缩放+平移通用模型查看
FlyControls自由飞行太空探索、3D游戏
TrackballControls无轴限制旋转医学影像、自由视角
PointerLockControls鼠标锁定+键盘控制FPS游戏
TransformControls物体变换操作3D编辑器

更多three.js、cesium.js开源案例,请移至gitee.com/giser2017/t…