Bir müdahalenin vektörü nasıl hesaplanır?


11

İki boyutlu bir alan ve 1 ayakta duran uzay dostu, bir düşman doğrudan bilinen gerçek konumu, hızı ve yönü ile dost gemiye DEĞİL hareket ediyor.

Dost gemi, düşmanla savaşmak için kendini atış menziline sokmak istiyor.

Aslında, gemiyi hareket ettiren gerçek konuma sadece doğrudan bir vektör yerleştiriyorum ve her kareyi yeniden hesaplıyorum, bir çeşit "yuvarlak" uçuş yolu ile sonuçlanıyorum.

İstediğim şey, düşmanın (muhtemelen) atış mesafesine ulaşılacağı zaman düşmanın olacağı konuma doğrudan ve düz bir yol ayarlamaktır, düşmanın o zamana kadar rotayı değiştirmeyeceğini varsayarsak.

İlk ve "basit" bir uygulama olarak, arkadaşın hiçbir zaman 0'dan maksimuma hızlanabileceğini varsayarsak yeterli olur.

Tercih edilen uygulama, arkadaşın ivme yeteneklerini dikkate alan ve hız nedeniyle müdahalenin ne zaman imkansız olduğunu bilen bir uygulama olacaktır. Sadece hareketsiz durmadan değil, her başlangıç ​​hızında çalışmalıdır. Bir artı, frenlemeyi bile düşünürse (ışık hızında mücadele, verilen evrende çok enerji verimsizdir)

Yanıtlar:


5

Sorunuzu anlarsam, geminin hedefe yönelmesini istemezsiniz, daha ziyade hedefe müdahale eden düz bir çizgide uçarsınız. Bir kulenin mermisine temel olarak aynı ihtiyacı olan bir kule savunma oyunu yapıyorum, bir kule mermiyi hız / yön değiştirmediği sürece hareketli bir hedefe müdahale edecek şekilde bir silah ateşlemek istiyor. Çözdüğüm yol ikinci dereceden bir denklem kullanmaktı. İşte bazı sözde kod:

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Bunu çok iyi buldum, atış için çarpışma tespitine ihtiyacım olmadı ... Bu faktörler sabit kaldığı sürece hedef / mesafe / hedef hızı ne olursa olsun bir boğa gözüne vuran her atışa güvenebildim.


Açıklamanızdan bu, en azından maksimum hıza anında hızlanmayı varsaymanın en kolay yolu gibi görünüyor. Akşamları buna daha yakından bakacağım. Vector.Dot öğesinin dotproduct öğesini vektörlere döndürdüğünü varsayıyor muyum?
NobbZ

Hmmm ... Bunu şimdi ruby'de yaptım, ama yanlış bir şeyler var. Her denediğimde, atılan bir istisna vardır, çünkü sqrt içindeki ifade olumsuz bir şey olarak değerlendirilir ve bu nedenle sınırların dışındadır. Bunu nasıl halledebilirim. Soru için özür dilerim, ama bunu sadece kullanabilirim, ama birisi bana bir tavsiye verene kadar buradaki kavramları anlamıyorum.
NobbZ

Örnek şu kitaptan alınmıştır: amazon.com/…
Steve H

1
bunun yardımcı olup olmadığını bilmiyorum ama işte aynı şeyi yapan bir python kodu. moddb.com/mods/wicmw/tutorials/…
Steve H

Tamam, hala arkasındaki delik matematiğini anlamıyorum, ancak python kodu için thx, belgelerin bana söylediği gibi, sqrt içinde negatif bir değer varsa, o zaman arkadaşım yetişmek için yavaş olacak. Test değerlerimi değiştirdikten sonra bazı sonuçlar elde ediyorum. Yardımınız için teşekkürler.
NobbZ

6

Yönlendirme davranışlarına bakmanızı öneririm. Özellikle peşinde . Kaynak kodu OpenSteer'da bulunabilir uygulamasında bulunabilir veya " Örnek AI oyununu programlama " gibi bir kitaba bakabilirsiniz (ISBN 13: 978-1556220784)


Peşinde hedef hakkında bilgiye ihtiyaç var gibi görünüyor ve buna yöneliyor, ama hedefi gerçekten bilmiyorum. Düşmanın şimdi nerede olduğunu biliyorum, hızını ve yönünü biliyorum. Şimdi, düşmanı hedefine giderken mümkün olan en kısa sürede ve hızlıca kesmek için hangi yöne gitmesi gerektiğini bilmek istiyorum. Daha önce de belirtildiği gibi, ivme ilk başta görmezden gelinebilir, bu bile gerçek versiyona kıyasla çok fazla işlem süresi kazandıracaktır ... Yeni modelle, sadece düşman "her zaman için değil" bir coursechange "ateşlediğinde yeniden hesaplamalıyım. hasmoved "-Şimdi yaptığım gibi.
NobbZ

Evet, tanımladığınız şey takip etmektir . Hedefi bilmiyor .. "düşmanlar" geçerli konumu, hızı ve yönünü temel alan bir tahmin yapar
bummzack

Sonra açıklamayı yanlış anladım, yarın daha yakından bakacağım.
NobbZ

Belgeyi birkaç dakika önce okumayı bitirdim, arayış aradığım şey değil. Aslında benim uygulamam gibi, bir sonraki karenin konumunu hedeflemesi dışında, yine de her kareyi yeni kareler yeniden hesaplamam gerekiyor ve bu ders bazı eğrilerle sonuçlanıyor. Ama istediğim, doğrudan çizginin düşmanın her ikisi de buluşana kadar hızı veya rotayı değiştirmediğini varsayarak. Bu hala yeterince net değilse, işten sonra istediğimi çizmeye çalışıyorum. Ama yine de bağlantılar için teşekkürler. Bunu projede başka bir yerde kullanabileceğimi düşünüyorum.
NobbZ

@NobbZ Üzgünüm cevabım yardımcı olmadı. Sorunuzu buna göre düzenlemelisiniz, çünkü "Biliyorum, hızın değişmesi veya düşmanın seyri durumunda her hesaplamanın tekrarlanması gerekir" gibi yanıltıcı olabilir .. Bunu yaparsanız, "takip" yönlendirme davranışı.
bummzack
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.