【发布时间】:2008-08-27 20:21:09
【问题描述】:
您认为描述用于在 2D 环境中进行碰撞检测的算法或技术的最佳资源(书籍或网页)是什么?
我只是渴望学习不同的技术来制作更复杂、更高效的游戏。
【问题讨论】:
标签: algorithm collision-detection
您认为描述用于在 2D 环境中进行碰撞检测的算法或技术的最佳资源(书籍或网页)是什么?
我只是渴望学习不同的技术来制作更复杂、更高效的游戏。
【问题讨论】:
标签: algorithm collision-detection
碰撞检测通常是一个两阶段的过程。某种“宽相位”算法,用于确定两个对象是否甚至有可能重叠(以尽量避免 n^2 比较),然后是“窄相位”碰撞检测算法,该算法基于您的应用程序的几何要求.
Sweep and Prune 是一种行之有效的宽相位算法(有一些变体可能适合也可能不适合您的应用程序),适用于经历相对物理运动的物体(快速疯狂移动或大小和边界区域大不相同的物体可能使这不合适)。 Bullet 库有一个 3d 实现供参考。
窄相碰撞通常可以像“CircleIntersectCircle”一样简单。 Bullet 库也有很好的参考实现。在 3d 领域中,当需要对任意对象进行更精确的检测时,GJK 是当前的佼佼者之一——据我所知,没有什么能阻止它适应 2d(但它最终可能比仅仅强制你所有的边缘;)
最后,在您进行碰撞检测之后,您通常需要某种碰撞响应。 Box 2d 是物理响应解决方案的良好起点。
【讨论】:
Metanet Software 已发布some relevant tutorials。 Metanet 开发了N(基于 Flash,适用于 Windows、Mac、Linux)和N+(适用于 X360、DS 和 PSP)。
【讨论】:
就个人而言,我喜欢Paul Bourke 的工作。
此外,Paul Nettle 也曾就此主题撰写文章。他有一个完整的 3D 碰撞检测库,但您可能对这些库背后的想法更感兴趣(非常适用于 2D)。为此,请参阅General Collision Detection for Games Using Ellipsoids。
【讨论】:
Christer Ericson 的“实时碰撞检测”一书(ISBN:1-55860-732-3)是一本最近出版的(2005 年)并广受好评的书,应该会给您一些很好的答案。
它从您需要了解的一些数学知识的基本入门开始,然后进入碰撞检测中常用的各种类型的边界体积(球体、轴对齐边界框、定向边界框)。
接下来要讨论的是多种算法,用于检测各种基元组合之间的碰撞,例如线、三角形、球体、多边形、平面、包围体等。
同样重要的是涵盖了对象空间划分和组织的一些主要方法(体积层次结构、BSP 树、八叉树等)。这从本质上加快了碰撞检测,因为它允许您细分对象,这样您就可以避免对象之间不必要的比较(例如,我从我的数据结构中知道对象 A 距离对象 B 太远,所以我什至不会这样做距离检查)。
它还包括一些关于如何实际检查移动物体(间隔等)之间碰撞的内容,但请注意,尽管这是一本相当大的书并且涵盖了材料,但它是用于碰撞检测,而不是 resolution 或 response。因此,它将帮助您确定两个对象是否发生了碰撞,而不是真正如何处理它,即如何解决它。相交测试通常会为您提供做出此类决定所需的数据,但就编写 solver 的一般问题而言,它使用碰撞检测例程来检测碰撞,然后决定如何处理他们,这本书没有深入讨论。
【讨论】:
如果您的对象表示为 2D 空间中的点,您可以使用线交点来确定两个对象是否发生碰撞。您可以使用类似的逻辑来检查一个对象是否在另一个对象内(因此即使它们的任何一条线当前不相交,它们也会发生碰撞)。 math to do this 非常简单,任何有关基本几何的教科书都应该涵盖。不过,检测一个物体是否完全穿过一个物体可能会有点棘手。
【讨论】: