我想用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.
}
}
以下是发生的情况的示例:
[基本上,正方形是静态对象。六角形是动态的。现在,当六边形碰撞到底部正方形时,将其推入顶部正方形。但是,顶部正方形将六角形推回到底部正方形。 (现在,物理步骤结束了。不再考虑错误的底部碰撞。由于顶部正方形是“最新的”碰撞对象,因此发生此顺序)
我尝试过的事情:
结果:
如何避免这种类型的碰撞?非常感谢!
这种单点检测大肠埃希菌的方法(非常)无法使用。因为它在碰撞发生的单个点上对每个对象进行建模,所以它没有考虑到对象也可能在其他地方发生粘菌现象,因此无法沿其试图推动的方向移动或反弹的事实。
您需要使用任何使用的检测系统来检查其碰撞的所有点,然后让碰撞处理逻辑根据其可以进入的有效方向做出反应。
如果您还正在构建检测系统(听起来像是您的问题),那么您将需要一种高效的算法来映射2d空间中可能的大肠杆菌点,您可能需要使用Nearest Neightbor Search的实现kd-tree。您可以找到many C ++库来为您执行此操作。
((请注意,kd树在每次插入和移除时都会失去平衡,因此,您应该有一个动态的树来定期重新平衡您的运动点,并为它的静态点提供一个静态树,可以单独放置)]