発射体の発射角度を見つけるにはどうすればよいですか?


9

ユニットがお互いに矢を発射する2Dゲームを作成しています。私は射手と標的の位置と発射体の初速度を知っています。投射物がターゲットに着地するために必要な角度を知りたいです。ターゲットは射手とは異なる高さにある可能性があります。

要約すると、v0、R、gがわかっているので、角度(または高さ)を見つける必要があります。

http://en.wikipedia.org/wiki/Projectile_motionを読みましたが、必要なものに関連するものが見つかりません。


現実的な弾道曲線に固執するか、放物線で十分かは、状況によって異なります。
AB。

風を含めますか?または他の水平加速?(もちろん、数学難しくなります)
セス・Battin


リアルな発射動作を実現したいのですが、風は関係ありません。
korn3l 2013

回答:


11

角度を求める式は次のとおりです

式

ここで、vは初期発射速度、gは重力定数、xとyはターゲットの距離と高さです。

この方程式の2つの根は、2つの可能な角度を与えます。結果が架空の場合、初期速度はターゲットに到達するのに十分ではありません(到達角度を計算する場合は、これを読んでください)。どの角度を選択するかはあなた次第です。最も直接的な経路、つまり小さい角度を選択することは理にかなっています。

異なる目標値と一定の発射速度を使用して、以下のこの方程式のGIFを確認できます。

アニメーションGIFとしてグラフ化された数式

このウィキペディアの記事のリソース


ほとんどの場合、2つの有効な解決策があることに注意してください。発射体が45度の角度で発射されたときに、ドラッグなどの最大範囲が達成されないと仮定します。高い行くORあなたは銃から活力のすべてのビットを必要としない限り、このように両方の上位と下位解決策があるでしょう-下位範囲が低下します。
Loren Pechtel 2013

あなたはおそらく飛行時間が最も短い角度をとるでしょう、それは通常より小さな角度です(おそらく常にですが、私は自分自身が優雅に間違っている可能性を許しています)。急な角度を狙うよりも、下を狙う方が、足の前の地面を撃つほうが速くなります。
Azaral 2013

@StephenTierney回答ありがとうございます。これは私が探していたものです。
korn3l 2013


2

今年の初めに、シンプルなトップダウンシューティングゲームを作成しました。私は次の方法を使用しました:

以前の回答:https : //stackoverflow.com/questions/15364852/move-sprite-diagonally/15365570#15365570

public static class Helper_Direction
{

    // Rotates one object to face another object (or position)
    public static double FaceObject(Vector2 position, Vector2 target)
    {
        return (Math.Atan2(position.Y - target.Y, position.X - target.X) * (180 / Math.PI));
    }

    // Creates a Vector2 to use when moving object from position to a target, with a given speed
    public static Vector2 MoveTowards(Vector2 position, Vector2 target, float speed)
    {
        double direction = (float)(Math.Atan2(target.Y - position.Y, target.X - position.X) * 180 / Math.PI);

        Vector2 move = new Vector2(0, 0);

        move.X = (float)Math.Cos(direction * Math.PI/180) * speed;
        move.Y = (float)Math.Sin(direction * Math.PI / 180) * speed;

        return move;
    }
}

2つの位置間の軌道を計算します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.