2012-03-06 4 views
0

私は、衝突の際に円形オブジェクトに作用する力を計算しようとしています。残念なことに、私のメカニックはやや錆びているので少し問題があります。ゲームでの車両の2D合力の計算

は私がメンバー

vector position // (x,y) 
vector velocity // (x,y) 
vector forward // (x,y) 
float radius // radius of the agent (all circles) 
float mass  

でエージェントクラスを持っているので、我々はA、Bがある場合:エージェント、および次回に速度が位置を変更しようとしているステップを。衝突が発生する場合、私はオブジェクトに作用する力を作り出したいと思います。

私はLine1 =(B.position-A.position)が合力の角度を計算するのに必要だと知っていますが、それをどのように計算するかは、私が車両の現在の速度と衝突の角度。

逆正接(L1.y、L1.x)が力のためにAM角で(方向を決定することができる) 罪/ COSコンポーネントの高さ/幅また

あるIは回転軸Iを計算するために知っています(T)* vel.y + sin(T)* vel.x

これは、次のように使用する必要があります。x = cos(T)* vel.x + sin(T)* vel.y 私の脳はもう対処できません。どんな助けもありがとうございます。

私が言うように、目的は基本的な物理を既に考慮しているので、オブジェクトに適用されるベクトル力を計算することです。

を追加しました、私はそれで行くことを始めていた場所を示すために少しpsudocode ..ここ

A,B:Agent 

Agent { 
    vector position, velocity, front; 
    float radius,mass; 
} 

vector dist = B.position - A.position; 
float distMag = dist.magnitude(); 

if (distMag < A.radius + B.radius) { // collision 
    float theta = arctan(dist.y,dist.x); 
    flost sine = sin(theta); 
    float cosine = cos(theta); 

    vector newAxis = new vector; 
     newAxis.x = cosine * dist .x + sine * dist .y; 
     newAxis.y = cosine * dist .y - sine * dist .x; 

    // Converted velocities 
    vector[] vTemp = { 
     new vector(), new vector()   }; 
    vTemp[0].x = cosine * agent.velocity.x + sine * agent.velocity.y; 
    vTemp[0].y = cosine * agent.velocity.y - sine * agent.velocity.x; 
    vTemp[1].x = cosine * current.velocity.x + sine * current.velocity.y; 
    vTemp[1].y = cosine * current.velocity.y - sine * current.velocity.x;   

スタック上の好奇心数学オタクがあります望んにあります。..

+0

おそらく[box2d](http://box2d.org/)や[chipmunk](http://chipmunk-physics.net/)のような物理エンジンを研究していますか? – nornagon

+0

私はすべてがセットアップされている、私は比較的簡単にすべき角度を持っています。変換された軸は、私が知っている角度で衝突が発生することを意味し、私はそれを使って何かをする必要があります。 – Blue42

+2

あなたは確かですか? 「剛性の」オブジェクトの衝突では、その力は巨大ですが簡単です。重要なことは、衝突後のオブジェクトの速度、速度、効果です。私はそれを剛体で回転しない円とします。弾性または非弾性? – Beta

答えて

0

を失うことなく、私たちが想定してみようコリジョンの前に2番目のオブジェクトの参照フレームにあることを示します。

運動量の保存:VX1' について解く

m1*vx1 = m1*vx1' + m2*vx2' 
m1*vy1 = m1*vy1' + m2*vy2' 

、VY1' :密か

vx1' = vx1 - (m2/m1)*vx2' 
vy1' = vy1 - (m2/m1)*vy2' 

は、私はそのvx1'*vx1' + vy1'*vy1' = v1'*v1'事実を覚えています。

v1'*v1' = v1*v1 - (m2/m1)v2'*v2' 

は排除するために組み合わせる:

m1*v1*v1 = m1*v1'*v1' + m2*v2'+v2' 

平方V1' について解く:エネルギーの

保全(弾性衝突が私たちを与えるものの一つは、入射の角度が反射の角度です) v1 ':

(1-m2/m1)*v2'*v2' = 2*(vx2'*vx1+vy2'*vy1) 

固定プールボールヒットを見たことがあるなら、私は接触の法線方向に飛びます(これはあなたのシータと同じです)。

v2x' = v2'cos(theta) 
v2y' = v2'sin(theta) 

したがって:

v2' = 2/(1-m2/m1)*(vx1*sin(theta)+vy1*cos(theta)) 

今、あなたは(v1'=sqrt(v1*v1-(m2/m1)*v2'*v2')を使用するか、入力変数の面で全体のことを解決するためのいずれか)V1' のために解決することができます。

phi = arctan(vy1/vx1)に電話してください。交差点の円に対する接線に対する入射角は90-phi-theta(好きな場合はpi/2-phi-theta)です。反射のためにそれをもう一度加えてから、水平に対してある角度に戻してください。入射角をpsi = 180-phi-2*thetapi-phi-2*theta)としましょう。または、

psi = (180 or pi) - (arctan(vy1/vx1))-2*(arctan(dy/dx)) 

だから:

vx1' = v1'sin(psi) 
vy1' = v1'cos(psi) 

検討:これらの円は、固体3D球体であると仮定されている場合、それぞれについて、キューブを半径と質量に比例を使用する(比例定数打ち消す注意でる)。それらがディスク状であると思われる場合は、半径二乗に比例した質量を使用します。それらがリングの場合は、radiusを使用します。

次の点を考慮してください:離散時間イベントでコンピュータが更新されるため、実際には重複するオブジェクトがあります。各オブジェクトの新しい場所を計算する前に、オブジェクトが重ならないようにオブジェクトをバックアウトする必要があります。余分なクレジットを得るには、交差していたはずの時間を把握し、その時間内に新しい方向に移動します。この時間はオーバーラップ/古い速度に過ぎないことに注意してください。これが重要な理由は、オブジェクトが重複して(再び衝突する)計算された衝突を想像してしまう可能性があるからです。

次の点を考慮する:元の問題をこの問題に変換するには、オブジェクト2の速度をオブジェクト1(コンポーネントごと)から差し引くだけです。計算後、それを元に戻してください。

最後に考慮すべき点:おそらく、線のどこかに代数エラーがありました。あなたは真剣に私の仕事をチェックすることを検討する必要があります。

+0

ありがとう、私はいくつかの過剰殺戮を持っているように見えます。私はそれをチェックし、私がどのように乗っているかを教えてくれるでしょう! – Blue42

+0

@ Blue42:私は剛体(衝突)シミュレーションを行ってからずっと長い時間を過ごしました。さもなければ、私は自分のコードを見つけてそれをあなたに与えたでしょう。また、私はこれを書いている間に3回締めました。画像を描き、2つの中心を結ぶ角度(位置角)と速度の角度を異ならせます。絵が助けになります。 – ccoakley