回答:
放物線トレーテリー機能は次のように定義されます:
Fx = Vox*t + Ox;
Fy = -0.5 * g * t * t + Voy*t + Oy;
既知の値:
P: the target point.
O: the origin point.
g: gravity.
t: time needed to impact.
不明な値:
Vo: Initial Velocity
'Vo'を計算するために、F関数に値を与えることができます:
't' = flight time 'duration'
'F' = target point 'P'
(Px-Ox)
Vox = --------
duration
Py + 0.5* g * duration * duration - Oy
Voy = ---------------------------------------
duration
すべての値を取得して、原点からターゲットに到達し、tに値を与えてF方程式に入れることができます。
When t = 0 => F == O (Origin)
When t = duration => F == P (Target)
私は最近、同様の問題を解決しなければならなかった、私はすでに述べたように、私はWikipediaのページをご覧式「ダンマン」に基づいて、2つのソリューションを思い付いた:発射の軌跡
このソリューションでは、実際には、発射角度を固定するか、x速度を必要とします。特定の角度で発射物を発射するため、Y速度は必要ありません。
解決策1、発射角度は固定され、速度を計算します。
g = 9.81; // gravity
x = 49; // target x
y = 0; // target y
o = 45; // launch angle
v = (sqrt(g) * sqrt(x) * sqrt((tan(o)*tan(o))+1)) / sqrt(2 * tan(o) - (2 * g * y) / x); // velocity
解決策2、速度は固定され、発射角度を計算します。
g = 9.81; // gravity
v = 40; // velocity
x = 42; // target x
y = 0; // target y
s = (v * v * v * v) - g * (g * (x * x) + 2 * y * (v * v)); //substitution
o = atan(((v * v) + sqrt(s)) / (g * x)); // launch angle
私の場合、このソリューションは非常にうまく機能しました。
数学的に正しいかどうか気にしない場合は、十分に正しいように見えるだけで、まっすぐな経路を計算し、発射体をその経路に沿って移動させますが、距離の関数としてその線の法線に沿って「押し上げます」ラインセグメントなので、セグメントの中央に近づくにつれて上昇し、ラインセグメントの中央から遠ざかるにつれて下降します。
これに正弦波を使用し、-90〜+90度の範囲を使用して(-90はラインセグメントの左ポイント、90は右ポイントで、中央で急降下)、結果を乗算できます。スケールアップする定数によって。
純粋に正しい数学的/物理的な答えが必要な場合、これは役に立ちません。そうでない場合、これはおそらくあなたのためにかなりうまくいくことができます!
ゲームプログラミングは、リアリズムの代わりに、正しく見える(そして計算が安価である)イリュージョンを使用することを忘れないでください。
ちょうど適切で速度が固定されているものが必要な場合は、この非常に単純化された方法を使用できます。
distance = to.x - from.x;
angleToPoint = atan2(to.y - from.y, to.x - from.x);
distanceFactor = 1/1000;
angleCorrection = (PI*0.18) * (distance * distanceFactor);
velocity.X = cos(angleToPoint+angleCorrection) * power;
velocity.Y = sin(angleToPoint+angleCorrection) * power;
距離は負の値にすることもできますが、角度も距離に依存するため、機能します。距離が負の場合、追加する必要がある角度も負です。
適切な値を見つけるには、distanceFactorをいじる必要があります。発射体の重力と力に依存します。これは、発射物がカバーできる最大距離で割った1に近いはずです。