Yapay zeka için hedefe ulaşmak için doğru hızı bulma


10

Maksimum hızda seyahat eden maxSpeedve rotationSpeedsaniyede derece dönebilen bir gemim var . Gemi her zaman baktığı yöne doğru hareket eder, yani gemi ne kadar hızlı seyahat ederse dönüş yarıçapı o kadar büyük olur.

Konumumu, dönüşümü ve hedefin konumunu biliyorum.

Anlamak istediğim, bir hedefin bu hızda dönüş yarıçapım içinde mi yoksa daha iyisi, sürekli olarak dolaşmadan hedefe dönüş yapmak için gidebileceğim maksimum hız nedir?

Bunu yapmanın etkili (ish) bir yolu var mı?

Şimdiye kadar düşündüğüm şey: Adım başına ne kadar seyahat ettiğimi ve adım başına ne kadar döndüğümü biliyorum, sonraki iki çerçevede nerede olacağımı anlayabilirim. Geçerli konumum p1, sonraki konumum p2 sonra p3. (P1, p2) ve (p2, p3) 'in dik açıortaylarını alabilirim. Kesişme noktaları bana bir çemberin merkezini verecek. Daha sonra hedefin o dairede olup olmadığını test edebilirim.

Bunun 3D olarak çalışıp çalışmayacağından emin değilim (girişlerimle bir kürenin nasıl hesaplanacağından emin değilim). Bu çözüm aynı zamanda seyahat etmek için doğru hızı bulmakta çok fazla yardımcı olmaz, makul bir hız bulmak için farklı hızlarla birkaç kez denemek zorunda kalacağım.

Herkes daha iyi bir çözüme ışık tutabilir mi?

Yanıtlar:


17

Yapay zeka kontrollü birimin bağlı dönüş hızı ve ayarlanabilir hareket hızı olan bir hedefe ulaşmasının iki yolu vardır.

İlk olarak, daha iyi anlayabilmemiz için bize sunulan zorluğu ele alalım:

resim açıklamasını buraya girin

Oyuncu sağ veya sol tarafındaki bir hedefe ulaşmaya çalışırken sabit hızlarda hareket edip dönüyorsa, sonsuza kadar dairelerde hareket eder, asla hedefine bakmaz. Oyuncunun daire içine alacağı iki alan yukarıda kırmızı ile işaretlenmiştir.

Kırmızı ile işaretlenmiş dairesel alan şu şekilde hesaplanabilir:

radius = movementSpeed / rotationSpeedInRadians;
circlesCenterX = unitX + cos(unitAngle + / - PI) * radius;
circlesCenterY = unitY + sin(unitAngle + / - PI) * radius;

Bu, kırmızı dairelerin konumu ve yarıçapı ile sonuçlanır. Bunu, belirli bir hedefin, hedefin yönüne doğru dönmeye devam ederse, AI kontrollü birimin erişiminin dışında olup olmadığını belirlemek için kullanabiliriz.

Belirli bir öğenin dairelerden birinde olup olmadığını öğrenmek için dairelerin merkezinden olan mesafeyi hesaplıyoruz:

if ((circleX - goalX)^2 + (circleY - goalY)^2 < radius^2) //goal is within red circle

Bunun için iki olası çözüm vardır:

1.

Hedef dairesel kırmızı alanın dışına çıkana kadar biraz mesafe oluşturun ve sonra u dönüşü moda gibi dönün. Bu basittir, kontrol hedefin bu daire içinde olmadığına dönene kadar ünitenin hareket etmesine izin verin. Sonra dönebilirsiniz.

resim açıklamasını buraya girin

Diğer seçenek hesaplamak için biraz daha çalışma gerektirir:

AI birimi ile hedef arasında hayali bir çizgi çiziyoruz. Aralarındaki açıyı kullanarak:

angle = Math.atan2(goalY - unitY, goalX - unitX);

Şimdi doğru hızı hesaplamak için aşağıdakileri yapmanız gerekir:

correctSpeed = rotationSpeedInRadians * (distance / 2) / cos(angle);

resim açıklamasını buraya girin

3D durumda çalışmasını sağlamak için:

Aşağıdaki üç noktanın bulunduğu düzlemi bulun:

  1. Hedef noktası.
  2. AI biriminin önceki çerçevedeki konumu.
  3. AI biriminin geçerli konumu.

Hızı 2d yolunda hesaplamak için bu düzlemi kullanabilirsiniz. Noktaları 3B değerlerinden ortak düzlemlerinde gömülü 2d değerlerine dönüştürmeniz yeterlidir.

Bunu kullanmak isteyebilirsiniz:

Bir düzlemdeki 3B noktayı UV koordinatlarına nasıl dönüştürebilirim?


Mükemmel! Tam olarak umduğum cevap! Ayrıntılı açıklamalarınız için teşekkürler, bence bu konuda tahmin edip 3D olarak kullanabiliyorum.
weichsem

@weichsem Cevabı güncelledim. Önerdiğim fikir, paylaştıkları ortak bir 2d düzlüğü bulmak ve doğru hızı hesaplamak için kullanmaktır.
AturSams
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.