实施3D碰撞的最佳/高效方法


16

我已经为之前的游戏编写了一个基于2d的碰撞系统。这是我的第一个碰撞系统,而且丑陋。我通过检查所有对象与所有对象来寻找对象之间的碰撞。我已经听说过带有单元格的网格系统,其中一个对象只会看起来与其当前单元格中其他对象的碰撞。这真的是检查碰撞的好方法吗?

我想要一种好的技术来循环遍历3D世界中的所有物品。

Answers:


11

您将需要一个好的空间分割算法,通常在3D中使用octrees

之后,您可以将模型等包围在包围它们的边界球中,因为包围球之间的碰撞非常容易计算,因此它们可以很好地拟合。在知道两个边界球发生碰撞之后,您可以迭代地使边界球变小并添加边界球以保持对象被其覆盖,或者使用另一种智能算法来计算两个复杂对象之间的碰撞。

看到这张图片: 多个边界球


12

最终,我认为您的问题的答案将取决于您特定应用程序的需求,因为没有一种“一刀切”的解决方案。尽管网络上有许多不错的资源,但是通过选择Christer Ericson的实时碰撞检测,您可以节省很多时间和挫败感,该指南详细介绍了各种技术和算法,并提供了示例C ++代码。

它帮助我在尝试构建一个大型系统之前采取了一些小步骤。编写一个函数来确定一个点是否在平面上,一个点是否在一个三角形中,射线是否在一个三角形中,等等。然后进行各种凸形实体的静态测试:AABB vs. Triangle,等等。最初似乎难以理解(原谅双关语)的事物开始变得不那么令人生畏。这是大量测试的清单,并带有示例代码:

http://www.realtimerendering.com/intersections.html

同时,由于我知道并不是每个人都可以随意花70-80美元买一本书,因此您可能需要考虑以下几个术语:

  • 空间分区,八叉树,四叉树,BSP树
  • BIH树
  • 边界体积和边界体积层次结构
  • 离散与连续碰撞检测
  • 分离轴定理
  • GJK算法
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.