Bir nesnenin hedefine öncülük etmesi için düşman konumunu tahmin etme


13

2D oyunumda, otomatik olarak düşmanlara ateş ederek oyuncuya yardımcı olması gereken AI kuleleri var. Sadece düşmanın şu anki pozisyonunu hedeflemek yerine akıllıca ateş etmelerini ve hedeflerini yönlendirmelerini istiyorum. Peki, hem düşmanın hem de taretin mermisinin (her zaman sabit) hızı ve konum vektörü göz önüne alındığında, merminin düşmanı kesmesi (ve vurması) için taretin hedeflemesi gereken gerçek konumu temsil eden bir vektörü nasıl bulabilirim?

Matematiği, algoritmaları vb. Tanımlayan makalelere yapılan bağlantılar takdir edilecektir!



Bağlantılar için teşekkürler! Ancak, çözümlerin okunması biraz zor hissediyorum, belki de sağladığınız bağlantıları kullanarak bu soruya net bir görsel cevap toplayabilirim, aynı soruna sıkışmış diğerlerine yardımcı olabilirim.
Larolaro

@Larolaro Cevabımı daha iyi anlayabilmeniz için grafiksel bir gösteri ekledim.
jmacedo

Bu cevapta benimsediğim
14'te

Yanıtlar:



3

Sana bir cevap vermeyeceğim, eminim ki yararlı ya da doğru, ama işte gidiyor:
Mathematica ile biraz daha oynadıktan sonra (not defteri / yayınlanan not defteri için cevabın sonunu kontrol edin), bu çözüm, verimlilik açısından en iyisi olmayabileceğini düşünse bile doğru görünüyor.

Bunu matematiksel olarak yazdım, ki bu senin problemine karşılık geliyor. Temel olarak, bulmamız gereken şey olan OA değişkenine denklemleri / eşitsizlikleri çözer. Çıktı bize OA'nın sahip olabileceği olası çözümleri ve her çözümün geçerli olduğunu doğrulamak için gereken koşulları verecektir:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {OA}]
  • {BPx, BPy} blue'nın mevcut konumu

  • {BVx, BVy} mavinin hız vektörüdür

  • {OPx, OPy}, portakalın kurşun konumudur

  • OV, portakalın kurşun hızı vektörünün normudur (toplam hız)

  • OA, portakalın mermi açısıdır (hız vektörünün açısı)

  • merminin maviye çarpması için gereken zamandır

Koşullara t> 0 && OV> 0 koymaya çalıştım, ancak mathematica sonsuza kadar sürecekti, bu yüzden sadece t! = 0 && OV! = 0 kullandım. Yani burada vereceğim çözümler sadece mavi tam olmadığında çalışır turuncu ile aynı pozisyonda ve portakal mermisi gerçekten hareket ettiğinde (sabit kalmak yerine)

Çıktı devasa: http://freetexthost.com/xzhhpr5e2w

Ancak OA == _ parçalarını çıkarırsak, bunu elde ederiz:

http://freetexthost.com/iyrhqoymfo

Bunlar AE'nin sahip olabileceği değerlerdir (her biri farklı koşulların geçerli olmasını gerektirir).

OV'nin istemediğimiz negatif olmasını gerektiren çözümleri çıkardığımız bazı analizlerde, bunu anladım:

http://freetexthost.com/iy4wxepeb6

Yani bunlar sorunun her biri farklı koşulların geçerli olmasını gerektiren olası çözümlerdir. Belirli bir açı OA'nın geçerli bir çözüm olması için aşağıdaki koşulların karşılanması gerekir:

Reduce[{BPx, BPy} + t*{BVx, BVy} == {OPx, OPy} + t*OV*{Cos[OA], Sin[OA]} && t != 0 && OV != 0, {t}]

Çıktı:

(BVy - OV Sin[OA] != 0 && BPx == (BPy BVx + BVy OPx - BVx OPy - BPy OV Cos[OA] + OPy OV Cos[OA] - OPx OV Sin[OA])/(BVy - OV Sin[OA]) && t == (-BPy + OPy)/(BVy - OV Sin[OA]) &&  BPy OV - OPy OV != 0) || 
(BVy == OV Sin[OA] && BPy == OPy && BVx - OV Cos[OA] != 0 && t == (-BPx + OPx)/(BVx - OV Cos[OA]) && BPx OV - OPx OV != 0) || 
(BVy == OV Sin[OA] && BVx == OV Cos[OA] && BPy == OPy && BPx == OPx && OV t != 0)

Bu nedenle, yalnızca doğrulamanın yapıldığı çözümleri göz önünde bulundurun (t == _ parçalarını doğrulamanız gerekmez. Bunlar, eğer diğer koşullar geçerliyse, merminin araca çarpması için gereken zamanı veren çözümlerdir. t negatif bir değerle sonuçlanırsa, belirli bir OA'yı diğer koşulları doğrulasa bile geçerli bir çözüm olarak kabul edemezsiniz (bunun nedeni, azalmada t> 0 yerine t! = 0 kullanmamızdır).

Bu konuda /math// adresinde sormak da iyi bir fikir olabilir .

Düzenle

Bu soruya biraz ilgi gösterdim, bu yüzden açıkladığım her şeyin grafik gösterimi ile yorumlanmış bir not defteri oluşturdum. Buradan indir:

http://www.2shared.com/file/pXhYyhN1/towerBullets.html
Veya burada: http://www.2shared.com/file/W01g4sST/towerBullets.html

(bu yayınlanan sürümdür ve sadece görmek için ücretsiz olan mathematica oynatıcısına ihtiyacınız vardır. mathematica'nız yoksa bu yol)

Ekran görüntüsü:


Koşulları ve çözümleri çarpma işaretiyle (*) sağlayabilirim, böylece bunları programlama dilinize taşımanız daha kolaydır (O zaman sadece ArcTan [...], Sin [...], Cos [...], Sqrt [...] ve sonunda güç işareti (^).
jmacedo

Hah, bu çözümü unut. Şimdi bu soru birleştirildiğine göre, ilk yanıtın bağlantıları daha iyi yanıtlar içerecek şekilde ekleniyor.
jmacedo
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.