AI taşınırken yerçekimi nasıl dikkate alınır?


9

2D bir oyun yapıyorum. Şu anda oyuncu tarafından kontrol edilen bir helikopter var. Yukarı ok tuşları ile kontrol edilir: YUKARI, SOL ve SAĞ.

Bu y ekseni dyboyunca hızı ve x ekseni boyunca hızı dx.

Bu fizik aşağıdaki gibidir:

Her ne zaman UP basılı değil , dysabit ivme içinde hızlandırır süresiz aşağı doğru. (Yerçekimi). dxgeçerli değerinde kalır.

Zaman yukarı basıldığında , dyo anda, her ne kadar sabit ivmede hızlandırır en fazla 4 (hız 4 ulaşana kadar, yukarıya doğru). dxgeçerli değerinde kalır.

Ne zaman SOL basıldığında , dxo anda, ne olursa olsun sürekli ivme, içinde hızlandırır kadar -4 .

Ne zaman SAĞ basıldığında , dx hızlandırır şu anda, her ne sürekli ivme, içinde en fazla 4 .

(Sol veya sağ preslenir ve yukarı zaman değil I bahsedilen olarak, aynı anda kumanda: dygiderek daha küçük ve daha küçük hale gelir yerçekimi helikopter etki olduğu için),

Bütün bunlar helikopteri sık sık düz çizgilerden ziyade havadaki kemerleri takip eder.

Bu oldukça gerçekçi görünen fizik yaratır.

Sorum şu:

Bir AI olan rakip helikopter aynı fizik sistemini kullanarak hareket etmelidir.

Diyelim ki AI şu anda olduğu yerden B noktasına gelmek istiyor.

resim açıklamasını buraya girin

Oyunda yerçekimi ve kademeli hızlanma olmasaydı, bu kolay olurdu. AI'nın konumundan B noktasına kadar bir vektör çizer ve AI'nın onu takip etmesini isterdim.

Fakat orada yerçekimi ve kademeli hızlanma, AI düz bir çizgide hareket asla (neredeyse). AI'yı mümkün olduğunca zaman verimli bir şekilde B noktasına gitmenin en iyi yolu ne olabilir?

Yapay zekayı belirli bir varış yerine doğru hareket ettirirken yerçekimini nasıl dikkate alabilirim?

(Açıklamak daha kolaysa, lütfen B noktasının y ekseninde AI ile aynı seviyede olduğunu ve çapraz değil olduğunu düşünün.)

Teşekkürler


Hareket halindeyken yapay zekadaki fiziği devre dışı bırakabilir misiniz? Öyleyse, noktaya doğru hareket ederken devre dışı bırakabilir ve ulaştığında etkinleştirebilirsiniz.
Zhafur

@Zhafur Bu, AI'nin hareketinin gerçekçi görünmemesini veya en azından oyuncunun hareketinin görünüşünden farklı olmasını sağlayacaktır. AI hareketinin oyuncunun hareketiyle aynı görünmesini istiyorum.
user3150201

Yanıtlar:


4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

Y ile aynı. Hızı sıfır ile maksimum hız arasında tutmayı unutmayın. Düşmanın bir noktada çok yavaş bir hızı varsa ve durmaya çalışıyorsa, zıt yönde hareket etmeye başlayabilir. İzin vermeyin. Yavaşlıyorsa ve hızı 1 * Acc.

Uzun versiyon: Hiçbir engel yoksa, y eksenindeki hareket, x eksenindeki hareketle tamamen ilgisizdir (ve etkilemez). Yani tarif ettiğiniz soru iki ayrı soruya ayrılabilir.

  1. Orada x ekseni üzerinde hareket
  2. Ve orada y Ekseni üzerinde hareket ediyor.

CS.x& CS.yx ve y eksenlerindeki mevcut hızımızdır.

TS.x& TS.yİlgili eksendeki mevcut hızınızı göz önünde bulundurarak yalnızca dikey veya yatay olarak durmanız gereken süredir.

D.x& D.yher eksendeki mesafedir.

tl; dr: aşağıdaki koşulun doğru olduğu bir noktaya ulaşıncaya kadar x ekseninde hızlanmaya devam ederseniz (mümkünse [en yüksek hıza ulaşmadıkça]):

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

Aynısı y ile aynıdır.


2

Benzer bir problem için kullandığım yaklaşımlardan biri, önce hedefe bir vektör çizmek, sonra bunu mevcut hız yönüyle karşılaştırmaktı.

Bu nedenle, hız vektörü ile hedef vektör arasındaki işaretli açıyı alın ve vektörün boyutuna göre bir itme uygulayın.

Dolayısıyla , kırmızı hız vektörü ile yeşil hedef vektörü arasındaki açı a negatifse, pozitif itme uygulayın, aksi takdirde itme uygulamayın ve yerçekiminin onu ayırmasına izin verin.resim açıklamasını buraya girin

Hedefin farklı olabileceği dört çeyreği ele almanız gerektiğini unutmayın (hedef sol üst köşedeymiş gibi itme uygulamak için pozitif bir açı gerekirdi).

Ayrıca, itme miktarını hedef hızdan sapmaya göre uyguladığınızdan emin olun.

Teknik olarak bu, yer çekimini hesaba katmıyor, mevcut durumu telafi ediyor ve AI helikopterinin hedefe düz bir çizgide uçmayabileceği, ancak biraz sallanacağı anlamına geliyor. Bu oyununuz için işe yarayabilir veya çalışmayabilir.


1
Teşekkürler. Bu konuda çeşitli sorular: 1- "... vektörün boyutuna göre bir baskı uygulayın " . Şunu mu demek istediniz: " angle of size " ? 2- 'İşaretli açı' ile pozitif mi negatif mi demek istediniz - doğru mu? Eğer öyleyse, bir açı daha kahverengi çizginin üstünde ise pozitif, kahverengi çizginin altında ise negatiftir. Sağ? 3- Doğru anlarsam, ne demek istediğiniz: Her karede, geçerli hız vektörü ile mevcut vektör arasındaki hedefe olan açıyı alın. Sonra dx 'den ekleyin / çıkarın ve buna göre boyayın. Bu doğru mu?
user3150201

@ user3150201 Açı sorusunda evet. Evet imzalı / imzasız soruda atan2 size iki vektör arasındaki işaretli açıyı verebilir. Demek istediğimi anladın, belirsiz olursam özür dilerim.
bornander

1

Her bir X karesinin hareketini yeniden hesaplayabilirsiniz. Araya çok fazla çerçeve koymadığınızı varsayarsak, ancak performansı etkilemez, bir helikopterdeki yerçekimi yörüngenin gerçekten değiştiğini görecek kadar güçlü olmamalıdır. Ayrıca, bir oyuncunun muhtemelen aynı şekilde hareket edebileceğini, hareket ederken ve planlanmasını sağlayamadan yer çekimine uyum sağlayabileceğini düşünüyorum.

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.