使用 C# 编写的动态、松散的 Unity octree 实现
请注意:此仓库不再维护。 UnityOctree ============ 这是一款用 C# 编写的动态八叉树实现,最初是为我的游戏 Scraps 编写的,但其目的是用于通用场景。 这里有两种八叉树实现: BoundsOctree 可存储任何类型的对象,对象边界定义为轴对齐的包围盒。它是一个动态八叉树,也可以是一个松散八叉树。 PointOctree 采用相同的基本实现,但将对象存储为空间中的一个点,而不是边界。这可以简化代码。它也是一个动态八叉树。
Octree: Octree 是一种树状数据结构,将 3D 空间分成更小的分区(节点),并将对象放入相应的节点。这样可以快速访问感兴趣区域中的对象,而无需检查每个对象。
松散: 八叉树的节点可以比其父节点的长度和宽度大 1/2,因此它们在一定程度上会重叠。这可以缓解非常小的物体如果靠近边界而最终出现在大节点中的问题。松散度为 1.0 将使其成为一个"正常"的八叉树。
使用 BoundsOctree,您可以传入边界,并获得是否与任何物体发生碰撞的真/假答案(IsColliding),或者获得与之发生碰撞的所有物体的列表(GetColliding)。使用 PointOctree,您可以投射一条光线,并获得距离该光线 x 个单位的所有物体的列表(GetNearby)。此外,您还可以获得距离指定原点 x 个单位的物体的列表。如果需要,实现其他函数应该不太困难。例如,PointOctree 可以检查是否有点位于给定的边界内。
树搜索是递归的,因此在非常大的树上,理论上存在栈溢出的可能性。minNodeSize 参数限制了节点大小。
暂无开放 Issues,或尚未同步最近议题。