mcpField
T
threejs-syntax-controls

threejs-syntax-controls

github.com/impertio-studio开发23134 次安装30 周前更新
代码仓库

关于 threejs-syntax-controls

面向 Three.js 开发者的相机与对象控制参考技能,介绍各类控制器的选择和用法。涵盖初始化、更新、清理及交互集成注意事项。

主要功能

  1. 01按交互方式选择控制器
  2. 02轨道、地图与飞行相机控制
  3. 03第一人称与指针锁定控制
  4. 04对象变换与拖拽操纵器
  5. 05生命周期和控制器集成指导

适用场景

  1. 01为模型查看器添加环绕与缩放
  2. 02构建第一人称相机交互
  3. 03通过操纵器编辑对象变换

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/impertio-studio/three.js-claude-skill-package --skill threejs-syntax-controls

安装后在 Claude Code 中输入/threejs-syntax-controls确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitkeep
references/
anti-patterns.md
examples.md
methods.md

详细介绍

threejs-syntax-controls

快速参考

控件选择决策树
使用场景控件原因
从各个角度查看 3D 模型OrbitControls围绕目标点旋转、平移和缩放
俯视地图或 2D 风格的导航MapControls左键拖动可平移,右键拖动可旋转
自由飞行编辑器或太空场景FlyControls六自由度,WASD + 鼠标
使用指针锁定的第一人称游戏PointerLockControls隐藏光标并捕获鼠标移动
不使用指针锁定的第一人称视角FirstPersonControls无需浏览器锁定 API 的鼠标视角控制
通过操纵器移动、旋转和缩放对象TransformControls交互式平移、旋转和缩放控制柄
沿平面拖动对象DragControls点击并拖动对象以重新定位
不受约束的旋转(无万向节锁)ArcballControls带动画的完整球面旋转
不受约束的旋转(更简单)TrackballControls类似 OrbitControls,但没有极点约束
导入路径(Three.js r160+)
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
import { MapControls } from 'three/addons/controls/MapControls.js';
import { FlyControls } from 'three/addons/controls/FlyControls.js';
import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js';
import { PointerLockControls } from 'three/addons/controls/PointerLockControls.js';
import { TransformControls } from 'three/addons/controls/TransformControls.js';
import { TrackballControls } from 'three/addons/controls/TrackballControls.js';
import { ArcballControls } from 'three/addons/controls/ArcballControls.js';
import { DragControls } from 'three/addons/controls/DragControls.js';

始终对 r160+ 使用 'three/addons/controls/...'。旧路径 'three/examples/jsm/controls/...' 仍可用,但已弃用。

重要警告

当 enableDamping 或 autoRotate 为 true 时,始终在动画循环中调用 controls.update()。否则用户交互结束后摄像机将冻结。

移除控件时,始终调用 controls.dispose()。否则会泄漏 DOM 事件监听器(pointermove、wheel、keydown),导致内存泄漏和残留交互。

切勿在同一摄像机上同时附加两个摄像机控制类,除非禁用了其中一个。在同一摄像机上同时使用 OrbitControls 和 FlyControls 会导致移动异常。

TransformControls 拖动时,始终禁用 OrbitControls。监听 dragging-changed 事件并切换 orbitControls.enabled。

始终从用户手势(点击处理程序)中调用 PointerLockControls.lock()。如果没有用户交互,浏览器会拒绝指针锁定请求。

始终向 FlyControls.update(delta) 传递 delta 时间。未传递参数或传递经过的时间都会导致速度受帧率影响。


控件生命周期

每个控件都遵循相同的生命周期模式:

construct --> configure --> attach to loop --> dispose on cleanup
步骤 1:构造
const controls = new OrbitControls(camera, renderer.domElement);

第二个参数始终传入 renderer.domElement。传入 document 或 document.body 会导致控件全局捕获事件,从而破坏 UI 覆盖层。

步骤 2:配置
controls.enableDamping = true;
controls.dampingFactor = 0.05;
controls.minDistance = 2;
controls.maxDistance = 50;
controls.target.set(0, 1, 0);
步骤 3:在渲染循环中更新
function animate() {
  requestAnimationFrame(animate);
  controls.update(); // REQUIRED when enableDamping or autoRotate is true
  renderer.render(scene, camera);
}
animate();
步骤 4:清理时释放
controls.dispose();

OrbitControls

最常用的控件。围绕目标点旋转、平移和缩放。

构造函数
new OrbitControls(camera: THREE.Camera, domElement: HTMLElement)
主要属性
属性类型默认值描述
enabledbooleantrue启用/禁用所有交互
targetVector3(0,0,0)环绕焦点
enableDampingbooleanfalse启用平滑惯性移动
dampingFactornumber0.05惯性强度(0-1)
autoRotatebooleanfalse自动围绕目标旋转
autoRotateSpeednumber2.060fps 下的度/秒
enablePanbooleantrue允许平移
enableRotatebooleantrue允许旋转
enableZoombooleantrue允许缩放
minDistancenumber0最小缩放距离(PerspectiveCamera)
maxDistancenumberInfinity最大缩放距离(PerspectiveCamera)
minZoomnumber0最小缩放值(OrthographicCamera)
maxZoomnumberInfinity最大缩放值(OrthographicCamera)
minPolarAnglenumber0最小垂直角度(弧度)
maxPolarAnglenumberMath.PI最大垂直角度(弧度)
minAzimuthAnglenumber-Infinity最小水平角度(弧度)
maxAzimuthAnglenumberInfinity最大水平角度(弧度)
screenSpacePanningbooleantrue在屏幕平面(true)或水平面(false)内平移
zoomToCursorbooleanfalse朝光标位置缩放
panSpeednumber1.0平移速度倍率
rotateSpeednumber1.0旋转速度倍率
zoomSpeednumber1.0缩放速度倍率
mouseButtonsobject{LEFT: ROTATE, MIDDLE: DOLLY, RIGHT: PAN}鼠标按键映射
touchesobject{ONE: ROTATE, TWO: DOLLY_PAN}触摸手势映射
keysobject{LEFT, UP, RIGHT, BOTTOM}用于平移的箭头键代码
方法
方法签名描述
update(deltaTime?)(number?) => boolean更新控制状态。启用阻尼/自动旋转时,必须每帧调用
dispose()() => void移除所有事件监听器
saveState()() => void保存当前相机位置/目标/缩放值
reset()() => void恢复到上次保存的状态
getDistance()() => number相机到目标的距离
getPolarAngle()() => number垂直角度(弧度)
getAzimuthalAngle()() => number水平角度(弧度)
listenToKeyEvents(el)(HTMLElement) => void启用键盘平移
stopListenToKeyEvents()() => void禁用键盘平移
事件
事件触发条件
change相机位置或目标发生变化
start用户开始交互(pointerdown)
end用户结束交互(pointerup)

MapControls

针对俯视地图导航优化的 OrbitControls 子类。

按键OrbitControlsMapControls
鼠标左键旋转平移
鼠标中键DollyDolly
鼠标右键平移旋转

所有属性、方法和事件都与 OrbitControls 相同。唯一的区别是默认的 mouseButtons 映射,以及 screenSpacePanning 默认值为 true。


FlyControls

六自由度飞行相机。使用 WASD 移动、QE 翻滚、RF 上下移动。

主要属性
属性类型默认值描述
movementSpeednumber1.0平移速度
rollSpeednumber0.005翻滚旋转速度
dragToLookbooleanfalse需要拖动鼠标才能旋转(而非始终跟随鼠标)
autoForwardbooleanfalse自动向前移动
方法
  • update(delta) -- 始终传入时钟的 delta 时间。绝不能省略此参数。
  • dispose() -- 移除事件监听器。

PointerLockControls

使用 Pointer Lock API 的第一人称摄像机。隐藏并捕获鼠标光标。

关键属性
属性类型默认值描述
isLockedboolean只读指针当前是否已锁定
maxPolarAnglenumberMath.PI最大垂直视角
minPolarAnglenumber0最小垂直视角
pointerSpeednumber1.0鼠标灵敏度倍率
方法
方法描述
lock()请求锁定指针(必须由用户手势触发)
unlock()退出指针锁定
connect()添加事件监听器
disconnect()移除事件监听器
dispose()完整清理(调用 disconnect)
getObject()返回受控摄像机
getDirection(target)将视线方向写入目标 Vector3
moveForward(distance)向前移动摄像机
moveRight(distance)横向移动摄像机
事件
事件触发条件
change摄像机朝向发生变化
lock指针锁定已生效
unlock指针锁定已解除

务必在动画循环中自行实现 WASD 移动。PointerLockControls 只处理视线方向,不处理位置。


TransformControls

用于移动、旋转和缩放场景对象的交互式操作控件。

关键属性
属性类型默认值描述
modestring'translate''translate'、'rotate' 或 'scale'
spacestring'world''world' 或 'local' 坐标空间
showXbooleantrue显示 X 轴控柄
showYbooleantrue显示 Y 轴控柄
showZbooleantrue显示 Z 轴控柄
sizenumber1操作控件的视觉缩放比例
translationSnap`numbernull`null
rotationSnap`numbernull`null
scaleSnap`numbernull`null
draggingboolean只读用户当前是否正在拖动
方法
方法描述
attach(object)将操作控件附加到场景对象
detach()从当前对象移除操作控件
setMode(mode)设置变换模式
setSpace(space)设置坐标空间
setSize(size)设置操作控件缩放比例
setTranslationSnap(snap)设置位置吸附
setRotationSnap(snap)设置旋转吸附
setScaleSnap(snap)设置缩放吸附
getRaycaster()访问内部射线投射器
dispose()清理
事件
事件触发条件
change操作控件外观发生变化
dragging-changed开始拖动时,event.value 为 true;结束时为 false
objectChange附加对象的变换已修改
mouseDown指针在操作控件上按下
mouseUp指针从操作控件上释放
关键集成模式

务必在操作控件拖动期间禁用摄像机控件:

transformControls.addEventListener('dragging-changed', (event) => {
  orbitControls.enabled = !event.value;
});

务必将 TransformControls 添加到场景中:scene.add(transformControls.getHelper()) 或 scene.add(transformControls)。


简要概述:其他控件

ArcballControls

支持动画状态的无限制旋转。没有极角限制——摄像机可以向所有方向自由旋转。最适合 CAD 风格的模型检查。

TrackballControls

类似于没有极角限制的 OrbitControls。摄像机可以越过极点旋转。属性:rotateSpeed、zoomSpeed、panSpeed、staticMoving、dynamicDampingFactor。

DragControls

沿平面拖动场景对象。构造函数:new DragControls(objects, camera, domElement)。事件:dragstart、drag、dragend、hoveron、hoveroff。

FirstPersonControls

不使用指针锁定的鼠标视角摄像机。属性:movementSpeed、lookSpeed、activeLook、constrainVertical、verticalMin、verticalMax。


参考链接

官方来源

评论

支持 Markdown