16

这是我的问题。我正在创建一个游戏,我想知道如何进行碰撞。我有几个案例要分析并找到最佳解决方案。

我会提前说,我没有使用任何第三方物理库,但我会在内部进行。(因为这是一个教育项目,我没有时间表,我想学习)

我有 2 种类型的网格,我必须为它们进行碰撞:

1) 静态网格体(在屏幕上移动,但没有任何动画)

2)蒙皮/骨骼网格(动画)

其实我有这个解决方案(很hacky :|)

首先,我对包含完整网格(在我的情况下为胶囊)的一些边界体积进行了测试,之后:

1)对于静态网格,我将它们手动划分为块(在建模器上),对于每个块,我使用球体/AABB 测试。(工作正常,但是切割每个网格有点混乱:P)(我尝试了一个自动系统将网格划分为平面,但它给出了不好的结果:()

2) 对于动画网格 ATM,我在运行时将网格划分为 x 个块(其中 x 是骨骼数)。每个块都包含该骨骼是主要影响因素的顶点。(有时有效,有时会产生非常糟糕的结果。:|)

请注意,网格的划分是在加载时完成的,而不是每次都完成(否则它会像幻灯片一样运行:D)

这是问题:

对于这两种情况,最明智的想法是什么?有什么材料可以让我学习这些方法吗?(有一些源代码和解释会更好(语言不重要,当我理解算法时,实现很容易))你能论证为什么这个解决方案比其他解决方案更好吗?我听到很多关于 kd-tree、octree 等的讨论。虽然我了解它们的结构,但我想念它们在碰撞检测场景中的实用性。

非常感谢解答!!!

编辑:试图在网上找到一个带有一些解释的 K-Dop 示例。仍然没有找到任何东西。:( 有什么线索吗?我对如何使用其他类型的包围盒等有效地测试 K-Dop 很感兴趣……但是网上的文档似乎非常缺乏。:(

4

4 回答 4

6

在进行复杂的碰撞检测之前,您应该执行基本检测。

使用球体或矩形作为边界体是您最好的选择。然后,如果这检测到碰撞,请使用更复​​杂的方法。

我的意思很简单,通常更好,更快。包裹包围体和分割网格的成本很高,更不用说复杂了。不过,您似乎走在正确的轨道上。

与游戏编程一样,有多种碰撞检测方法。我的建议是从简单开始。拿一个立方体并完善你的例程,然后理论上你应该能够使用任何其他模型。至于示例,我会查看gamedev.net,因为他们有一些不错的文章。很多或我自制的碰撞检测是许多方法的组合,所以我不能真正推荐权威资源。

于 2010-01-29T20:06:36.540 回答
5

当前许多 AAA 游戏中最常用的方法是静态网格物体的“k-DOP”简化碰撞,以及骨架网格物体的简化物理身体表示。

如果你用谷歌搜索“kDOP 碰撞”或“离散方向多面体”,你应该找到足够的参考资料。这基本上是由几个平面定义的包围体,这些平面从外部向网格移动,直到发生三角形碰撞。kDOP 中的“k”定义了使用这些平面的数量,并且根据您的几何形状和“k”,您可以获得非常好的近似值。

对于 SkeletalMeshes,最常用的技术是定义附加到特定骨骼的简单几何体。这个几何图形可能是一个盒子或一个球体。这种碰撞模型可用于对动画网格进行相当准确的碰撞检测。

如果您需要每个三角形的碰撞,“分离轴定理”是您选择的谷歌搜索词。这对特定情况很有用,但上述方法应涵盖 75% 的碰撞检测需求。

请记住,您很可能需要比边界体积更高级别的早期碰撞拒绝。一旦世界上有很多对象,您就需要使用“空间分区”来尽早拒绝对象组进行进一步测试。

于 2010-01-29T22:35:42.483 回答
3

回答问题归结为您需要多精确?

显然,球体边界框是最简单的。在天平的另一边,你有一个完整的三角形网格碰撞检测,每次物体移动时都会发生这种情况

游戏开发物理引擎依赖于近似艺术(几年前我潜伏在 GameDev.net 的数学和物理论坛中)。

我的观点是,您将需要某种与每个对象相关联的边界椭球。对象可以是一般的多网格对象、网格或子网格。这应该提供一个“体面”的近似值。

于 2010-01-29T21:43:35.830 回答
2

拿起Christer Ericson 的Real-Time Collision Detection。他非常详细地讨论了这些问题。

阅读文章时,请记住,在现实世界的游戏应用程序中,您将在内存和时间的严格限制下工作 - 每帧只有 16.6 毫秒,仅此而已!因此,请谨慎对待任何没有认真讨论其算法的内存和 CPU 占用的文章或论文。

于 2010-01-29T21:45:04.233 回答