构造函数
OrbitControls( object : Camera, domElement : HTMLDOMElement )
• 参数:
• object: (必填)被控制的相机(必须是场景的直接子级)。
• domElement: 用于绑定事件的 HTML 元素(可选)。
事件(Events)
• change: 当相机位置/角度变化时触发。
• start: 交互开始时触发(如鼠标按下)。
• end: 交互结束时触发(如鼠标松开)。
核心属性(Properties)
| 属性 | 类型 | 描述 |
|---|---|---|
| .autoRotate | Boolean |
是否自动绕目标旋转(默认 false)。需在动画循环中调用 .update()。 |
| .autoRotateSpeed | Float |
自动旋转速度(默认 2.0,60fps 下约 30 秒/圈)。 |
| .enableDamping | Boolean |
是否启用阻尼惯性效果(默认 false)。启用后需在动画循环中调用 .update()。 |
| .dampingFactor | Float |
阻尼系数(默认 0.05)。 |
| .enablePan | Boolean |
是否允许平移相机(默认 true)。 |
| .enableRotate | Boolean |
是否允许旋转相机(默认 true)。 |
| .enableZoom | Boolean |
是否允许缩放(推拉)相机(默认 true)。 |
| .screenSpacePanning | Boolean |
平移时是否基于屏幕空间(默认 true)。若为 false,平移方向将与相机上方向正交。 |
| .target | Vector3 |
控制焦点(相机围绕此点旋转)。 |
| .cursor | Vector3 |
.minTargetRadius 和 .maxTargetRadius 的限制中心点。 |
限制范围(Limits)
| 属性 | 类型 | 描述 |
|---|---|---|
| .minDistance / .maxDistance | Float |
相机与焦点的最小/最大距离(透视相机 PerspectiveCamera 专用)。 |
| .minZoom / .maxZoom | Float |
最小/最大缩放值(正交相机 OrthographicCamera 专用)。 |
| .minAzimuthAngle / .maxAzimuthAngle | Float |
水平旋转角度(弧度)的上下限。 |
| .minPolarAngle / .maxPolarAngle | Float |
垂直旋转角度(弧度)的上下限(默认垂直范围 0 到 π)。 |
交互速度(Speed)
| 属性 | 类型 | 描述 |
|---|---|---|
| .panSpeed | Float |
平移速度(默认 1)。 |
| .rotateSpeed | Float |
旋转速度(默认 1)。 |
| .zoomSpeed | Float |
缩放速度(默认 1)。 |
| .keyPanSpeed | Float |
键盘平移速度(默认 7.0)。 |
| .keyRotateSpeed | Float |
键盘旋转速度(默认 1)。 |
按键绑定(Key Mappings)
// 默认键盘按键
.controls.keys = {
LEFT: 'ArrowLeft', // 左箭头
UP: 'ArrowUp', // 上箭头
RIGHT: 'ArrowRight', // 右箭头
BOTTOM: 'ArrowDown' // 下箭头
}
// 默认鼠标按键
.controls.mouseButtons = {
LEFT: THREE.MOUSE.ROTATE, // 左键旋转
MIDDLE: THREE.MOUSE.DOLLY, // 中键推拉
RIGHT: THREE.MOUSE.PAN // 右键平移
}
// 默认触摸手势
.controls.touches = {
ONE: THREE.TOUCH.ROTATE, // 单指旋转
TWO: THREE.TOUCH.DOLLY_PAN // 双指推拉/平移
}
方法(Methods)
| 方法 | 描述 |
|---|---|
| .update( deltaTime : Number ) | 更新控制器。启用 autoRotate 或 enableDamping 时,必须在动画循环中调用此方法。deltaTime 参数(秒)用于帧率无关的自动旋转。 |
| .reset() | 将控制器状态重置为上一次调用 .saveState() 或初始状态。 |
| .saveState() | 保存当前控制器状态(供 .reset() 恢复)。 |
| .getAzimuthalAngle() | 获取当前水平旋转角度(弧度)。 |
| .getPolarAngle() | 获取当前垂直旋转角度(弧度)。 |
| .getDistance() | 获取相机与目标点的距离。 |
| .listenToKeyEvents( domElement ) | 为指定 DOM 元素绑定键盘事件监听(通常传入 window)。 |
代码示例
// 初始化控制器
const controls = new OrbitControls( camera, renderer.domElement );
controls.enableDamping = true;
controls.dampingFactor = 0.05;
// 动画循环
function animate() {
requestAnimationFrame( animate );
controls.update(); // 启用阻尼或自动旋转时必须调用
renderer.render( scene, camera );
}
注意事项
- 若修改相机位置(如
camera.position.set(...)),需手动调用controls.update()。 - 正交相机(
OrthographicCamera)的缩放通过.minZoom和.maxZoom控制。 - 阻尼(Damping) 功能会带来平滑的惯性效果,但会消耗额外性能。
弧度与角度的转换
// ============
// 弧度转角度
// ============
const convertRadToDeg = (rad:any) => {
return rad * (180 / Math.PI);
}
// ============
// 角度转弧度
// ============
const convertDegToRad = (deg:any) => {
return deg * (Math.PI / 180);
}










网友评论