3D 碰撞检测和响应

最近我找到了一份非常棒的[白皮书] (http://www.peroxide.dk/papers/collision/collision.pdf),介绍了如何在视频游戏中进行3D碰撞检测,而我想实现这个算法,但是我一直遇到一些自己无法解决的问题。该算法使用椭球体对象代表玩家/实体,并将世界压扁,使碰撞算法可以简化为球-三角形检测,然后再将世界扩展回来。听起来很不错,但我的碰撞似乎有时会出现问题,而我无法定位问题所在。[这里] (https://www.dropbox.com/s/5zbki6lxsz6fjyj/ld35_stripped.love?dl=1) 有我的代码的完整工作示例(需要[LOVE] (http://love2d.org)游戏框架)。通常我会在这里发一些代码片段,但实际上相关代码太多了,这样不会有很大的帮助。如果您不会或者无法使用LOVE运行游戏,则可以使用任何存档管理器打开.love文件(它只是一个zip文件)。相关文件包括:

  • /libs/cpml/modules/collision.lua (完整的碰撞算法)
  • /libs/cpml/modules/intersect.lua (各种交集算法,包括球-三角形)
  • /libs/cpml/modules/mesh.lua(几个网格辅助函数)
  • /resources/collision.cpp(白皮书中的原始代码)

如果有人能推荐更高效或者更容易的碰撞算法,那么我也非常开放。在过去的一年里,在游戏比赛中,我已经实现了几种碰撞检测算法,但都有一些缺陷。我真的想得到一个可靠的碰撞系统,以便我可以将精力集中在其他事情上,如游戏机制。

编辑:以下是碰撞检测失败的视频演示。您会看到玩家对象经常掉落到地下,红色碰撞点位置怪异等问题。

[https://www.youtube.com/watch?v=BX4Hdh-bQ5U] (https://www.youtube.com/watch?v=BX4Hdh-bQ5U)

点赞