Parabolik yayda hedefe ulaşmak için gereken merminin minimum hızının hesaplanması


Yanıtlar:


15

Parabolik tepsi işlevi:

   Fx = Vox*t + Ox;
   Fy = -0.5 * g * t * t + Voy*t + Oy;      
  • Bilinen değerler:

    P: the target point.
    O: the origin point.
    g: gravity.
    t: time needed to impact.
  • Bilinmeyen değerler:

    Vo: Initial Velocity
  • 'Vo' değerini hesaplamak için F işlevine değerler verebiliriz:

    't' = flight time  'duration' 
    'F' = target point 'P'        
    
          (Px-Ox)
    Vox = --------
          duration
    
          Py + 0.5* g * duration * duration - Oy 
    Voy = ---------------------------------------
                     duration
  • Artık T denklemine t değerleri veren başlangıç ​​noktasından hedefe ulaşmak için tüm değerleri elde edebilirsiniz:

     When t = 0         => F == O (Origin)
     When t = duration  => F == P (Target)      

mükemmel cevap. g'nin imzalı olmadığını fark et. g arttıkça Voy de artmalıdır.
milkplus

T (etki için gereken süre) nasıl bilinir?
Dewald Swanepoel

13

Geçenlerde benzer bir sorunu çözmek zorunda kaldım, wikipedia sayfasında 'Dan the Man' bulunan formüle dayanarak iki çözüm buldum: Bir merminin yörüngesi

Bu çözümde, başlangıçta sabit olarak sabitleme açısı veya x hızı gerekir. Mermiyi belirli bir açıda fırlattığımız için Y hızı gerekli değildir.

Çözüm 1, fırlatma açısı sabittir, hızı hesaplayın:

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

Çözüm 2, hız sabittir, fırlatma açısını hesaplayın:

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

Benim durumumda bu çözümler oldukça iyi çalıştı.


2

Matematiksel olarak doğru olup olmadığını umursamıyorsanız, sadece yeterince doğru göründüğünü, düz yolu hesaplayın ve merminizi bu yolu takip etmesini sağlayın, ancak mesafenin bir fonksiyonu olarak o çizginin normali boyunca "yukarı itin" böylece segmentin ortasına yaklaştıkça yükselir ve çizgi segmentinin ortasından uzaklaştıkça düşer.

Bunun için bir sinüs dalgası kullanabilirsiniz, -90 ila +90 derece aralığını kullanabilirsiniz (burada -90, çizgi segmentinde sol nokta, 90 sağ nokta ve ortada lerp) ve sonucu çarpın ölçeklemek için bir sabit tarafından.

Tamamen doğru matematiksel / fiziksel cevaba ihtiyacınız varsa, bu yardımcı olmaz. Eğer yapmazsanız, bu muhtemelen sizin için oldukça iyi çalışabilir!

Unutmayın, oyun programlama gerçekçilik yerine doğru görünen (ve hesaplaması daha ucuz olan) yanılsamaları kullanmakla ilgilidir.


7
Re: "doğru görünen (ve hesaplamak için daha ucuz olan yanılsamalar kullanarak)", genel olarak katılıyorum, ancak bu durumda matematiksel olarak doğru parabolik ark kullanmanın ne kadar kolay ve ucuz olduğu göz önüne alındığında aptalca görünüyor.
Nathan Reed

1
Bunun gereksiz bir sadeleştirme gibi göründüğünü doğrulayın, ancak bu cevabın kötü anlamda kötü olduğunu düşünmüyorum ve aşağı oyu hak etmiyor (çok fazla oyu hak etmese bile).
Will

Aslında bir sinüs dalgası kullanacaksanız, 0 ila 180 (veya radyanda 0 ila pi) olmalıdır
Daniel Kaplan

2

Sadece doğru olan ve sabit bir hıza sahip bir şeye ihtiyacınız varsa, bu çok basitleştirilmiş yöntemi kullanabilirsiniz.

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;

Mesafe negatif olabilir, ancak yine de çalışır çünkü açı da mesafeye bağlıdır. Mesafe negatifse, eklenmesi gereken açı da negatif olur.

Doğru değeri bulmak için distanceFactor ile oynamanız gerekecek. Merminin yerçekimi ve gücüne bağlıdır. Merminin geçebileceği maksimum mesafeye 1'e yakın olmalıdır.


1
Önüne bak. Kodunu denediğimde, cos ve geriye doğru günahın vardı. Doğru olması için kodunuzu düzenledim.
MrValdez
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.