如何在不产生更多碰撞的情况下分离碰撞对象


11

假设我使用一个简单的离散碰撞检测系统,在该系统中,我移动所有对象,然后检查碰撞。我希望将所有碰撞对象分离(当然)并分配适当的响应速度(弹跳,滑动,停止等)。

当我有一对碰撞对象时,如何将它们分开而不导致一个或两个碰撞其他对象?

Answers:


8

通常,这不是一个容易解决的问题。在物理引擎中,它将由约束求解器处理。约束求解器有很多不同类型,但是最容易理解的一种是顺序脉冲求解器。

Erin Catto在先前的几个GDC上对顺序脉冲求解器做了很好的解释,可以从Box2D下载页面下载它们,例如,请参见GDC 2009。


我对此很好奇。考虑到碰撞检测和解决方案的普遍性,我假设至少有一种适用于街机和动作游戏的简单化解决方案算法。
AJM

2
并不是的。在过去(SNES等),他们遇到了诸如游戏设计更改或折衷等问题。例如。在《超级马里奥》中,当玩家被击中时,马里奥将在几秒钟内立于不败之地,绕过第二次碰撞。在《双龙》中,玩家的碰撞将被忽略,直到完成向后下落的动画为止。
yaustar 2011年

@yaustar实际上,马里奥根本没有与敌人发生碰撞。当它的命中框与它们重叠时,它只会受到伤害。

3

避免这种情况发生的唯一方法是首先防止渗透。在移动对象之前,请确保这是合法的移动。请注意,这意味着您必须一次移动一个对象,以避免两个对象相互移动的情况。

如果没有发生渗透,则无需重置任何仓位,因此不会触发任何辅助渗透。


2

我通常会执行以下操作:

当您分离对象并且最终遇到更多碰撞时,您只需再次进行迭代,直到达到最大步数或对象穿透的深度小于预定义的阈值。


那太不稳定了。每当玩家按下轻物体弄乱时,游戏中的FPS可能会飙升。最好在下一帧解决它。
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.