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)は、抗力がロケットモーターによって加えられる力と等しくなり、2つの力が互いに打ち消し合って、最高速度になる速度を決定します。

maxSpeed = thrustForce.Length() / 0.05;

純粋主義者は、抗力は実際には速度の2乗に相対的であると指摘するので、より正確に行うには次のことができます。

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 に答える