three自带的框选工具SelectionBox、SelectionHelper

news/2025/10/18 16:27:22/文章来源:https://www.cnblogs.com/Simoon/p/19147239

🧱 一、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.mzph.cn/news/938730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年精密磨床/CNC机械加工厂家推荐榜单:涵盖铣床/车床/磨削/多轴/复合加工,铝/不锈钢/钛合金/模具钢/塑料件定制,汽车/医疗/航空航天/机器人零件及模具工装夹具加工

2025年精密磨床/CNC机械加工厂家推荐榜单:专业采购决策指南行业背景与发展趋势随着制造业向高质量、精密化方向转型升级,精密磨床与CNC机械加工行业正迎来前所未有的发展机遇。在工业4.0和智能制造的大背景下,精密加…

2025 电动缸源头厂家最新推荐榜:剖析国产厂商成本优势与技术实力,附权威选购指南

在工业 4.0 深化推进的背景下,电动缸作为自动化生产的核心动力部件,需求持续攀升,但市场乱象却让采购决策陷入困境。部分厂家依赖外购核心部件导致兼容性差、故障率高,甚至通过减配原材料缩短产品寿命,而近年新兴…

Claude Haiku 4.5新功能、模型与定价,免费试用国内直连教程

Claude Haiku 4.5新功能、模型与定价,免费试用国内直连教程Claude 4.5 的新功能了解 Claude 4.5 中引入的新功能和改进,包括 Sonnet 4.5 和 Haiku 4.5 模型。Claude 4.5 引入了两个针对不同用例设计的模型:Claude S…

网络编程实践笔记_4_阿贝云_免费云服务器_简易博客_

简易博客 AI搜索 python后台有了简单方便的服务器,(在我的理解下还是个电脑主机,只不过连着网,实际就像个内网的AGV小车,可以ssh到他而已), ssh远程控制和scp远程传输文件之后,就可以准备代码了, 没做过网页编…

10 17

4.4终于把这道题调出来了啊/ll,不容易啊/ll 首先我写错的最大的点是 \(sum_x\) 把它也异或了 \(siz_x\) 次 其次是 op = 1 的 soltwo 的时候没有判 \(x = y\) 的情况 然后是 \(soltwo(x,y)\) \(x\) 往上的时候没有让…

深入解析:日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(2):语法 +考え方15+2022年7月N1

深入解析:日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(2):语法 +考え方15+2022年7月N12025-10-17 10:35 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: norma…

2025年铝单板厂家推荐排行榜,氟碳铝单板,木纹铝单板,冲孔铝单板,外墙铝单板,雕花铝单板,异形铝单板,双曲铝单板公司推荐!

2025年铝单板厂家推荐排行榜,氟碳铝单板,木纹铝单板,冲孔铝单板,外墙铝单板,雕花铝单板,异形铝单板,双曲铝单板公司推荐!行业背景与发展趋势铝单板作为现代建筑装饰材料的重要组成部分,近年来在建筑外立面、室…

2025 年最新推荐热熔胶源头厂家榜:覆盖书刊装订 / 包装等场景,助企业选高性价比产品

当前热熔胶应用广泛,却面临产品质量参差不齐、技术适配性不足、服务响应滞后等问题,下游企业在选购时常陷入困境,难以找到契合自身需求的高性价比源头厂家。为解决这一难题,帮助印刷、包装、鞋材等行业企业精准筛选…

开发日志

一个常用的工具:Mapster 进行一些对象属性复制的时候很方便。跟基础库里的DeepCopy配置起来使用。 配置文件的保存:目前基本上还是使用XML为主。 尝试了HASH,JSON,YAML,最终还是感觉XML使用总体体量更好。 XML,可…

Gitee 2025:中国开发者生态的崛起与本土化优势

Gitee 2025:中国开发者生态的崛起与本土化优势 在全球化与本土化交织的软件开发时代,中国开发者正面临一个关键选择:是继续依赖国际化的GitHub,还是拥抱更符合本土需求的Gitee?2025年的今天,这个答案已经变得清晰…

C++中的new操作符:new operator、operator new、placement new

new操作符(new operator) 当你写这种代码时: string *ps = new string("Memory Management"); 你使用的new是new操作符。 new操作符的动作包含两部分:在堆上为创建的对象申请内存 调用对象的构造函数进行…

JavaBean知识总结及范例

一、什么是 JavaBean? JavaBean 本质上是一个符合特定编码约定的 Java 类。它不是一个框架或技术,而是一种标准/规范。遵循这个规范的类,可以被特定的工具(如 IDE、Spring 框架等)更便捷地发现、使用和操作。二、…

C++20 协程的简单示例

C++20 协程的简单示例以下使用编译器版本为:gcc version 11.4.0 c++20 懒得介绍协程是什么,先直接贴一个最简单的例子:1 #include <iostream>2 #include <coroutine>3 #include <stdexcept>4 #in…

HMAC-SHA256 请求签名与验签实践(Python 可直接复用)

HMAC-SHA256 请求签名与验签实践(Python 可直接复用)目标:沉淀一套“能复制即用”的签名/验签规范与代码,解决接口防篡改与防伪造。 关键规则:待签名串:METHOD + "\n" + Content-MD5 + "\n"…

2025 年家装管道生产厂家最新推荐排行榜:覆盖云南昆明贵州贵阳四川成都重庆,精选优质 PPR/PVC 管道品牌,解决选购难题

在家装过程中,管道作为水电系统的核心部件,其质量直接决定居住安全与生活舒适度。当前家装管道市场混乱,部分厂商偷工减料,导致管道抗压差、易老化、密封性不足,漏水渗水问题频发,给业主带来巨大财产损失与生活困…

同一设备多账号登录,如何避免消息推送“串门”?

对各应用厂商而言,推送通知消息是App提高用户活跃度和转化率的高性价比营销工具。然而,当一个用户设备登录多个账号时,开发者可能会遇到同一条消息在同一设备的不同账号上重复展示的问题,这不仅降低了消息推送的精…

强合规行业DevOps选型:告别工具拼凑,找到真正适配的国产化DevOps方案

强合规行业DevOps平台选型需“建体系”,传统开源工具组合易陷数据割裂、合规难达标困境。本文对比三款DevOps产品,其中国产DevOps平台契合信创DevOps需求,内置合规卡点与追溯能力,适配国产化环境,助力企业平衡合规…

实用指南:精读 C++20 设计模式:行为型设计模式——观察者模式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

大疆无人机RTMP推流至LiveNVR实现web页面实时播放与录像回放,并可以转GB28181协议级联推送给上级监控视频管理平台

@目录1、无人机推流转国标2、获取RTMP推流地址2.1、RTMP推流地址格式2.2、推流地址示例2、设备RTMP推流3、配置拉转RTMP3.1、直播流地址格式3.2、直播流地地址示例3.3、通道配置直播流地址4、配置级联到GB28181国标平台…

Character Animator 2025下载安装教程:2D角色动画软件零基础入门,附最新下载安装教程及激活方法

还在找Character Animator 2025怎么下载安装?这份保姆级教程帮你一步到位!不管是做虚拟主播、短视频动画,还是教育课件制作,掌握CH 2025的安装方法是第一步。本文包含详细下载渠道、安装步骤、快捷键及常见问题,看…