目录
一、OrbitControls 基础认知
1. 什么是 OrbitControls?
- 官方定义:Three.js 中用于实现相机环绕、缩放、平移交互的控件库
- 核心作用:简化 3D 场景中相机的用户交互逻辑(无需手动编写相机变换代码)
- 适用场景:模型预览、场景漫游、多角度观察等交互需求
2. 引入与初始化
- 引入方式:Three.js 官方扩展库的获取(CDN 链接 / 本地下载)
- 初始化核心参数:必填项(相机实例、DOM 元素)的作用说明
-
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
二、OrbitControls 核心功能解析
1. 基础交互
- 旋转(Orbit):鼠标左键拖拽的实现逻辑(围绕目标点旋转)
- 缩放(Zoom):鼠标滚轮 / 右键拖拽的缩放机制(基于目标点的远近调整)
- 平移(Pan):按住 Ctrl + 左键 / 中键拖拽的平移规则(垂直于视线方向移动)
2. 目标点(Target)机制
- target 属性的作用:旋转与缩放的中心点设置
- 动态修改目标点:
controls.target.set(x, y, z)
的使用场景(如聚焦到模型不同部位) - 目标点与相机位置的关系:如何通过目标点控制相机环绕范围
3. 交互限制配置
配置属性 | 作用说明 | 常用值示例 |
---|---|---|
enableRotate | 是否允许旋转 | true (默认)/false |
enableZoom | 是否允许缩放 | true (默认)/false |
enablePan | 是否允许平移 | true (默认)/false |
minDistance /maxDistance | 相机与目标点的最小 / 最大距离(缩放限制) | 10 /100 (根据场景尺度调整) |
minPolarAngle /maxPolarAngle | 垂直旋转角度限制(避免翻转场景) | 0 (默认,向下无限制)/Math.PI (默认,向上无限制) |
minAzimuthAngle /maxAzimuthAngle | 水平旋转角度限制(限制环绕范围) | -Math.PI/2 /Math.PI/2 (左右各 90 度) |
panSpeed | 平移速度系数 | 1 (默认,值越大平移越快) |
三、进阶配置与个性化定制
1. 动画与平滑过渡
enableDamping
(阻尼效果):开启后实现平滑的惯性动画- 配合
controls.update()
在动画循环中调用的必要性 - 阻尼系数
dampingFactor
的调节(0.05~0.2,值越小惯性越强)
- 配合
2. 鼠标与触摸事件适配
- 鼠标按键映射:自定义旋转 / 缩放 / 平移的触发按键(
mouseButtons
属性) - 触摸设备支持:移动端手势适配(双指缩放、单指旋转的默认行为)
- 事件监听:常用事件(
change
/start
/end
)的应用场景
3. 与其他控件的配合
- 与
TrackballControls
的区别:交互逻辑差异(OrbitControls 更适合环绕固定目标) - 多控件切换:动态启用 / 禁用 OrbitControls 的场景处理
四、附录:常用 API 速查表
方法 / 属性 | 作用 | 备注 |
---|---|---|
controls.update() | 更新控件状态(阻尼模式必需) | 需放在requestAnimationFrame 循环中 |
controls.reset() | 重置相机位置与目标点 | 恢复初始化状态 |
controls.saveState() /controls.resetState() | 保存 / 恢复当前控件状态 | 用于场景切换时的状态记忆 |
controls.getAzimuthalAngle() | 获取水平旋转角度 | 可用于同步显示当前视角信息 |