当前位置: 首页 > news >正文

three自带的框选工具SelectionBox、SelectionHelper

🧱 一、SelectionBox 是什么?

SelectionBox 是 Three.js 示例库中的一个工具类(examples/jsm/interactive/SelectionBox.js),
用于通过定义一个**三维空间包围盒(Box3)**来选中视野内的物体。

换句话说:

它根据相机、鼠标拖拽时的起点和终点,在 3D 世界中计算出被框选区域(视锥体内)的所有对象。

 

🌐 典型用法

import { SelectionBox } from 'three/examples/jsm/interactive/SelectionBox.js';const selectionBox = new SelectionBox(camera, scene);
  • 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">
并根据鼠标拖拽动态调整其位置和大小。

 

🧰 三、完整示例 — 鼠标框选物体

下面是一个完整、可运行的代码例子,展示如何结合两者实现框选高亮:

 
import * as THREE from 'three';
import { SelectionBox } from 'three/examples/jsm/interactive/SelectionBox.js';
import { SelectionHelper } from 'three/examples/jsm/interactive/SelectionHelper.js';// 场景基础配置
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
camera.position.set(0, 2, 5);const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);// 添加地面与立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0x0088ff });
for (let i = 0; i < 20; i++) {const cube = new THREE.Mesh(geometry, material.clone());cube.position.set(Math.random() * 8 - 4, 0.5, Math.random() * 8 - 4);scene.add(cube);
}// 初始化 SelectionBox 与 Helper
const selectionBox = new SelectionBox(camera, scene);
const helper = new SelectionHelper(renderer, 'selectBox');let selectedObjects = [];function render() {requestAnimationFrame(render);renderer.render(scene, camera);
}
render();// 鼠标事件
function getNormalizedPosition(event) {return new THREE.Vector2((event.clientX / window.innerWidth) * 2 - 1,-(event.clientY / window.innerHeight) * 2 + 1);
}window.addEventListener('pointerdown', (event) => {for (const obj of selectedObjects) obj.material.color.set(0x0088ff); // 重置颜色selectedObjects = [];selectionBox.startPoint = getNormalizedPosition(event);selectionBox.endPoint = getNormalizedPosition(event);
});window.addEventListener('pointermove', (event) => {if (helper.isDown) {selectionBox.endPoint = getNormalizedPosition(event);selectionBox.select(); // 实时更新选中}
});window.addEventListener('pointerup', (event) => {selectionBox.endPoint = getNormalizedPosition(event);const allSelected = selectionBox.select();selectedObjects = allSelected;for (const obj of selectedObjects) obj.material.color.set(0xff8800);
});

🎨 CSS 样式(用于框选矩形)

.selectBox {border: 1px solid #55aaff;background-color: rgba(75, 160, 255, 0.1);position: fixed;pointer-events: none;z-index: 100;
}

🧠 四、交互逻辑总结

操作 功能
mousedown 记录起点、清空旧选中
mousemove 更新终点,更新 SelectionHelper
mouseup 获取选中对象、更新高亮

⚡ 五、扩展建议

  • 可以在 pointerup 事件中配合 OutlinePass 做选中高亮;

  • 或在场景中为选中对象添加包围框;

  • 若对象很多,建议限制参与检测的层级(例如仅检测 scene.children)。

http://www.zskr.cn/news/22759.html

相关文章:

  • 10 17
  • 2025年铝单板厂家推荐排行榜,氟碳铝单板,木纹铝单板,冲孔铝单板,外墙铝单板,雕花铝单板,异形铝单板,双曲铝单板公司推荐!
  • 2025 年最新推荐热熔胶源头厂家榜:覆盖书刊装订 / 包装等场景,助企业选高性价比产品
  • C++中的new操作符:new operator、operator new、placement new
  • C++20 协程的简单示例
  • 同一设备多账号登录,如何避免消息推送“串门”?
  • Character Animator 2025下载安装教程:2D角色动画软件零基础入门,附最新下载安装教程及激活方法
  • 2025年彩钢瓦/镀锌板/折弯件/C型钢/Z型钢/压型瓦/楼承板/次檩条厂家推荐排行榜,专业钢结构安装与定制加工实力解析
  • 完整教程:display ospf peer 概念及题目
  • 开源数据采集工具 logstash(收集日志)/telegraf(收集指标)
  • 2025 年堆高车厂家最新推荐排行榜:聚焦专利技术、华为等大牌合作案例及国内优质品牌解析手动液压/手动液压/卷筒/油桶堆高车厂家推荐
  • Excelize 开源基础库发布 2.10.0 版本更新
  • 高效搞定outlook大附件怎么发送的方法与技巧
  • HAP 签名提取:从定位到解析的实操指南
  • 内外网文件传输工具有哪些?最强合集在这里
  • 用delegate 和event实现事件(有参和无参,有返回值和无返回值)
  • 跨网文件交换系统是什么?解锁企业高效数据传输新姿势
  • 详细介绍:5、软件工程
  • vscode 里面的python切环境
  • ChromeOS融合Android技术栈,打造更智能的Chromebook体验
  • 2025 年最新推荐国际物流服务公司权威排行榜:聚焦海运快递跨境专线,助力商家选优质物流伙伴
  • 2025年国内高温隧道炉知名品牌推荐,固化炉,回流焊炉,连续式烘干线厂家供货商!
  • 2025年10月17日信息公布:太阳能路灯厂家最新推荐榜~覆盖乡村户外、单臂双臂、农村及5-8米LED款,精选优质路灯企业
  • 基于ZigBee的无线传感器组网
  • 2025 年立体画厂家最新推荐榜单:涵盖 3D 光栅立体画、立体光栅卡、3D 装饰立体画、三维立体画,助企业与消费者精准挑选优质品牌
  • 完整教程:「2025秋招季」AI简历筛选如何破解海选难题?
  • F1分数(F1-score)
  • ComfyUI InstantID 文生图,图生图完整运行指南
  • Qt项目作品在苹果macos上编译运行效果/视频监控系统/物联网平台等
  • 2025年靠谱的风机/离心风机/轴流风机生产企业排行榜-江苏中南鼓风机有限公司