|
|
发表于 2009-5-18 21:37:00
|
显示全部楼层
Re:bsp的疑惑
我觉得bsp把空间划得太细了,一个物体被划得支离破碎的
古时候的硬件渲染每一个三角形都非常昂贵,所以才使用bsp把物体打的很碎,而对现代显卡来说,这样的优化已经逐渐失去意义。
假设你的场景中有100个人物,每个人物都有一个相应的包围盒,理想情况下,每一次分割时,都把物体平均分为2半比如:100-->50/50-->25/25-->.......直到合适的粒度,比如当子空间中的包围盒小于n时,就不在划分。如果有物体正好位于划分平面,那个这个物体将同时添加到所属的2个子空间。
如果你看了我给的链接,我实际上是把动态和静态物体分开的,静态物体的空间划分是预处理好的。
对于动态物体,任何固定规则划分方式都是没有意义的,对一般应用来说,动态物体的数量一般不会太多。假设128*128的区域内,有10个动物体,用quadtree对场景进行4级划分,最小的网格为16*16,那么其中大量节点都是空的,或者称为退化节点。这些冗余的节点不但占用大量空间,而且会影响检测效率。
通常,当检测到有大于或者等于n个退化节点时,就应该对树进行重建,改变细分层次,调整细分空间,可以对整体也可以是部分重建。理想情况下,不应该有退化节点,并且每个节点中的对象个数应该相等。
BVH弹性非常大,你既可以让整个动态树就是一个bvh,也可以仅仅对某个对象使用bvh。
以人体为例,整个人体有包围盒A,A中又包括了头部B,躯干C,四肢d,e,f,g,四肢有可以包含手指脚趾的包围盒,有以下树形结构:
A------B
|---C---h.i......
|---D---......
|---E
|---F
|---G
当做视锥剔除时,可能只需要检测视锥是否和A相交,当碰撞检测时,如果另一个物体和A发生碰撞,那么有可能需要继续检测是否与b,c,d,e,f相交等等,以返回最终结果。bvh中的层次越多,精度也越高,计算量也越大。 |
|