1.4 冲突检测
正如本章开头所阐述的,游戏开发中最重要的问题之一就是冲突检测算法。一些游戏之所以能够占有巨大的市场,正是因为它们的冲突检测例程运行较快,从而为其他的图形操作例程留出了充裕的时间,进而使得程序能够相应地进行更多的游戏操作。
我们可以想像一下不具有冲突检测机制的游戏将会是什么样子:弹球游戏中,球不能进行弹跳;三维迷宫游戏中,游戏角色直接穿墙而过并且子弹不能击中敌人;探险游戏中,光标不知道自己是否在屏幕上的某个特定目标上。可见,如果没有冲突检测,游戏就将会失去任何实际的或可预知的感知能力。
VB.Net游戏编程入门经典(4)冲突检测是一个常见的研究课题,在精度和性能之间取得某种平衡是它的永恒目标。我们这里的目的在于了解某些基本概念,以便能够在本书范围内使用它们,并借此给出冲突检测中用到的基本工具和术语。
注意
对于那些希望更加详细地了解此问题的读者,可以直接在Internet上查阅相关内容,Internet上有很多针对二维和三维环境(主要是三维)的高级冲突检测的改进算法。对于有关冲突检测问题的其他书籍和资料,请参见附录A。
在接下来的章节中,将会看到一些常见的冲突检测算法。
1.4.1 限定框算法
限定框算法是最常见的冲突检测算法之一,它的思想是:在对象的周围建立一些框,依据这些对象,在一个可以接受的精度范围内检测其上的最小冲突。在图1-7中,我们可以看到一些希望进行冲突检测的对象以及它们的限定框。
VB.Net游戏编程入门经典(4)
图1-7 射手对象和怪物对象的限定框
在游戏代码中,我们必须检查用于冲突检测的限定框之间是否有重叠,但不是检查图像的每个像素。例如,在图1-7中,如果围绕箭头的限定框触及到围绕怪物的限定框的话,那么这将是一个击中(hit)操作。
使用图1-7中展示的限定框可能会获得好的效果,然而通常情况下如果使用针对游戏者(图1-7中的射手)的较小限定框,检测冲突效果会更好一些。如果仅仅是因为子弹(或箭)仅有一个像素的误差而偏离目标,但结果是怪物被摧毁了,则游戏者将不会抱怨什么。但是,如果情况正好相反,游戏者就会感到自己被游戏本身欺骗了。为了给游戏者一点快感,为射手创建一个较小的限定框是一种较好的选择。
现在可以重新定义限定框,如图1-8所示。
图1-8 修订后的射手限定框和怪物限定框
一般而言,我们即将介绍的冲突检测技术将会涉及到“按轴线排列限定框问题(Axis Aligned Bounding Boxes,AABB)”。即:限定框将依据屏幕上的x轴和y轴进行某种特定的排列,这使得所有的计算都非常简单。此处描述的关于二维图形的冲突检测技术通常可以应用于三维图形的冲突检测,但是对于算法而言,三维图形要比二维图形复杂得多。无论如何,二维图形冲突检测并不具备真正数学意义上的复杂性。一种实现AABB检测的简便方法是把该问题分解为两个独立的检测问题。
VB.Net游戏编程入门经典(4)第一个检测称为“宽阔性”(broad phase)检测,它仅仅检测两个限定框是否有机会重叠。假设您正在玩一种赛车游戏并且希望查看一下两辆汽车是否会发生碰撞。如果一辆汽车在西雅图,而另一辆汽车在纽约,那么这两辆汽车将不会有发生碰撞的机会。“宽阔性”检测将对可能发生问题的两个限定框进行稳定可靠的检查。如果