放物線アークでターゲットをヒットするために必要な発射体の最小速度の計算


回答:


15

放物線トレーテリー機能は次のように定義されます:

   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)      
    

素晴らしい答え。gが署名されていないことを理解してください。gが増加すると、Voyも増加するはずです。
ミルクプラス14

t(影響を与えるのに必要な時間)はどのようにわかりますか?
デワルドスワンポール

13

私は最近、同様の問題を解決しなければならなかった、私はすでに述べたように、私は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

私の場合、このソリューションは非常にうまく機能しました。


2

数学的に正しいかどうか気にしない場合は、十分に正しいように見えるだけで、まっすぐな経路を計算し、発射体をその経路に沿って移動させますが、距離の関数としてその線の法線に沿って「押し上げます」ラインセグメントなので、セグメントの中央に近づくにつれて上昇し、ラインセグメントの中央から遠ざかるにつれて下降します。

これに正弦波を使用し、-90〜+90度の範囲を使用して(-90はラインセグメントの左ポイント、90は右ポイントで、中央で急降下)、結果を乗算できます。スケールアップする定数によって。

純粋に正しい数学的/物理的な答えが必要な場合、これは役に立ちません。そうでない場合、これはおそらくあなたのためにかなりうまくいくことができます!

ゲームプログラミングは、リアリズムの代わりに、正しく見える(そして計算が安価である)イリュージョンを使用することを忘れないでください。


7
Re:「正しく見える(そして計算が安い)イリュージョンを使用する」と、私は一般的に同意しますが、この場合、数学的に正しい放物線アークを使用することがいかに簡単で安価であるかを考えると、ちょっとばかげているように見えます。
ネイサンリード

1
これは不必要な簡略化のように思えますが、この答えは悪い意味で悪いとは思いませんし、(多くの賛成票に値しないとしても)反対票に値しません。
ウィル

実際、正弦波を使用する場合は、0〜180(またはラジアン単位で0〜pi)にする必要があります
ダニエルカプラン

2

ちょうど適切で速度が固定されているものが必要な場合は、この非常に単純化された方法を使用できます。

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に近いはずです。


1
注意喚起。私があなたのコードを試してみたとき、あなたは逆効果と罪を抱えていました。コードを編集したので、正しいはずです。
MrValdez 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.