真实世界应用程序中的冲突

fea*_*l87 16 c# c++ directx collision-detection

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

我事先说的是,我没有使用任何第三方物理库,但我会在家里做.(因为这是一个教育项目,我没有时间表,我想学习)

我有2种类型的网格,我必须为其进行冲突:

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

2)皮肤/粘合网格(动画)

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

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

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

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

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

这是问题所在:

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

非常感谢你的答案!!!

编辑:试图在网上找到一个K-Dop示例和一些解释.仍然没有找到任何东西.:(任何线索?我对如何使用其他类型的边界卷等有效测试K-Dop感兴趣...但网上的文档似乎非常缺乏.:(

Fin*_*las 6

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

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

我所获得的是简单的往往更好,更快.包装边界体积和分割网格是昂贵的,更不用说复杂了.你似乎走在了正确的轨道上.

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

  • 显然,我首先要对网格的完整边界体积(在我的情况下是胶囊)进行测试,然后我要去了我需要理解的复合体和这个问题的主题. (2认同)

小智 5

当前许多AAA游戏中最常用的方法是为StaticMeshes简化“ k-DOP”碰撞,为SkeletalMeshes简化简化的身体表示。

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

对于SkeletalMeshes,最常用的技术是定义附着到特定骨骼的简单几何形状。此几何形状可以是盒子或球形。该碰撞模型可以用于动画网格的非常精确的碰撞检测。

如果您需要每三角形碰撞,则“分离轴定理”是您选择的Google搜索术语。这在特定情况下很有用,但是上述方法应满足您75%的碰撞检测需求。

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