3

我通过 Libgdx 使用 Box2D 来创建场景。我有一个场景,我想不断地推动一个特定的物体applyForce(方向会不时改变),但只能达到给定的速度。

想象一个由火箭发动机推动的圆形物体(四面都有喷嘴),G 为零,用于说明。

有没有办法在不重新计算施加的力或每次更新时重复计算的情况下做到这一点?我只知道如何为所有对象设置最大速度。目前我最好的选择是以linearDamping某种方式使用,但我希望有一个更简单的解决方案。

4

1 回答 1

11

您可以使用 SetLinearVelocity 覆盖当前速度。

b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize();//normalizes vector and returns length
if ( speed > maxSpeed ) 
    body->SetLinearVelocity( maxSpeed * vel );

================

编辑: 简单的空气阻力可以通过在相反的行进方向上施加一个小的阻力来建模,并与行进速度成比例。

b2Vec2 vel = body->GetLinearVelocity();
body->ApplyForce( 0.05 * -vel, body->GetWorldCenter() );

阻力的比例值(本例中为 0.05)确定阻力将等于火箭发动机施加的力的速度,并且这两个力相互抵消,从而产生最高速度。

maxSpeed = thrustForce.Length() / 0.05;

纯粹主义者会指出,阻力实际上是相对于速度的平方,所以更准确地说,你可以这样做:

b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize(); //normalizes vector and returns length
body->ApplyForce( 0.05 * speed * speed * -vel, body->GetWorldCenter() );

...我认为这会给你一个最高的速度

maxSpeed = sqrtf( thrustForce.Length() / 0.05 );
于 2012-09-20T10:53:42.307 回答