Bunun eski bir soru olduğunu biliyorum, ancak şimdiye kadar verilen cevaplarda cevapsız bir şey olduğunu düşünüyorum. Orijinal soruda, füzeye (veya her neyse) hedefin konumuna doğru hızlanması söylendi. Birkaç cevap bunun yanlış olduğunu belirtti ve hedefin daha sonra olacağını düşündüğünüz yere ivme kazandırmanız gerektiğini belirtti. Bu daha iyi ama yine de yanlış.
Ne gerçekten yapmak istediğim değil hızlandırmak hedefe doğru ama hareket hedefe doğru. Bunu düşünmenin yolu, hedefte gösterilen hedef hızını (veya hedef konumun bir yansıması) ayarlamak ve daha sonra hangi ivmeyi uygulayabileceğinizi bulmaktır (ne tür kısıtlamalar varsa, yani bir füze muhtemelen hızlanamaz). İstediğiniz hızı elde etmek için doğrudan tersi yönde (hızın bir vektör olduğunu hatırlayarak).
İşte bu sabah uygulamamıştım ve çalıştığım bir örnek, benim için bir oyuncu AI için bir spor simülasyon oyununda oyuncu rakibini kovalamaya çalışıyor. Hareket, hızları güncellemek için bir zaman adımının başlangıcında hızlanmaların uygulandığı ve zaman aşımının süresi boyunca bu hızda kayma yapan nesnelerin uygulandığı standart bir “tekme kayma” modeli tarafından yönetilir.
Bunun türetilmesini yayınlarım, ancak bu sitede desteklenen bir matematiksel işaret bulunmadığını tespit ettim. Çok kötü! Sadece, bunun bir füze tipi nesne için geçerli olmayan ivmelenme yönünde hiçbir kısıtlamaya sahip olmadığımı ve bunun da bazı ekstra kısıtlamalar gerektireceğinden yola çıkarak, en uygun çözüm olduğuna güvenmelisiniz.
Kod python'dadır, ancak herhangi bir dil arka planında okunabilir olmalıdır. Basit olması için, her bir zaman adımının 1 uzunluğa sahip olduğunu ve hızı yansıtmak için uygun birimlerdeki hız ve ivmeyi ifade ettiğini varsayıyorum.
self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)
Atan2 (a, b) işlevinin a / b'nin ters tanesini hesapladığını, ancak açıların hem a hem de b'nin işaretini bilmesini gerektiren bir dairenin doğru kadranına oturduğundan emin olun.
Benim durumumda, bir kez ivmelenmeye başladığımda, bunu hızın
vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)
Ayrıca yeni hızı oyuncuya bağlı maksimum hıza göre kontrol ediyorum ve buna göre değer veriyorum. Bir füze, araba ya da maksimum dönme hızına sahip bir şey durumunda (kene başına derece cinsinden), geçerli hareket açısına karşı hesaplanan idealine bakabilirsiniz ve bu değişiklik izin verilenden daha büyükse, açıyı şu şekilde değiştirin: idealine doğru mümkün olduğunca.
Bunun türetilmesi ile ilgilenen herkes için, ilk adım, hız, hızlanma hızı ve hızlanma açısı açısından zaman aşımından sonra oyuncu ile hedef arasındaki mesafeyi yazdım, sonra hızlanma açısına göre türevi kullandım. Bunu sıfıra ayarlamak, zaman aşımından sonraki oyuncu-hedef mesafesinin minimumunu, hızlanma açısının bir fonksiyonu olarak bulur, bu tam olarak bilmek istediğimiz şeydir. İlginçtir ki, hızlanma başlangıçta denklemlerde olsa da, gerçekte ne kadar hızlandırabileceğinizden bağımsız olarak en iyi yönü vermeyi iptal eder.