体が移動できる最高速度を制限したい。
問題は、この回答が示唆するようなことをしても、
/* after applying forces from input for example */
b2Vec2 vel = body->GetLinearVelocity();
float speed = vel.Normalize();//normalizes vector and returns length
if ( speed > maxSpeed )
body->SetLinearVelocity( maxSpeed * vel );
たとえば、速度を固定する直前に、体に大きな力を加えている場合はどうなるでしょうか? 直線速度が今のところ maxSpeed に制限されていても、次のタイムステップで Box2D は b2Body::m_force 値を考慮に入れ、実質的に maxSpeed よりも速く体を動かします。
だから私はこれを思いつきました(b2Body::m_forceをパブリックに移動する必要がありました):
if ( speed > maxSpeed ) {
body->SetLinearVelocity( maxSpeed * vel );
body->m_force = b2Vec2(0, 0)
}
それでも、これはまだ問題を適切に処理していません。
速度がmaxSpeed よりもわずかに小さいため、条件はヒットしませんが、それでも m_force 値が大きくなりすぎて速度が上がりすぎる場合はどうなるでしょうか?
ポイントは、デルタアキュムレータを使用してステップを踏んでいるため、力が速度にどのように影響するかについて正確な予測を行うことができず、現時点で必要な物理ステップの数がわからないことです。
Box2Dソースコードに位置を統合する前に速度を直接制限する以外に、これを処理する方法はありますか?