窄相碰撞检测算法


10

冲突检测分为三个阶段。

  1. Broadphase:在所有可以交互的对象之间循环,如果可以加快循环,则允许误报。

  2. Narrowphase(窄相):确定它们是否碰撞,有时如何碰撞,没有误报

  3. 解决方法:解决冲突。

我要问的问题是关于窄相的。有多种算法,复杂度和准确性不同。

  1. Hitbox交集:这是一种后验算法,具有最低的复杂度,但也不太准确,

  2. 颜色交集:每个像素的Hitbox交集,后验,像素完美,时间上不准确,复杂度更高

  3. 分离轴定理:更常用,对三角形准确,但是a后验,因为它找不到边,考虑到最后一帧,它更稳定

  4. 线性射线广播:A先验算法,对半逼真的物理学很有用,它可以找到相交点,甚至比SAT还要精确,但是复杂性更高

  5. 样条插值:先验,比线性射线更精确,更复杂。

我可能已经忘记了更多。问题是,何时使用SAT更好,何时使用射线,何时花键以及是否有更好的选择。

Answers:


6

GJK和MPR是您所缺少的两个立即对我脱颖而出的东西。

GJK是一种用于查找两个凸多边形的最近点的算法。只需做一些额外的工作,您就可以使用它来找到相交对象的入射点,从而计算出碰撞流形。与使用SAT一样,这是通过多边形裁剪完成的,但是GJK可以节省一些步骤(因为您已经拥有最接近的点)。

MPR(Minkowski门户优化)是另一种算法,类似于GJK(它们都使用Minkowski空间)。它无法找到不相交的对象(例如GJK)之间的最近点,但是它确实具有许多其他出色的游戏属性,并且是获取接触流形的一种方式。

MPR是最受欢迎的游戏之一。它非常高效,数值稳定并且易于实现。

其他狭窄阶段则更多地用于专业游戏中。赛车游戏通常使用射线投射作为实际轮胎的建模,使用传统的碰撞形状和分辨率建模尚无法实现逼真的(甚至只是有趣的)行为。平台开发人员通常还使用高度自定义的碰撞和物理学,因为首选的“类似于Mario”的物理学未使用传统物理学算法进行建模。您还会经常看到不同的流体碰撞和物理方法,尽管我对此了解的很少。

看到:


3

我想说的是它的分离轴测验,而不是定理。

尽管可以扩展SAT以应对相对线性运动,但仍可以在不移动的多边形(2D)上使用SAT。

http://elancev.name/oliver/2D%20polygon.htm#tut3

不要在2D中使用GJK,我发现它实际上比简单地强行使用SAT还要慢。

可以使用的另一种技术是Minkowski差异,它可以将一个对象缩小到一个点,然后通过第一个对象的形状“生长”另一个对象。然后,您可以相对容易得多的点对组合对象进行测试-这将为您提供穿透距离和法线。我发现该工具从概念上讲对于解决新的碰撞检测问题非常有用。比SAT更容易可视化。

对于移动和旋转的多边形(和多面体),可以使用“保守性进阶”来找到确切的时间和接触点。

http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf

您可以在我不久前写的这篇博客文章中了解有关这些技术的更多信息:

http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/

希望有帮助!

干杯,保罗。


2
分离轴定理:存在一个轴,如果两个凸对象的投影不相交,则沿着该轴不相交。分离轴测试:我猜想将上述定理付诸实践。
埃里克(Eric)

0

这实际上取决于您拥有的游戏类型。上面的每种方法都有其自身的权衡。

但是,以我的经验,SAT是通用物理库Ex。的相当标准。Box2D广泛使用它(《愤怒的小鸟》和许多其他游戏都使用Box2D)。

Sonic,Megaman等游戏中使用了与SAT或Hitbox交集混合的颜色交集的变体,效果很好。

我对#4和#5不太了解。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.