使用Box2D减小反射角度

3

大家好,

我正在尝试实现一种碰撞行为,即球以角度击中墙壁。我希望球保持完整的速度,但我希望反弹的角度有所减缓,使其从原来的方向反弹的少一些。

我已经尝试过摩擦力、阻尼和恢复等方法,但在我的反弹角度上没有任何不同。

有人知道我如何让box2d做我想要的事情吗?

球的反射角度

image http://i.stack.imgur.com/lMwLN.png

感谢帮助! ken


我对box2d一无所知,但从物理学的角度来看,有两件事会影响弹跳:(1)撞击墙壁时动能的损失将减缓球向左最方向的速度,(2)球体下方的摩擦力会减缓球体向下的速度。我不确定,但在某些情况下,这些效应会相互抵消,使您得到与没有摩擦或动能损失时大致相同的反射角度。 - Chris Gregg
是的,我意识到我要求Box2D改变其物理行为。在我的情况下,我使用了一个无摩擦的球撞击一个无摩擦的墙壁,这样我的速度就不会减小。 - Ken Strickland
可能最好的做法是在处理完碰撞后添加自己的冲量。在PostSolve中,您可以获取碰撞法线和切向量,从这些向量的某些组合中制作的冲量应该可以解决问题,但是您需要自己计算正确的数量。请记住,对于一个碰撞,PostSolve可以被调用多次时间步长,但您可能会发现只需在EndContact中添加一次即可。我很好奇您正在制作什么以及“有点静音”是如何定义的... - iforce2d
好的,我想出了一种处理方法。iforce2d让我走上了正确的道路,但我处理方式有些不同。我不是检测碰撞,而是比较步骤前后的LinearVelocity。如果LinearVelocity变化超过5度,那么我就将其设置为变化角度的一半。这可能不是完美的,但对于我正在做的事情来说已经足够了。 - Ken Strickland
既然你问我在做什么,我正在编写一个游戏,其中一只虫子在赛道上行走。我通过在虫子前面发送一个“leaderCircle”来引导它,这个圆圈以恒定的速度在赛道上弹跳,我只需将精灵向圆圈方向移动即可。这为虫子的行走模式提供了相当逼真的效果。 - Ken Strickland
1个回答

2

首先,在您的世界中设置一个contactListener,然后找出球和墙之间的确切碰撞。 其次,找出碰撞点。 最后,计算碰撞点与身体中心之间的角度。

例如:

void contactListener::BeginContact(b2Contact *contact)
{
    //find out the collision between the ball and the wall.
    ....

    //find out the collision point
    b2WorldManifold worldManifold;
    contact->GetWorldManifold(&worldManifold);
    b2Vec2 collisionPoint = worldManifold.points[0];

    //calculate the angle between collision point and body center.
    b2Vec2 bodyCenter = body->GetWorldCenter;
    ...
}

我希望你能理解我的意思


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