这是我的问题。我正在创建一个游戏,我想知道如何进行碰撞。我有几个案例要分析并找到最佳解决方案。
我事先会说,我没有使用任何第三方物理库,但我会在家里做。 (因为这是一个教育项目,我没有时间表,我想学习)
我有2种类型的网格,我必须为其进行冲突:
1)静态网格物体(在屏幕上移动,但没有任何动画)
2)蒙皮/粘合网格(动画)
其实我有这个解决方案(非常hacky:|)
首先,我对一些包围整个网格(我的情况下是胶囊)的边界体积进行了测试,之后:
1)对于静态网格物体,我在块中(在建模器上)手动分割它们,对于每个块,我使用球体/ AABB测试。 (工作正常,但切片每个网格有点乱:P)(我试过一个自动系统将网格划分为平面,但它会产生不好的结果:()
2)对于动画网格ATM,我将运行时的网格划分为x个块(其中x是骨骼的数量)。每个块包含该骨骼作为主要影响者的顶点。 (有时工作,有时会产生非常糟糕的结果。:|)
请注意,网格的分割是在加载时完成的,而不是每次都完成(否则它会像幻灯片一样运行:D)
这就是问题:
对于这两种情况,最明智的想法是什么? 我有什么材料可以研究这些方法吗? (有一些源代码和解释会更好(语言不重要,当我理解算法,实现很容易)) 你能说出为什么解决方案比其他解决方案更好吗? 我听说过很多关于kd-tree,octree等的讨论。虽然我理解他们的结构但是我错过了他们在碰撞检测场景中的实用性。
非常感谢答案!
编辑:尝试在网上找到一些K-Dop示例和一些解释。仍然没有找到任何东西。 :(任何线索? 我对K-Dop如何使用其他类型的边界卷等进行有效测试感兴趣...但网上的文档似乎非常缺乏。 :(
答案 0 :(得分:5)
在进行复杂的碰撞检测之前,您应该执行基本检测。
使用球体或矩形作为边界体积是最好的选择。然后,如果这检测到碰撞,请转到更复杂的方法。
我所获得的是简单的往往更好,更快。包装边界体积和分割网格是昂贵的,更不用说复杂了。你似乎走在了正确的轨道上。
与游戏编程一样,有多种碰撞检测方式。我的建议很简单。拿一个立方体并完善你的惯例,然后在理论上你应该能够使用任何其他模型。至于示例,我会检查gamedev.net,因为他们有一些不错的文章。很多或我的家庭碰撞检测是许多方法的组合,所以我不能真正推荐最终的资源。
答案 1 :(得分:4)
目前许多AAA游戏中最常用的方法是StaticMeshes的“k-DOP”简化碰撞,以及SkeletalMeshes的简化物理身体表示。
如果您谷歌搜索“kDOP碰撞”或“离散方向多角色”,您应该找到足够的参考资料。这基本上是由几个平面定义的边界体积,这些平面从外部向网格移动,直到发生三角形碰撞。 kDOP中的“k”定义了这些平面的使用量,根据你的几何和你的“k”,你会得到非常好的近似值。
对于SkeletalMeshes,最常用的技术是定义附加到特定骨骼的简单几何体。此几何体可以是框或球体。这种碰撞模型可以用于动画网格的非常精确的碰撞检测。
如果您需要每个三角形碰撞,“分离轴定理”是您选择的谷歌搜索术语。这对于特定情况很有用,但是上面提到的方法应该涵盖75%的碰撞检测需求。
请记住,您最有可能需要比边界音量更高水平的早期碰撞拒绝。只要世界上有很多对象,就需要使用“空间分区”来尽快拒绝进一步测试的对象组。
答案 2 :(得分:2)
回答问题归结为您需要多精确?
显然,球体边界框是最微不足道的。在比例的另一侧,您有一个完整的三角形网格 - 网格碰撞检测,每次对象移动时都必须发生。
游戏开发物理引擎依赖于近似的艺术(多年前我潜伏在GameDev.net的数学和物理论坛中)。
我的观点是你需要某种与每个物体相关的边界椭球。对象可以是通用的多网格对象,网格或子网格网格。这应该提供“适当”的近似量。
答案 3 :(得分:2)
选择Christer Ericson's本书,Real-Time Collision Detection。他非常详细地讨论了这些问题。
在阅读文章时,请记住,在真实世界的游戏应用程序中,您将在严格的内存和时间限制下工作 - 每帧可获得16.6毫秒,就是这样!所以要小心任何没有认真讨论其算法的内存和CPU占用空间的文章或论文。