three自带的框选工具SelectionBox、SelectionHelper
🧱 一、SelectionBox 是什么?
SelectionBox 是 Three.js 示例库中的一个工具类(examples/jsm/interactive/SelectionBox.js),
用于通过定义一个**三维空间包围盒(Box3)**来选中视野内的物体。
换句话说:
它根据相机、鼠标拖拽时的起点和终点,在 3D 世界中计算出被框选区域(视锥体内)的所有对象。
🌐 典型用法
-
camera:用于确定视野。 -
scene:搜索物体的根节点。 -
拖拽时更新起点/终点,再调用
selectionBox.select()获取选中的对象列表。
📦 常用属性/方法
| 属性 / 方法 | 说明 |
|---|---|
startPoint |
拖拽起点(NDC 坐标,即 -1~1) |
endPoint |
拖拽终点(NDC 坐标) |
collection |
当前选中的对象数组 |
select() |
执行选择逻辑,返回选中的对象数组 |
updateFrustum() |
更新内部视锥体,用于优化性能 |
🧩 二、SelectionHelper 是什么?
SelectionHelper 是用于辅助显示的一个小类(examples/jsm/interactive/SelectionHelper.js)。
它的作用是:在屏幕上画出一个矩形框(通过
<div>叠加),显示鼠标框选范围。
它不参与 3D 计算,只负责 UI 层面的可视化。
🌐 用法示例
import { SelectionHelper } from 'three/examples/jsm/interactive/SelectionHelper.js';
const helper = new SelectionHelper(renderer, 'selectBox');
-
renderer:Three.js 渲染器,用来确定附着的 DOM。 -
第二个参数
'selectBox'是 CSS 类名(可用于自定义样式)。
SelectionHelper 会自动创建一个 <div class="selectBox">,
并根据鼠标拖拽动态调整其位置和大小。
🧰 三、完整示例 — 鼠标框选物体
下面是一个完整、可运行的代码例子,展示如何结合两者实现框选高亮:
🎨 CSS 样式(用于框选矩形)
🧠 四、交互逻辑总结
| 操作 | 功能 |
|---|---|
mousedown |
记录起点、清空旧选中 |
mousemove |
更新终点,更新 SelectionHelper 框 |
mouseup |
获取选中对象、更新高亮 |
⚡ 五、扩展建议
-
可以在
pointerup事件中配合OutlinePass做选中高亮; -
或在场景中为选中对象添加包围框;
-
若对象很多,建议限制参与检测的层级(例如仅检测
scene.children)。

浙公网安备 33010602011771号