我正在写一个2D刚体模拟器。被模拟的对象是凸多边形。我的问题涉及如何确定碰撞的“点”,这样当我施加响应力时,我也可以计算扭矩。
在2D中,流行的窄相碰撞检测方法似乎是分离轴定理。然而,虽然这给你“他们碰撞了吗?”以及“多少?”,它没有给你一个参考点(我知道)应用响应力(从而计算扭矩)*。
另一种方法(这也让我更感兴趣,因为它是在3D中使用的,这将是合乎逻辑的下一步)是计算两个多边形的Minkowski差异,并决定它们是否碰撞if(0, 0)包含在结果多边形中。但是,您如何使用它来决定应用响应力的相对点?我的假设是,由于这个差异的每个面有效地对应于一个多边形的面,分离距离是从(0,0)到MD的最短距离,并将其应用于多边形上的相应面
作为奖励,如何在3D中做到这一点?
*当我写这篇文章时,我才意识到,在使用SAT时,我可以跟踪哪些点重叠,并在这些点的“平均”处应用力。但我必须决定几个非分离轴中的哪一个来执行这个小技巧......
答案 0 :(得分:0)
以下是我曾经做过的一次,但有很多可能的解决方案:
分离轴定理将为您提供从一个物体到另一个物体的方向,此方向垂直于分离轴(或3D中的分离平面)。您可以将此方向与凸体上的每个点一起使用,以获得穿透距离,或每个点与分离轴或平面沿方向的距离。
按穿透距离对点进行排序。从最具穿透力的点开始,如果它在另一个体内,则找到第一个接触点,否则进入下一个接触点。您可能希望继续找到距离第一个接触点沿分离方向的某个阈值范围内的其他接触点。跟踪这些点作为“接触歧管”。平均歧管中的点,或使用其他方法确定施加接触力的点。
一些先进的技术:
将接触歧管保持在存储器中将允许您通过先测试先前的歧管来有效地测试下一帧。
对于连续碰撞检测,通过测试框架内每个点的路径(近似为线段)是否与其他实体相交来测试该点是否在另一个实体内部的测试。这要贵得多,但可以防止小而快速移动的物体穿过薄壁。