在quake bsp场景中漫游,需要检测是否与场景中物体碰撞,如主角从一个台阶上跳下,经过自由落体,然后接触到地板
碰撞是由brush来实现的,
brush有多种形式,简单情况下,可以理解为一个六面体(长方体或者立方体),并且六个面都朝内,
这样带来一个性质,如果一个点位于某一个面后面,它一定不在brush之内,也就是不与brush碰撞.
quake首先确定一条线段(代码了物体移动的起始与终结位置),有start与end,通过这条线段与场景中brush碰撞,
决定物体能否从start移动到end,如果不能,碰撞点在哪等
首先沿着bsp树进行剪枝,主要根据bsp切割面,判断start与end与面的距离
决定沿着哪个子树进行查找,或者两边子树都是进行递归查找
进入叶子节点时,最终是处理该节点内每个brush与 start end标识的线段的碰撞
循环brush的每个平面,如果start与end都在平面之后,则认为与该brush没有碰撞
如果都在该平面之前,则忽略继续处理
如果start end分别位与平面的两边,则应该进行分别判断,
如果start在平面的后面,即start_dis为正 end_dis为负,标记一个enter_frag,
反之,标记一个leave_frag,
循环每个平面,记下 enter_frag与leave_frag的最小值,
如果enter_frag小于leave_frag,则表示与该brush碰撞了