cp的小屋

not yet

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  26 随笔 :: 0 文章 :: 200 评论 :: 1 Trackbacks

    碰撞检测是3D引擎的重要组成部分,3D游戏中子弹、法术飞行中的碰撞检测,子弹和法术的命中效果,人物移动和场景的阻挡关系都需要高效率的碰撞检测系统来完成。在碰撞检测系统的实现中效率是至关重要的。试想如果你被告知某个碰撞检测函数每帧最多只能调用30次,那么你在使用时就会小心翼翼、束手束脚,反之如果被告知某个碰撞检测函数几乎没有开销,可以自由使用,那我们写起游戏逻辑来就轻松多了,可以实现更多更丰富的交互效果。

    BSP树就是一种针对静态场景进行高效碰撞检测的数据结构。一直想对BSP树进行深入的研究,苦于没有详细的资料。最近在浏览博客的时候看到丁欧南朋友写的《The Annotated ATI SDK BSP Tree Source》系列文章,发现其中的代码简单易读、清晰明了,于是研究之。修改了其中的bug,并增加了运动中的球体和AABB包围盒与BSP树的碰撞检测函数。
    附《The Annotated ATI SDK BSP Tree Source》链接:
    http://blog.csdn.net/Silent_Spring/archive/2006/08/09/1042888.aspx

    由于BSP树原理比较复杂,这里不做具体讨论,仅列出一些测试数据供大家参考。另外由于BSP树自身的一些限制,在现在的游戏中使用逐渐减少,不少游戏使用八叉树或KD树管理碰撞检测,或者直接使用成熟的物理引擎进行碰撞检测。希望在这方面有经验的朋友也可以提供一些具体数据以和BSP树进行比较,供大家在选择方案时决策。

    下面测试数据使用的场景模型取自“魔兽世界”

    1.生成BSP树后三角形数目提高了3-5倍,理论化的数据应该是原多边形数目n的log(n)倍

    2.在P4 3G的机器上做模型与线段的相交测试,所得数值为每秒可进行的检测数目,数据如下:
                                             逐三角形遍历测试          用BSP树测试
       模型面数
       1000                              5000次                              200000次
       5000                              1000次                              200000次
    可以看出,不使用BSP树,每秒可进行的检测数目和模型面数成反比,使用BSP树可进行的检测数目和模型面数关系不大,使用BSP树后的效率比不使用平均高40-200倍

    3.在P4 3G的机器上做BSP树与运动球体的相交测试,所得数值为每秒可进行的检测数目,数据如下:
                                       每秒可测试次数  
      模型面数
      1000                         30000次    
      5000                         30000次 

    4.在P4 3G的机器上做BSP树与运动AABB包围盒的相交测试,所得数值为每秒可进行的检测数目,数据如下:
                                       每秒可测试次数  
      模型面数
      1000                         20000次    
      5000                         20000次 

    以上数据为粗略平均数据,仅供参考

    在QUAKE系列和UNREAL系列游戏中使用的BSP树为Solid Leaf BSP,就是叶子节点严格符合正面为空间,被面为实体的规则。这样的BSP树需要特殊的场景建模工具来生成,用3DMax生成的普通模型很难达到这个要求,所以上面的测试数据都是针对非Solid Leaf BSP树的普通BSP树。比起普通BSP树,Solid Leaf BSP树有更高的检测效率。Solid Leaf BSP树可以不在节点保存三角形信息,仅保存平面信息,而普通BSP树就必须在节点保存三角形信息,在碰撞检测的某些时候需要拿出这些三角形信息做开销较大的运算。


球体和场景匹配


AABB包围盒和场景匹配

posted on 2006-12-01 11:46 cproom 阅读(1933) 评论(17)  编辑 收藏

评论

#1楼  2006-12-03 00:08 arenak [未注册用户]
请教文中提到每秒“可检测数目”指检测什么碰撞的数目?
  回复  引用    

#2楼 [楼主] 2006-12-03 10:36 cproom      
指线段和BSP,球体和BSP,AABB和BSP,也就是说一次完整的碰撞检测
  回复  引用  查看    

我在3D游戏这本书里也看到BSP,觉得是非常恐怖的算法。我最近在做一个小型的飞行模拟游戏。现在用fixfunction已经基本做出来,下一步你觉得我是做hlsl来进行更好的渲染还是用bsp来做更漂亮的地形?
  回复  引用    

#4楼 [楼主] 2006-12-04 10:24 cproom      
做地形好像很少用BSP,做hlsl或者做地形都可以,哪个顺手,哪个前期积累得差不多了,可以比较快的实现就做哪个。
  回复  引用  查看    

#5楼  2006-12-04 11:26 大琦 [未注册用户]
哈哈,不错啊
  回复  引用    

真是谢谢你啊,想不到这么快就得到回复了。我是从“太傻”的链接找到这里的,但是在太傻那里发的帖,n久久没得到回复。
我想做做地形吧。地形用bsp我是这样设想的,用bsp找到视截体内的需要渲染得三角形渲染,这样会不会渲染地形的时候效率比较高?bsp是根据面来分的,那么用视截体的8个面来确定一些范围,感觉好像是可行的。
因为飞行模拟游戏基本不会渲染房屋,所以飞行模拟游戏的地形会数据量比较大,我想。
  回复  引用    

#7楼 [楼主] 2006-12-06 11:05 cproom      
看来你对bsp还不太了解,bsp已经很少用于渲染剔除了,更多的用于碰撞检测,以高度图为基础的室外地形更不可能用bsp做渲染剔除,碰撞检测也有基于高度图更好的算法。室外地形的渲染剔除首先是视锥剪裁,然后可以做pvs或者地平线剔除,还有一些复杂的动态遮挡剔除算法。
  回复  引用  查看    

#8楼  2006-12-06 23:56 arenak [未注册用户]
@cproom

恩,同意你的观点。Bsp通常用于室内场景,比如Quake的bsp文件。还有就是在其他地方看到过说现在的显卡对Bsp支持不是太好,倒是不知道为什么这么说。
  回复  引用    

#9楼  2006-12-07 22:33 空明流转      
编辑器真不错。。。希望LZ能写一些关于编辑器方面的文章。。。这个部分我一直都没有好的办法。。。代码很烦,BUG也很多,也不太好看。
  回复  引用  查看    

问搂主一个问题,编译器自动生成的exe文件里面有没有可能用到simd指令?
那。net指令能够生成利用多个alu同时运算的机器码指令吗?
  回复  引用    

#11楼 [楼主] 2006-12-08 10:55 cproom      
VC可以直接在代码中使用SSE指令集,VC7自动支持,VC6要通过安装最新Patch包来支持。其它开发工具我不了解。
  回复  引用  查看    

哈,很不错啊。把你的blog链接到我的上面去了哦。以后要经常学习学习阿
嘻嘻!
  回复  引用    

#13楼  2007-02-14 12:05 Felicia [未注册用户]
我现在在做一个程序,模拟三维空间内的n个恒星运动情况
他们之间的万有引力计算已经用O(nlogn)时间解决(使用树结构)
但是他们之间的碰撞检测还是O(n^2),有没有办法优化到O(nlogn)?
碰撞的定义就是(把恒星看做球体)
Dist(Star[i],Star[j]) < Star[i].r + Star[j].r
  回复  引用    

#14楼  2007-03-19 19:50 kai [未注册用户]
你好,我在做LOD的时候遇到了问题,请问你一下。
不同细节层次交界面上,会出现地图贴破的现象,请问有没有什么呢方法避免?
  回复  引用    

#15楼  2007-03-26 18:08 kai [未注册用户]
问题已经解决。

  回复  引用    

#16楼  2007-03-30 22:43 PhysDev [未注册用户]
物理开发网引用
http://www.physdev.com/phpbb/cms_view_article.php?aid=28
  回复  引用    

#17楼  2007-03-30 23:02 kai [未注册用户]
楼上的,是cp多次投稿吗?
  回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印
 


Locations of visitors to this page