引子:网上Quake3 BSP地图的资料比较少,翻来翻去,也没有时间及能力去分析Quake3源代码,所以对Quake BSP地图格式中具体存储了哪些内容,其代表什么,一直一知半解地根本搞不清楚(尤其是brush)。本来想想能够渲染就行了,直到纠结于碰撞检测,实在没办法有继续查资料。看来看去,又整理思路(猜+验证!!!!),今天终于有所进展。。。
整个地图场景空间以bsp树生成方式被一些平面(结构化面)划分大量凸面体,最后整个空间被组织成了一棵bsp树,内部节点node只保存分割面,叶子节点leaf就是最后分割而成凸面体。但是由于上述分割中同一平面不会被选取两次,造成了实心和空心共存的凸面体(如下图由分割面1,5‘与“围墙”构成的区域),因此在叶子节点内部再根据实心与空心再进行划分:
1)空心凸面体:即其内部是空的,就只有空间。其是由原来没有任何物体的空间(如房间、走廊这样的空间)经平面划分而来。
2)实心凸面体:及其内部是有填充物的,其是由原来实心的空间(如墙体内部)经平面划分而来。在BSP文件中被称为brush!!注意BSP中Brushs还要一部分是由可移动物体包围定义的
小结:最后叶子中抛弃了内部空的空心凸面体,而只保存了实心的实心凸面体brush用于碰撞检测,同时还保存了与该叶子代表的凸面体有相交的face。ploygon类型的face是由构成整个场景“围墙”或提供分割面而参与空间划分的模型(如墙)的表面多边形,而mesh类型的face是不参与空间划分的细节模型(如不柱子)的模型。
验证:
leaf中n_numface为非0,n_numbrush为0,因为此凸空间内部是空心的,但是表面却是模型的表面
leaf中n_numface为0,而n_numbrush非0,因为整个此空间是有实心体的,而表面不是模型的表面
原文地址:http://4902717.blog.51cto.com/4892717/1634800