0

オブジェクトを投げる前に発射曲線を描きたいです。

次のリンクから発射体のモーションを作成しようとしました

http://www.iforce2d.net/src/iforce2d_Trajectories.h

ただし、投げられたオブジェクトがターゲットボディに転送される例を示します。

以下が欲しい

  1. 2 つの位置 (1 - 固定 box2d オブジェクトと 2 - タッチ位置) の間に発射曲線を描画します。

  2. タッチの位置を変更すると、発射曲線も対応する位置に移動します。

ロジックに従うためのアイデアはありますか?

前もって感謝します。

4

1 に答える 1

1

発射速度 (角度と大きさ、または Vx(0),Vy(0) コンポーネント) が既にわかっているときに曲線を描くように求めている場合、それは少しあいまいです。発射角度と速度がわかっている場合は、次の式を使用できます。

Px(t) = Vx(0)*t Py(t) = Vy(0)*t + 0.5*a*t*t

ここで、Px(t)、Py(t) はそれぞれ x、y 平面の位置です。

Xdelta を計算することで、合計飛行時間を計算できます (発射位置とターゲット位置から)。それで

Xdelta = Tf*Vx(0) (Total Flight Time Tf)、または Tf = Xdelta/Vx(0)。これをループで繰り返し、計算されたポイントをプロットできます。

注: Box2D は積分を近似しているため、Box2d と閉じた式のパスからの実際のパスにはわずかな違いがあります。(固定) タイムステップが 1.0/60.0 のオーダーである場合、違いはほとんどないはずです。走行距離はここで異なる場合があります。

とにかく、これにより、パス上の任意の点をプロットできます。

しかし、あなたの質問は本当にこれだと思います:

特定のターゲットに命中するための発射速度を計算するにはどうすればよいですか? これは簡単な答えではありません。

発射角度と発射速度 Vo および Theta から始めて、Xdelta、Ydelta の 2 つの方程式を (上記の方程式から) 次のように書くことができます。

Xdelta = Tf * Vo*cos(シータ)

Ydelta = Tf * V0*sin(シータ) + 0.5*a*Tf*Tf

最初の Tf を解くと、次のようになります。

Tf = Xdelta/(Vo*cos(シータ))

2番目に代入します(私の代数を確認してください)

Ydelta = (xDelta*Vo*sin(シータ))/(Vo*cos(シータ)) + 0.5 * a * Xdelta^2/(Vo^2*cos(シータ)^2))

いくつかの再配置を行います(繰り返しますが、代数を確認してください):

2*Vo^2*cos(シータ)^2*Ydelta - Vo^2*Xdelta*sin(2*シータ) - a*Xdelta^2 = 0

これは、Vo とシータの非線形方程式です。
角度が固定されている場合は、シータを接続し、Vo の二次方程式を解くことができ、そこから解を得ることができるはずです。

その状況では、次のようになります (繰り返しますが、代数を確認してください)。

Vo = +/- sqrt((a * Xdelta^2)/(2*cos(シータ)^2*Ydelta - sin(2*シータ)*Xdelta)

sqrt(.) の値が負の場合、ショットをまったく作成できません。

Vo が固定されている場合は、シータの閉じた形式の解を見つけたり、数値的に解いたりできる場合があります。

Vo と theta がわかると、「この発射体が発射されたときに衝突が発生するか」という疑問が残ります。

パスがわかっている場合は、Box2D で AABB を使用してループ内のパスに沿ってポイントをテストし、衝突する可能性のあるオブジェクトがあるかどうかを確認できます。これはすべて、0 から Tf まで反復する単一の関数で実行できます。dt = シミュレーションの固定ステップ サイズです。速度が非常に高い場合は、何かを「弾丸」で通過する可能性があることに注意してください。

これは役に立ちましたか?

于 2013-11-26T12:59:56.030 に答える