为什么这会在box2d中产生反弹?

时间:2014-10-05 13:59:43

标签: actionscript-3 box2d

我正试图让我的box2d盒子在击中另一个box2d盒子时反弹。因此设置了两个对象的物理属性..

fixtureDef.density=1;
            fixtureDef.friction=0;
            fixtureDef.restitution=0.9;

当我应用这一行(这是正确的做事方式)时,我没有反弹。

myElementsArray[0].myPhysics.myBody.ApplyImpulse(newVec, myElementsArray[0].myPhysics.myBody.GetWorldCenter());

但是当我将第2部分改为部分随机向量时,它会反弹

myElementsArray[0].myPhysics.myBody.ApplyImpulse(newVec, new b2Vec2(20,20));

我不知道,我做错了什么?

1 个答案:

答案 0 :(得分:1)

"弹跳"你看到的可能有点欺骗性。我不是物理大师,我只知道足够危险,因为我的主要关注点是游戏编程。无论如何,第一个声明使用质心来施加力。当你计算一个"反弹"使用恢复原理,在大多数物理库中,它只是简单地获取两个碰撞对象之间的最大恢复原状:

restitution = Max( bodyA.restitution, bodyB.restitution )

然后忽略扭矩,相对于恢复的新的差异最终速度是:

–restitution * (bodyA.initialVelocity - bodyB.initialVelocity)

这也更标准地写为:

-e(V 1i - V 2i

为什么这很重要?因为这可能是你没有看到反弹的原因,两个初始速度(没有扭矩)是零。现在,对ApplyImpulse()的第二次调用使用的坐标不是身体的质心。因此,Box2D将尝试向身体施加角速度。考虑到这一点,将使用一系列新的方程式。我很自信这就是问题所在,但其他人可能会纠正我或了解更多信息。