我正试图让我的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));
我不知道,我做错了什么?
答案 0 :(得分:1)
"弹跳"你看到的可能有点欺骗性。我不是物理大师,我只知道足够危险,因为我的主要关注点是游戏编程。无论如何,第一个声明使用质心来施加力。当你计算一个"反弹"使用恢复原理,在大多数物理库中,它只是简单地获取两个碰撞对象之间的最大恢复原状:
restitution = Max( bodyA.restitution, bodyB.restitution )
然后忽略扭矩,相对于恢复的新的差异最终速度是:
–restitution * (bodyA.initialVelocity - bodyB.initialVelocity)
这也更标准地写为:
-e(V 1i - V 2i )
为什么这很重要?因为这可能是你没有看到反弹的原因,两个初始速度(没有扭矩)是零。现在,对ApplyImpulse()
的第二次调用使用的坐标不是身体的质心。因此,Box2D将尝试向身体施加角速度。考虑到这一点,将使用一系列新的方程式。我很自信这就是问题所在,但其他人可能会纠正我或了解更多信息。