Yanıtlar:
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)
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ı.
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.
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.