2016-07-06 15 views
0

例で体を動かす方法:ボール60キロの速度で発射大砲/考えるlibgdx BOX2D体 - 与えられた力やスピード、距離や時間

:(60キロ)は 距離= 60キロ、 時間= 1時間

enter image description here

Libgdx:GameWorld

// Given that I am using 1/45.0f step time, the rest iteration velocity 6 and position 2 
// Given that 60.00012 kilometres per hour = 16.6667 metres per second 
float speed = 16.6667f; // 16.6667 metres per second 
Vector2 bulletPosition = body.getPosition(); 
Vector2 targetPosition = new Vector2(touchpoint.x touchpoint.y); 

Vector2 targetDirection = targetPosition.cpy().sub(bulletPosition).scl(speed); 

問題:しかし、私の問題は大砲ボールが私の望むスピードで動いていないことです。またスピードが正しいかどうかを確認できるようにボディスピードを記録する方法もあります。私は、大砲のボールはとても遅い動いているので、60キロを想像し、それは間違っていた気づい

PS:は上の写真の幅が5メートルであることを前提とし、高さが3メートル

body.setLinearVelocity(targetDirection.scl(deltaTime)); 

です問題2:私は

// Given that F = ma 
Vector2 acceleration = ??? 
float mass = body.getMass(); 
Vector2 force = ??? 
body.applyForces(force); 
所定の速度とステップ時間で力を計算しますか見当がつかない210

答えて

1

Box2dでは、力を直接適用するのではなく、時間に対して加えられる力であるインパルスを適用します。これにより、事実上ほぼ瞬間的な加速がもたらされます。あなたの衝動を計算することはちょっとした物理学です。

最初に、我々はいくつかの変数を定義し、Fvであり、uは(メートル毎秒)の初期速度であり、Iは(我々はBOX2Dに適用する計算する)インパルスであり、aが加速され、ニュートンの力であります最終的な速度であり、tは秒単位の時間です。 uは0からです、あなたの場合は

:今、私たちはインパルスを計算することができ

:ニュートン法と我々はで始まる加速のための定義を使用して

大砲のボールは最初は休息していますので、それは次のようになります:

これだけです!だから、あなたのコードでは、必要な速度の質量倍に等しい砲弾にインパルスを適用します。次のコードには、タッチポイントの方向を計算する方法も含まれています。

E.G:

float mass = body.getMass(); 
float targetVelocity = 16.6667f; //For 60kmph simulated 
Vector2 targetPosition = new Vector2(touchpoint.x, touchpoint.y); 

// Now calculate the impulse magnitude and use it to scale 
// a direction (because its 2D movement) 
float impulseMag = mass * targetVelocity; 

// Point the cannon towards the touch point 
Vector2 impulse = new Vector2(); 

// Point the impulse from the cannon ball to the target 
impulse.set(targetPosition).sub(body.getPosition()); 

// Normalize the direction (to get a constant speed) 
impulse.nor(); 

// Scale by the calculated magnitude 
impulse.scl(impulseMag); 

// Apply the impulse to the centre so there is no rotation and wake 
// the body if it is sleeping 
body.applyLinearImpulse(impulse, body.getWorldCentre(), true); 

編集:コメントに応答して:

正規化ベクトルは、それが(かかわらず、それがである角度の)1のサイズを有する意味単位長ベクトルです。 (ウィキペディアから)視覚的説明:

enter image description here

両方ベクターd1d2は単位ベクトルであるので、正規呼ばれます。 Vector2では、nor関数はベクトルを同じ角度に保ちながら大きさを1にして正規化します。下の図が示すように(青色原ベクターおよび緑色である正規化後である):キャノンボールが選手がタッチするかどうかを同じ速度で移動するように、あなたのゲームの

enter image description here

は、この点があります画面は非常に近いか非常に遠くの大砲のボールから、重要なのは大砲の角度です。

+0

こんにちは@BasimKhajwalはあなたの清潔で分かりやすく答えてくれてありがとう!インパルスを印加した後、方向はわずかに異なる。例えば、30度の角度で画面に触れると、ボールは32度で動いていますが、これは正確ではありません。奇妙な動作、私はまだVector2を使用することについて混乱しています.nor、私はまだその目的が理解できません。 – ronscript