Bir merminin fırlatma açısını nasıl bulabilirim?


9

Birimlerin okları birbirine ateşlediği bir 2d oyunu yapıyorum. Atıcıyı ve hedefin konumunu ve merminin başlangıç ​​hızını biliyorum. Merminin hedefe inmek için sahip olması gereken açıyı bilmek istiyorum. Hedef atıcıdan farklı bir yükseklikte olabilir.

Özetle v0, R ve g'yi biliyorum ve açıyı (ya da yüksekliği?) Bulmam gerekiyor.

Http://en.wikipedia.org/wiki/Projectile_motion okudum , ancak ihtiyacım olan şeyle ilgili bir şey bulamıyorum.


Gerçekçi balistik eğriye bağlı kalmak veya yeterince iyi bir parabol olup olmadığına bağlıdır.
AB.

Rüzgarı dahil etmek ister misiniz? Veya başka bir yatay ivme? (Tabii ki matematiği zorlaştırıyor)
Seth Battin


Gerçekçi bir mermi hareketi elde etmek istiyorum ve rüzgar yok.
korn3l

Yanıtlar:


11

Açıyı bulmak için formül

formül

burada v başlangıç ​​fırlatma hızı, g yerçekimi sabiti, x ve y hedefin uzaklığı ve yüksekliğidir.

Bu denklemin iki kökü size iki olası açı verir. Sonuçlar ise hayali ardından ilk hız hedefe ulaşmak için büyük bir yeterli (eğer ulaşamayacağı açısını hesaplamak istiyorsanız okumak değil bu ). Hangi açının seçildiğine bağlı. En doğrudan yolu, yani daha küçük açıyı seçmek mantıklı olacaktır.

Bu denklemin bir GIF'ini farklı hedef değerleri ve sabit bir başlatma hızı ile aşağıda görebilirsiniz.

Animasyonlu GIF olarak grafik çizilen formül

Bu wikipedia makalesinden kaynaklar


Çoğu durumda iki geçerli çözüm olduğunu unutmayın. Mermi 45 derecelik bir açıyla ateşlendiğinde sürtünme veya benzeri maksimum menzil elde edilmediği varsayılarak. Daha yüksek VEYA daha alçak menzili düşürür - bu nedenle silahınızdan her bir bit hızına ihtiyacınız olmadıkça hem daha yüksek hem de daha düşük bir çözüm olacaktır.
Loren Pechtel

Muhtemelen en kısa uçuş süresine sahip olan ve genellikle daha küçük açı olan açıyı alırsınız (muhtemelen her zaman ama kendime incelikle yanlış olma olasılığına izin veriyorum heh). Aşağı dikilerek, ayaklarınızın önündeki yere ateş etmek gerçekten dik bir açıyı hedeflemekten daha hızlıdır.
Azaral

@StephenTierney Cevabınız için teşekkür ederim. Aradığım şey buydu.
korn3l

Bu soruna çok daha basit bir çözüm buldum
Stephen Tierney

2

Bu yılın başlarında basit bir yukarıdan aşağıya atıcı yarattım. Aşağıdaki yöntemi kullandım:

Daha erken cevap: /programming/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;
    }
}

İki konum arasındaki yörüngeyi hesaplar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.