Box 2 D C++3つの作用力効果ApplyForce、ApplyLinearImpulse、SetLinearVelocity

2003 ワード

~~~~私の生活、私の少し!
1、力、逐次漸進——ApplyForce(力)
名前の通り、ApplyForceメソッドはリジッドボディに力を加えます.物理力学を学んだことがある学友はすべて知っていて、F=ma、力Fがあって加速度aがあって、加速度があって、物体
スピードが出て、ゆっくりと動きます.(しかしすぐには動かない.力が速度に直接影響しないからだ).簡単な例を挙げると、明ちゃんは静止した箱を押して、箱を押しました.
すぐに飛び出すのではなく、ゆっくりと、どんどん速く動いていきます(減速も同じです).ApplyForceのパラメータが最初にニュートン力である場合、このパラメータの値をどのように設定しますか?物体の初期速度velと物体質量body->GetMass()が知られています.t秒後の速度をdesiredVelに変えるには、必要な力を計算することができます.
f=(v2-v1)*m/t
b2Vec2 vel = body->GetLinearVelocity();
float m = body->GetMass();// the mass of the body
float t = 1.0f/60.0f; // the time you set
b2Vec2 desiredVel = b2Vec2(10,10);// the vector speed you set
b2Vec2 velChange = desiredVel - vel;
b2Vec2 force = m * velChange / t; //f = mv/t
body->ApplyForce(force, body->GetWorldCenter() );

ここで得られる効果は設定速度と同じであるべきであるが,複数の物体がある場合,衝突による物体への効果を正確にシミュレートすることができる.
2、速度、重ね合わせ——ApplyLinearImpulse(ストローク)
ApplyForceとは異なり、ApplyLinearImpulseは力を発生させるのではなく、リジッドボディの速度に直接影響します.ApplyLinearImpulseメソッドで追加した速度は、リジッドボディと比較されます.
従来の速度が重なり、新しい速度が発生します.この方法は本質的に印加力と同じであるが,時間的要因を考慮する必要はない.
b2Vec2 vel = body->GetLinearVelocity();
float m = body->GetMass();// the mass of the body
b2Vec2 desiredVel = b2Vec2(10,10);// the vector speed you set
b2Vec2 velChange = desiredVel - vel;
b2Vec2 impluse = m * velChange; //impluse = mv
body->ApplyLinearImpulse( impluse, body->GetWorldCenter() );

最終的な効果も満足できる.
3、一触即発——SetLinearVelocity(瞬間)
setLinearVelocityはApplyImpulseと同様にリジッドボディの速度に直接影響します.違いは、setLinearVelocityが追加した速度がリジッドボディの元の速度を上書きすることです.
ただし、SetLinearVelocityメソッドではsleepingのリジッドボディは自動的に起動しないので、このメソッドを呼び出す前にリジッドボディbodyを覚えておいてください.wakeUp()ちょっと.直接設定
bodyの線速度は,これが最も直接的な方法であるが,同様にbox 2 dで最良の方法ではない.
b2body *body;// the body you want to conroll
b2Vec2 vel;// the vel you set
body->SetLinearVelocity( vel );

このようにして、もし1つの物体だけがあれば、あなたが望んでいる効果を得ることができますが、多くのbodyがあれば、bodyがシミュレーションしている物理的な属性を変えたため、物理的な法則に合わない現象がたくさん見つかります.