如何解决两个碰撞体的渗透


9

我已经实现了简单的3D游戏物理引擎。我已经有适当的碰撞检测功能,现在我正在尝试找出碰撞响应部分。我正在使用基于脉冲的方法来计算碰撞后的速度。这工作得很好,但是并不能完全阻止物体相互渗透。因此,我还有其他代码来解决渗透问题。目前,我只是沿着接触法线将实体移动了穿透深度的一半-第一个实体沿接触法线的方向移动,第二个实体沿相反的方向移动。

在大多数情况下都可以,但是有一些不良影响。例如,想象一个狭窄的走廊和一个物体在其中移动。如果对象撞到走廊的一堵墙,则穿透分辨率会将其移到相对的墙,然后在下一帧中移回第一堵墙,依此类推。效果是物体在墙壁之间确实非常快地振动,这不是很漂亮。

所以我的问题是,是否有更好的方法来解决渗透问题?也许不移动物体,只是以某种方式调整它们的速度(除了脉冲计算),以使它们停止彼此相对移动,并且穿透力在接下来的两帧中自行解决。我只是在猜。有任何想法吗?

Answers:


3

当您检测到碰撞时,请确定物体首先在什么时间/点开始碰撞,并在此时处理碰撞。此时,您可能仍需要解决一些问题,但是它会小得多,并且[通常]不会产生您遇到的振荡问题。

假设您有100ms的模拟步长,并且在某个帧中,您有两个球碰撞到帧的一半(50ms)。首先,您将检测到它们在框架中的任何位置发生碰撞(我相信您已经在有效地进行了操作)。您可以确定它们在框架中发生碰撞的时间。现在处理碰撞,包括它们没有碰撞的帧的前50ms。现在,您将获得球的新速度,并且还可以立即采取措施,以确保它们不会穿透(由于“刚发生”,所以它们应该很小)。最后,您将模拟球的下50个框架。请注意,在此期间,这些球中的一个或两个都可能再次发生碰撞。


1
因此,您基本上建议执行连续的碰撞检测,然后以与我已经执行的方式相同的方式处理穿透,因为穿透可能很小。我想这可以工作。现在,我只需要弄清楚如何使碰撞检测连续进行即可:)
亚当(Adam)2012年

不知道连续意味着什么。严格来说,物理模拟中没有连续的东西,因为所有东西总是分解成一定大小的离散步长。我基本上建议采取更小的步骤,将产生更小的(更容易纠正)错误。对此进行考虑的另一种方法是,步长和错误(例如渗透)之间存在直接关系。因此,当您检测到此类错误时,请分解为更小的步骤,直到可以将错误轻松修复为止。
notlesh 2012年

连续碰撞检测意味着您无需检查两个静态对象之间的相交(3d问题),而是检查两个运动对象的接触(基本上是4d问题)。通常只考虑恒定速度就足够了,因为您可以使用分段线性曲线来近似轨迹。优点是穿透距离将始终为零(或由于浮动舍入误差而接近)。我虽然你在谈论这个,但是也许我误解了你的答案?
2012年

@adam是的,这就是我在说的。
notlesh 2012年

2

查看这篇文章(该文章已多次发布在这里,仅搜索通过碰撞检测标记的问题与答案),它向您展示了如何执行stephelton所谈论的“连续”冲突解决方案:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

基本上,您可以解决两个边界框开始相交时的确切时间点的一些运动学方程。您可以在那一刻解决冲突,然后继续处理框架中的剩余时间。由于物体的速度/加速度会发生变化,因此您可能必须重新模拟碰撞后发生的情况。但是,总有一个起点……干杯!


谢谢,检查了这篇文章。问题是我在使用不同的对象表示形式。我正在使用凸多面体,并使用分离轴定理测试碰撞。可以将其扩展为处理以恒定线速度移动的物体(我知道该怎么做),但是不知道如何同时处理角速度。但是,如果我决定采用这种方式,我将提出另一个问题。
亚当
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.