如何防止新的碰撞绕过旧的碰撞? (2D)

问题描述 投票:1回答:1

我想用C ++中的多边形制作自己的碰撞系统。有静态对撞机(不能移动,不能推动)和动态对撞机(可以移动,可以never可以在静态对撞机内部)。我当前的方法是:

for (auto &dyn : dynamicColliders) {
    for (auto &stat : staticColliders) {
        // "how deep" is any vertex of dyn inside of stat? Store that in t.
        //    Is dyn inside stat (0 <= t <= 1)? -> push dyn outside by t
        // not inside? -> next 2 lines
        // "how deep" is any vertex of stat inside of dyn? Store that in r.
        //    Is stat inside dyn (0 <= r <= 1)? -> push dyn outside by r.
    }
}

以下是发生的情况的示例:

https://youtu.be/XeGga98ZtUY

[基本上,正方形是静态对象。六角形是动态的。现在,当六边形碰撞到底部正方形时,将其推入顶部正方形。但是,顶部正方形将六角形推回到底部正方形。 (现在,物理步骤结束了。不再考虑错误的底部碰撞。由于顶部正方形是“最新的”碰撞对象,因此发生此顺序)

我尝试过的事情:

  1. 总结所有“推”向量,并在最后将它们相加
  2. 如果被推到正方形外部之后发生碰撞,则完全取消当前物理步骤中的运动。
  3. (以上方法)

结果:

  1. 没用:六角形被推入正方形以下,之前没有发生碰撞。
  2. 实际可行,但故障严重。我无法沿着正方形滑行,因为它已取消。
  3. (请参阅上面的视频)

如何避免这种类型的碰撞?非常感谢!

c++ 2d collision-detection game-physics
1个回答
0
投票

这种单点检测大肠埃希菌的方法(非常)无法使用。因为它在碰撞发生的单个点上对每个对象进行建模,所以它没有考虑到对象也可能在其他地方发生粘菌现象,因此无法沿其试图推动的方向移动或反弹的事实。

您需要使用任何使用的检测系统来检查其碰撞的所有点,然后让碰撞处理逻辑根据其可以进入的有效方向做出反应。

如果您还正在构建检测系统(听起来像是您的问题),那么您将需要一种高效的算法来映射2d空间中可能的大肠杆菌点,您可能需要使用Nearest Neightbor Search的实现kd-tree。您可以找到many C ++库来为您执行此操作。

((请注意,kd树在每次插入和移除时都会失去平衡,因此,您应该有一个动态的树来定期重新平衡您的运动点,并为它的静态点提供一个静态树,可以单独放置)]

© www.soinside.com 2019 - 2024. All rights reserved.