我想用 JS 开发一个浏览器 3D 场景下的物品查询工具 ItemFindManager, 借助 octree 算法结构来实现 物品数超过 100,000 个, 基于物品的 OBB 包围盒进行各种查询操作, 并可能存在频繁且少量的点位更新/删除操作 查询方法包括: 1.根据位置,获取命中到物品OBB包围盒的所有物品ID集合 2.根据位置和距离,获取给定范围内,OBB包围盒碰到的所有物品ID集合 3.给定一个矩形区域 (x1,z1)->(x2,z2),获取物品OBB包围盒与矩形有交集的所有物品ID集合 不要创建 Mesh 不要创建 Group 物品不用管渲染(不用去到 Scene / 不用管纹理和材质),但期望他最大程度的使用 BufferGeometry 用显卡来运算 OBB 不用刻意追求,可以先用 AABB 进行检索,再通过 OBB 进行进一步筛选达到目的 物品的结构是 export interface ItemMetrix { /** * 物体ID, 唯一标识 */ id: string /** * 变换矩阵, 3x3矩阵, X轴正增长向右, Y轴正增长向屏幕外, Z轴正增长向下。右手坐标系 */ tf: [ /** * 平移向量 position, 三维坐标 * [0]=x轴向右, [1]=y轴高度向屏幕外, [2]=z轴向下 */ [number, number, number], /** * 旋转向量 rotation, 单位为度 * [0]=X轴逆向旋转角度, [1]=Y轴逆向旋转角度, [2]=Z轴逆向旋转角度 * 对应 three.js 应进行"角度"转"弧度"的换算 */ [number, number, number], /** * 缩放向量 scale, 三维缩放比例, [0]=X宽度, [1]=Y高度, [2]=Z长度 */ [number, number, number], ] } 参考: import * as THREE from 'three' /** * 物品 OBB 包围盒管理器 * 物品数超过 100,000 个, 基于物品的 OBB 包围盒进行各种查询操作 * 并可能存在频繁且少量的点位更新/删除操作 */ export default class ItemObbManager { /** * 添加或更新物品 (根据ID) */ addOrUpdate(...items: ItemMetrix[]): void { } /** * 根据 ID 移除物品 */ remove(...ids: string[]): void { } /** * 根据位置,获取命中到物品OBB包围盒的所有物品ID集合 * @param x 位置X坐标 * @param z 位置Z坐标 */ getItemsByPosition(x: number, z: number): string[] { return [] } /** * 根据位置和距离,获取给定范围内,OBB包围盒碰到的所有物品ID集合 * @param x 位置X坐标 * @param z 位置Z坐标 * @param distance 范围距离 */ getItemsByDistance(x: number, z: number, distance: number): string[] { // Implementation for getting items by distance return [] } /** * 给定一个矩形区域 (x1,z1)->(x2,z2),获取物品OBB包围盒与矩形有交集的所有物品ID集合 */ getItemsByRect(x1: number, z1: number, x2: number, z2: number): string[] { return [] } /** * 给定一个矩形区域 (x1,z1)->(x2,z2),获取物品OBB包围盒完全在矩形内的物品ID集合 */ getItemsByRectInclude(): string[] { return [] } }