如何防止刚体穿过其他碰撞体

7

我有一个硬币RigidBody和周围有盒子碰撞器的墙壁。为了试验目的,我向硬币应用了以下代码。

private void OnMouseDown() 
{
    rigidbody.AddForce(30.0f, 0f, 5.0f, ForceMode.Impulse);
}

但是,有时硬币会穿过墙壁,但当我将速度从30增加到50点时,它在第一次点击时就会穿过墙壁。我已经搜索了很多,除了DontGoThroughThings脚本以外,仍然没有任何结果,但这对我没用,或者我不知道如何使用它。
我一直在硬币上添加连续动态和墙壁上的连续碰撞检测,但仍然无法解决问题。

http://stackoverflow.com/questions/5788261/fast-moving-object-passing-through-other-objects - jparimaa
我仍然没有任何有效的解决方案可供尝试。我尝试将“Fixed Timestep”更改为0.1,这在一定程度上有效,但不是100%。如果有人有任何解决方案,请帮忙。谢谢。 - Ashish Beuwria
4个回答

7
物理碰撞检测存在的问题是有时当物体速度过高(在这种情况下,由于对刚体施加的力),就无法检测到碰撞。原因是您执行的代码每秒运行x次,因此有时刚体将在一步与另一步之间穿过碰撞器。假设你有一个以100英里/小时移动的球和一个宽度为1英尺的墙壁,代码将根据其物理规律每次运行将球移动一定量的英尺,因此球的移动是虚拟的但不是真正的物理移动,因此可能发生从一步到另一步球可以从点a移动到点b,而墙壁位于这些点之间,结果未检测到碰撞。
可能的解决方案。
您有一个简单的解决方案,但精度不如应该,还有一个更难的解决方案,但完全准确。
第一种解决方案将增加碰撞器的大小,根据硬币可以达到的最大速度,这样碰撞器将足够大,以便在一帧到另一帧之间不会错过碰撞。
第二个更难的解决方案将添加辅助程序到您的碰撞检测中,例如使用物理光线投射。您可以设置射线投射到前方,并确定该对象是否存在即将发生的碰撞,如果是,则在该对象不再被光线投射所碰撞时,则您的碰撞检测已失败,这样您就有了辅助程序来确认并调用碰撞状态。
希望对您有所帮助,对我的英语表示抱歉。如果您对此理解不多,我可以为您提供代码,但我需要一些来自您项目的代码。

我已经尝试增加墙壁的大小,但没有用,而且我已经提供了代码。我只是为了简单的测试目的向我的硬币添加力量。 - Ashish Beuwria

1

查看碰撞器是否未勾选“是触发器(Is Trigger)”选项。 同时,检查游戏对象是否有碰撞器。


0
你可以在每次更新时保存速度和位置,然后测试是否越界。如果硬币离开有效区域,你可以将其恢复到最后一个有效位置,或者自己绘制碰撞。

0

我曾多次遇到这个问题...

请确保您的硬币刚体属性中的“Is Kinematic”为False,Is Trigger为false,

同时,请确保墙壁的“Is Trigger”也为False。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接