码迷,mamicode.com
首页 > 其他好文 > 详细

Quake3 BSP地图 碰撞检测

时间:2015-04-18 14:43:04      阅读:371      评论:0      收藏:0      [点我收藏+]

标签:quake3   bsp地图   碰撞检测   

引子:网上Quake3 BSP地图的资料比较少,翻来翻去,也没有时间及能力去分析Quake3源代码,所以对Quake BSP地图格式中具体存储了哪些内容,其代表什么,一直一知半解地根本搞不清楚(尤其是brush)。本来想想能够渲染就行了,直到纠结于碰撞检测,实在没办法有继续查资料。看来看去,又整理思路(猜+验证!!!!),今天终于有所进展。。。


整个地图场景空间以bsp树生成方式被一些平面(结构化面)划分大量凸面体,最后整个空间被组织成了一棵bsp树,内部节点node只保存分割面,叶子节点leaf就是最后分割而成凸面体。但是由于上述分割中同一平面不会被选取两次,造成了实心和空心共存的凸面体(如下图由分割面1,5‘与“围墙”构成的区域),因此在叶子节点内部再根据实心与空心再进行划分:

1)空心凸面体:即其内部是空的,就只有空间。其是由原来没有任何物体的空间(如房间、走廊这样的空间)经平面划分而来。

2)实心凸面体:及其内部是有填充物的,其是由原来实心的空间(如墙体内部)经平面划分而来。在BSP文件中被称为brush!!注意BSP中Brushs还要一部分是由可移动物体包围定义的

技术分享

小结:最后叶子中抛弃了内部空的空心凸面体,而只保存了实心的实心凸面体brush用于碰撞检测,同时还保存了与该叶子代表的凸面体有相交的face。ploygon类型的face是由构成整个场景“围墙”或提供分割面而参与空间划分的模型(如墙)的表面多边形,而mesh类型的face是不参与空间划分的细节模型(如不柱子)的模型。

验证:

  1. leaf中n_numface为非0,n_numbrush为0,因为此凸空间内部是空心的,但是表面却是模型的表面

  2. leaf中n_numface为0,而n_numbrush非0,因为整个此空间是有实心体的,而表面不是模型的表面


Quake3 BSP地图 碰撞检测

标签:quake3   bsp地图   碰撞检测   

原文地址:http://4902717.blog.51cto.com/4892717/1634800

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!