OSG 八叉树 与 Kd Tree

2018-09-01

   在游戏或者CAD程序中,我们经常面对的一个需求:已知空间(多数是二维、三维,也有少数高维空间)内的一个物体,求解距离它最近的k个物体是哪些。当然,这个问题可能很简单,假设空间内只有几百几千、甚至几万个个物体,我们只需要遍历一下即可。也花费不了几毫秒时间。但是,当空间内的物体有几百万、几千万个的时候呢,或者几亿几十亿呢?你个简单的查找就耗费几十分钟、几个小时,这绝不能忍受。所以,我们需要加速的优化手段。
   一个朴素的方法就是,先求解所有物体所占的空间的BoundingBox,名为bb,以后所有的操作只考虑这个bb空间,不会超过这个范围。把空间平均分割一下,如一维空间分成两份,二维空间就平均分成四份,三维空间就平均分成八份,n维空间就平均分成n^2份,切割完成后,把整体当作父节点,把小的一份当作子节点,那这就是二进制空间分割树,以上分别对应着二叉树、四叉树、八叉树。当把空间平分了之后,我们就可以向周围的子空间询问:是否有包含物体;包含了几个物体?假设物体在空间内均匀分布,那么就意味着只需要向邻居子空间询问即可完成搜索工作。
   但是,假如物体在空间中的分布不均匀呢?假想操场上只有一棵树,对这棵树建立包围盒bb,我们包围盒空间进行八叉树划分,递归的多进行m次,且假设m比较大,比如10。若地面上一无所有,一片叶子掉下来落在地面上,问:距离这片叶子最近的其他一片叶子在哪里?那得问多少次才能问到目标。八叉树的构建非常简单。但是,如果我们只偏重于查询,这样子就很浪费了。一个简单的优化就是:不再平分空间,而是稀疏的地方一个子空间很大,稠密的地方子空间就很小,这样就能通过向身边的子空间询问而很快获知最近的物体在哪个子空间。
   Kd Tree的构造方式和八叉树不一样。因为Kd Tree是二分树,而八叉树 是八分的。八叉树的leaf node把元素包含在内部,而Kd Tree以元素所在平面来划分空间,形成不同的节点,元素不单独属于任何一个节点。
   上面讨论的用途是邻近搜索。3D程序中还有一个更重要的需求是划分场景并优化,可做遮挡查询、LOD。
   CAD程序中,一般

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值