我正在写一个2D刚体模拟器。被模拟的对象是凸多边形。我的问题涉及如何确定碰撞的“点”,以便当我施加响应力时,我也可以计算扭矩。
在2D中,窄相位碰撞检测的流行方法似乎是分离轴定理。然而,虽然这会给你一个“它们是否碰撞了?”除了“多少?”,它没有给你一个参考点(据我所知),在那里施加响应力(并因此计算扭矩)*。
另一种方法(这也是我更感兴趣的,因为它是在3D中使用的,这将是合乎逻辑的下一步)是计算两个多边形的Minkowski差,并确定如果结果多边形中包含(0,0),则它们是碰撞的。但是,如何使用它来确定施加响应力的相对点?我的假设是,由于这种差异的每个面实际上对应于其中一个多边形的一个面,因此间隔距离是从(0,0)到MD的最短距离,您可以将其应用于多边形上的相应面。
作为额外的奖励,人们如何在3D中做到这一点?
*当我写这篇文章时,我刚刚意识到,当使用SAT时,我可以跟踪哪些点是重叠的,并在这些点的“平均值”上施加力。但我必须决定在几个非分离轴中的哪一个来执行这个小技巧……
发布于 2011-05-07 04:18:51
下面是我如何做到这一点,但有许多可能的解决方案:
分离轴定理将给出一个从一个物体到另一个物体的方向,这个方向垂直于分离轴(或3D中的分离面)。可以对凸体上的每个点使用此方向,以获得穿透距离,或每个点与分隔轴或平面沿该方向的距离。
根据穿透距离对点进行排序。从最具穿透力的点开始,如果它在另一个身体内部,你已经找到了第一个接触点,否则继续下一个。您可能希望继续查找沿分离方向与第一个接触点的距离在某个阈值内的其他接触点。将这些点作为“接触流形”进行跟踪。对歧管中的点进行平均,或使用其他方法来确定要施加接触力的点。
一些高级技术:
将接触歧管保存在内存中将允许您通过首先测试前一个歧管来有效地在下一帧上进行测试。
对于连续碰撞检测,将点是否在另一个实体内部的测试替换为帧内每个点(近似为线段)的路径是否以及在何处与另一个实体相交的测试。这要昂贵得多,但可以防止小的、快速移动的物体穿透薄壁。
https://stackoverflow.com/questions/5699982
复制相似问题