我已经为之前的游戏编写了一个基于2d的碰撞系统。这是我的第一个碰撞系统,而且丑陋。我通过检查所有对象与所有对象来寻找对象之间的碰撞。我已经听说过带有单元格的网格系统,其中一个对象只会看起来与其当前单元格中其他对象的碰撞。这真的是检查碰撞的好方法吗?
我想要一种好的技术来循环遍历3D世界中的所有物品。
我已经为之前的游戏编写了一个基于2d的碰撞系统。这是我的第一个碰撞系统,而且丑陋。我通过检查所有对象与所有对象来寻找对象之间的碰撞。我已经听说过带有单元格的网格系统,其中一个对象只会看起来与其当前单元格中其他对象的碰撞。这真的是检查碰撞的好方法吗?
我想要一种好的技术来循环遍历3D世界中的所有物品。
Answers:
您将需要一个好的空间分割算法,通常在3D中使用octrees。
之后,您可以将模型等包围在包围它们的边界球中,因为包围球之间的碰撞非常容易计算,因此它们可以很好地拟合。在知道两个边界球发生碰撞之后,您可以迭代地使边界球变小并添加边界球以保持对象被其覆盖,或者使用另一种智能算法来计算两个复杂对象之间的碰撞。
看到这张图片:
最终,我认为您的问题的答案将取决于您特定应用程序的需求,因为没有一种“一刀切”的解决方案。尽管网络上有许多不错的资源,但是通过选择Christer Ericson的实时碰撞检测,您可以节省很多时间和挫败感,该指南详细介绍了各种技术和算法,并提供了示例C ++代码。
它帮助我在尝试构建一个大型系统之前采取了一些小步骤。编写一个函数来确定一个点是否在平面上,一个点是否在一个三角形中,射线是否在一个三角形中,等等。然后进行各种凸形实体的静态测试:AABB vs. Triangle,等等。最初似乎难以理解(原谅双关语)的事物开始变得不那么令人生畏。这是大量测试的清单,并带有示例代码:
http://www.realtimerendering.com/intersections.html
同时,由于我知道并不是每个人都可以随意花70-80美元买一本书,因此您可能需要考虑以下几个术语: