c++ - GJK碰撞检测从2D到3D的实现

标签 c++ algorithm collision-detection 3d linear-algebra

对于这个问题的长度,我深表歉意,并对阅读本文的人表示先发制人的感谢!

所以我最近几天一直在研究 GJK 算法。得益于 William Bittle 的精彩文章 http://www.codezealot.org/archives/88,我了解了它背后的一般概念,并了解了其在 2D 中实现的大部分细节。 。

我已经将他的伪代码(在文章末尾找到)实现到我自己的 C++ 项目中,但是我想制作一个 3D 实现。我的弱点在于使用点积来测试泰森区域和三重积来获得垂直线。但我正在尝试阅读更多相关内容。

我的问题归结为 containsOrigin 函数。我无法可视化和解释 z 轴添加的新 voronoi 区域。我似乎无法理解如何确定哪些区域包含原点。我假设我必须考虑 4 个,每个都从构成单纯形四面体的 4 个面的三角形平面延伸。如果原点不在这些区域中的任何一个内,那么它就被包含在内,并且我们发生了碰撞。

我如何测试它是否包含在特定的 voronoi 区域/哪个三角形面指向原点方向?

当前的 2D 算法检查是否形成了三角形,如果没有,则单纯形是一条线,并找到第三个点。我假设 3D 算法检查是否制作了四面体,如果没有,那么它将检查三角形,如果为真,那么它将找到第四​​个点来制作四面体(我将如何得到这个?使用法线方向起源?)。如果我没有制作三角形,它会找到第三个点来制作三角形(我仍然像在二维中一样使用三重积吗?)。

非常感谢任何建议、大纲、资源、代码扩充、评论。

最佳答案

根据您对 GJK 算法的期望结果,您可能想看看 Molly Rocket 提供的这个不错的教程:https://mollyrocket.com/849

请注意,他的实现仅输出交集?是/否。但这可能是一个好的开始。

关于c++ - GJK碰撞检测从2D到3D的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6515529/

相关文章:

c# - 现实世界应用程序中的碰撞

c++ - 如何从字符串中查找子字符串?

c++ - find_if 总是给出第一个元素而不进入 isOdd 函数

c# - 优惠券代码生成

algorithm - 我怎样才能发现碰撞发生在矩形的哪一侧?

java - C++ OpenGL - 获取对象的世界坐标(碰撞检测需要)

c++ - 如果我将指针设置为 NULL,则两次释放同一指针不会出错

c++ - C++中的自定义字符串练习

java - ArrayList 未正确更新

algorithm - 转换一棵树需要多少 Right Rotation?