Three.js 交互实现:射线检测、相机控制与对象拾取

解决 3D 场景从“静态渲染”到“动态交互”的跨越:通过射线检测实现精准的对象拾取,并利用多种相机控件构建流畅的用户视角操纵体验。

为什么需要这个技能

在 3D 空间中,鼠标点击的是 2D 屏幕,而目标对象处于 3D 坐标系。要实现“点击某个 3D 物体”的功能,不能简单地使用 DOM 事件,而需要通过射线检测(Raycasting):从相机位置向鼠标点击方向发射一条虚拟射线,计算该射线与哪些 3D 几何体相交。

此外,一个可用的 3D 应用需要灵活的视角切换。掌握不同的相机控件(如 OrbitControls、PointerLockControls)能让用户像在专业软件或游戏中一样,自由地旋转、缩放和移动视角。

适用场景

  • 3D 产品展示:点击产品零件显示详细信息或更换颜色。
  • 数据可视化:在 3D 图表中通过鼠标悬停(Hover)高亮特定数据点。
  • 第一人称视角应用:构建 3D 虚拟展厅、简单游戏或建筑漫游。
  • 编辑器工具:实现类似 Unity/Blender 的物体平移、旋转和缩放 Gizmo。

核心工作流

1. 实现对象拾取 (Raycasting)

通过将屏幕 2D 坐标转换为标准设备坐标(-1 到 +1),利用 THREE.Raycaster 检测交点。

const raycaster = new THREE.Raycaster();
const mouse = new THREE.Vector2();

function onClick(event) {
  // 转换为标准设备坐标
  mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

  raycaster.setFromCamera(mouse, camera);
  const intersects = raycaster.intersectObjects(scene.children);

  if (intersects.length > 0) {
    console.log("选中对象:", intersects[0].object);
  }
}

2. 配置相机操纵 (Controls)

根据应用类型选择控件:

  • OrbitControls:围绕目标点旋转,适用于产品展示。
  • PointerLockControls:锁定鼠标,适用于第一人称视角。
  • FirstPersonControls:简单的前向移动与视角转动。

3. 增强交互体验

  • TransformControls:添加坐标轴辅助器,实现对象的精准移动、旋转和缩放。
  • DragControls:允许用户直接在场景中拖拽 3D 物体。
  • 坐标转换:使用 vector.project(camera) 将 3D 世界坐标转换为 2D 屏幕坐标,从而在 3D 物体上方悬浮 HTML UI 标签。

下载和安装

下载 threejs-interaction 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐