我最近了解了二进制空间分区树及其在三维图形和碰撞检测中的应用。我还简要地阅读了与四叉树和八叉树相关的材料。你什么时候在bsp树上使用四叉树,反之亦然?它们可以互换吗?如果我有足够的信息来填写这样的表格,我会感到满意:
| BSP | Quadtree | Octree
------------+----------------+-------
Situation A | X | |
Situation B | | X |
Situation C | | | X
A,B和C是什么?
答案 0 :(得分:63)
您的问题没有明确的答案。这完全取决于您的数据的组织方式。
要记住的事情:
Quadtrees最适用于大多数二维数据,如导航系统中的地图渲染。在这种情况下,它比八叉树更快,因为它更好地适应几何,并使节点结构保持较小。
如果数据是三维的,则八叉树和BVH(边界体积层次结构)会受益。如果几何实体聚集在3D空间中,它也可以很好地工作。 (见Octree vs BVH)
Oc-和Quadtrees的好处是你可以随时停止生成树木。如果您想使用图形加速器渲染图形,它允许您只在对象级别生成树,并通过单个绘图调用将每个对象发送到图形API。这比发送单个三角形更好地执行更多(如果您在最大程度上使用BSP-Trees,则必须执行此操作)。
BSP-Trees真的是一个特例。它们在2D和3D中工作得非常好,但是生成好的BSP树本身就是一种艺术形式。 BSP-Trees的缺点是您可能需要将几何体分成更小的部分。这可以增加数据集的整数面数。它们很适合渲染,但它们更适合碰撞检测和光线跟踪。
BSP树的一个不错的特性是它们将多边形汤分解成一个结构,可以从任何相机位置完美地渲染回前面(反之亦然),而无需进行实际排序。每个视点的顺序是数据结构的一部分,在BSP-Tree编译期间完成。
顺便说一下,这就是他们10年前如此受欢迎的原因。 Quake使用它们是因为它允许图形引擎/软件光栅化器不使用昂贵的z缓冲区。提到的所有树木都只是树木的家庭。还有松散的八叉树,kd树混合树和许多其他相关结构。
答案 1 :(得分:12)
BSP-Trees与其他类型的3d树之间最大的实际区别在于BSP-Trees可以更加优化,但仅适用于静态几何。这是因为BSP-Trees的构建速度通常非常慢,通常需要数小时或数天来完成典型的静态城市游戏级别。
BSP-Trees需要更长时间构建的两个主要原因是(a)它们使用非轴对齐的分裂平面,这需要更长时间才能最佳地找到,以及(b)它们在轴边界上细分几何体,确保没有物体交叉分裂飞机。
其他类型的3d树(八叉树,四叉树,kd树,边界 - 体积 - 层次结构)使用轴对齐的边界体积,并且(可选)允许体积重叠,因此不需要包含的对象在体积边界上切割。这些都使树木不如BSP树更优化,但构建速度更快,动态对象更容易更换。
将这些因素外推到情境......
室外区域通常使用基于高度场的地面表示,简单的高度图或更复杂的地理mip映射技术(如ROAM)。地面本身并不参与三维空间划分,只有物体放置在地面上。
具有更多更简单和相似几何(房屋,树木,小行星等)的实例的世界通常会使用非BSP树(例如BVH),因为将几何体放入BSP树将意味着重复并为每个实例拆分细节几何。
相反,没有实例化的大型自定义静态网格(例如城市场景或复杂的室内环境)通常会使用BSP树来提高运行时性能。 BSP-Tree在节点边界上分割几何图形有助于渲染性能,因为BSP节点可以用作预先组织的三角形渲染批次。 BSP-Tree也可以针对遮挡进行优化,从而无需绘制已知位于其他几何体后面的BSP树的部分。
另请参阅:Octree vs BVH,Bounding Volume Hierarchy Tutorial,BSP Tutorial。
答案 2 :(得分:6)
BSP最适合城市环境。
当你使用地形等高度图时,最好使用四叉树
当你在三维空间中拥有几何体时,例如太阳系,最适合使用八叉树。
答案 3 :(得分:3)
BSP是加速碰撞检测的好选择,具体取决于您使用的风味。它们在点和线或射线测试中速度特别快,对于具有音量的物体来说速度稍慢,而且更复杂。
至于它们在图形中的使用,BSP几乎已经过时了。对于诸如AABB树之类的总体能见度剔除等问题,八分之一的效果很好。
答案 4 :(得分:0)
我对BSP没有多少经验,但我可以说当你渲染的场景很高时,你应该使用四叉树的八叉树。也就是说,高度超过宽度和深度的一半 - 几乎没有经验法则。一般来说,八叉树不会比四叉树带来巨大的成本,它们有可能加快速度。 YMMV。
答案 5 :(得分:0)
通常这些事情都没有明确的答案。我建议A,B和C是你的空间大小和你所区分的东西的函数的结果。
答案 6 :(得分:0)
BSP最适合更小,更简单的空间,您只想进行遮挡。如果您想要给定光线的所有交叉点,则需要升级到四边形/八叉树。
至于四叉树与八叉树 - 你关心多少维度?两个维度表示四叉树,四个八叉树。如上所述,由于四叉树可以在三个空间中工作,但如果您希望每个维度都得到适当的处理,那么八叉树就可以了。
答案 7 :(得分:0)
除非您知道自己总是在做什么,否则您可以停止专注于过度优化而着手开发更重要的功能。严重地,瓶颈总是存在于其他地方,或者您正在围绕优化的系统设计代码,最终最终阻止了某些类型的更改。