Farseer / box2d gibi bir 2d fizik motorunda AI yolunu nasıl izliyorsunuz?


12

Üzerinde çalıştığım 2d yukarıdan aşağıya bir oyun Farseer gibi uygun bir katı vücut fizik motoruna taşınma sürecindeyim. Şimdiye kadar, gerektiğinde kendi fizik kodumu hackledim.

Burada bir şeyler yapmanın uygun yolunu öğrenmeye çalışıyorum.

Fizik motorunun içinde katı cisimler yaptıktan sonra AI'nızın belirli bir yolu izlemesini sağlamanın doğru yolu nedir?

Haritamda takip edebileceğim yapay zekaya ihtiyaç duyduğum bir navigasyon düğümleri yolum varsa, daha önce bir sonraki zaman adımında olması gereken bir sonraki konumu hesaplayarak ve bu konuma manuel olarak ayarlayarak onları elle yol boyunca hareket ettirirdim .

Ama şimdi katı bedenler ve çarpışmalara ve onları vurabilecek ve onları patlatabilecek güçlere maruz kalıyorlar.

Yapay zekayı harekete geçirmek için şimdi onlara dürtü / kuvvet uygulamam gerektiğine inanıyorum? Artık her kareyi kendi pozisyonlarını manuel olarak ayarlamamalıyım.

Bu yüzden, yapay zekayı, vurulursa herhangi bir yönde çarpılabilecek deterministik olmayan bir dünyaya doğru bir yol izlemeye zorladığım deterministik bir dünyadan gitmem gerekiyor ve onları sadece yoldaki bir sonraki düğüme doğru itiyorum hareket ettirmek için.

Bu doğru mu? Diğer insanlar böyle mi yapıyor?

Bu, yapay zekanızın kesin bir yolda yürümedikleri için manzaranın köşelerine yapışmasını nasıl önleyeceğinizle ilgili bazı soruları gündeme getiriyor, bu tür şeyleri nasıl ele alıyorsunuz?

Yoksa ikisini bir şekilde karıştırmak ve konumunuzu manuel olarak ayarlayarak AI'nizin sabit bir yolu takip etmesini ve yalnızca belirli durumlarda kolayca kontrol edebileceğiniz belirli güçlere tepki vermesini mi daha iyi?

Herhangi bir tavsiye için teşekkürler çocuklar.


1
+1 Bunu öğrenmekle de oldukça ilgileniyorum.
David Gouveia

Yanıtlar:


7

Direksiyon davranışları bir fizik motoru ile birlikte çok iyi çalışır, çünkü genellikle fizik bedeninize uygulanabilecek bir "direksiyon kuvveti" döndürecek şekilde uygulanırlar.

Bir ünite bir yol izlemesini sağlamak için, kullanabilirsiniz Seek kullanmak sonra (önlemek aşmayı emin olun) yolu-düğüme giden yol-düğümden gitmek ve Geliş senin yoldaki son düğümde.

Sıkışmakla ilgili endişelerinize gelince: Yol takip eden güçleri modellemek aslında oldukça doğru olmalıdır. Bir nesnenin başka bir nesneyle çarpışması durumunda yoldan fırlayabileceğini haklıyorsunuz, ancak her güncellemede bir yönlendirme kuvveti hesaplayacağınız için, nesne hiçbir zaman tekrar yolda olmalıdır. Bir çarpışmadan sonra yoldan sapma potansiyel olarak büyük olabilirse, bir çarpışma meydana geldiğinde son konumunuzu hatırlamanızı ve ardından normal rotaya devam etmeden önce nesneyi son konuma geri yönlendirmenizi öneririm.


Harika makale, paylaştığın için teşekkürler. Günümü kurtardım.
Ricardo Sanchez-Saez

0

Doğru yolda olduğunuzu söyleyebilirim, bu makaleye bakmak isteyebilirsiniz:

http://www.policyalmanac.org/games/aStarTutorial.htm

A * algoritmasını kullanarak bazı temel çarpışma önleme ve yol bulma yöntemlerini açıklar.

Düzenle:

Nesnelerinizi doğru yönde ilerletmenin en iyi yoluna gerçekten ihtiyacınız varsa, o zaman, seçim


Makalenin bu soru ile alakalı olduğunu düşünmüyorum. OP iki yer arasındaki en uygun yolu nasıl bulacağını sormak yerine, bir aktörün bir fizik simülasyonu bağlamında zaten hesapladığı bir yolu nasıl izleyeceğini soruyor.
David Gouveia

tekrar okuduğum zaman, senin
fikrini

:) İşleri temizlemek için başlığı da değiştirdim. Kesinlikle yolu bulmak yerine yol takip ilgileniyor.
TerryB

0

@Davidluzgouveia'nın anonim olarak yazılan yorumuna baktığımda, projemi gündeme getireceğim. Yol izleme ve yol bulma çok farklıdır. Yol bulma daha çok anonim olarak gönderilen şeydir ve yol bulma için Dijkstra'nın algoritmasına bakarım. İzleyen yol için seçim fizik motorumu tamamen kullanıyorum. Benim kurmamın yolu, bir birim sınıfının yürüdüğü her yerin, 2D ofsetleri aracılığıyla yol alt sınıfına yerleştirilmiş olması, evet, 2D değil ve 3D değil, bu benim oyunumda fizik ayarladığımdan dolayı .

3D açıklama: Her birimin yalnızca arazi ve dünya nesneleri ile çarpışma için ayarlanmış tek bir ana çarpıştırıcısı vardır. Bu bir kapsül şekli ve yarıçapı ve programlı olarak yüksekliği var. Modelin merkezine inşa edilmiştir ve modelin önünü ve tepesini geçmelidir. Ama aynı zamanda her zaman yerden ne kadar uzakta olduğu için bir yüzey kayması var ve her seferinde hafifçe sıçramadan önce ne kadar kaymasına izin verildiğinin bir kayanı var. Bu, bir arazi çarpışma problemi için bir çeşit vidalı düzeltme uyguluyorum, ama nedenlerim var.

Her neyse, bu kapsül nesnesine kuvvet uygulamalısınız ve her zaman yerden yüksekte kalmalıdır. Bu daha yükseğe çıkamayacağı anlamına gelmez, sadece daha aşağıya gidemez. Üzerine gelmek için neden olmasının nedeni (benim durumumda), katı bir gövde ve ragdoll fizik motorunda, birimlerimin bacaklarının prosedürel olarak canlandırılmasıdır. Böylece kapsüle basit bir kuvvet uygulayarak, varlığımın bacakları kendilerini kendi başlarına yeniden konumlandıracaklar. Ayrı ayrı yerçekimi uygulamalarına da sahip olacaklar! Bunun yaptığı, karakterimin eğik olması durumunda, bir ayağın diğerinden daha düşük bir yükseklikte olabilmesine izin vermektir.

Tam olarak böyle yapmalısınız. Bunun ne istediğine bakılırsa. Bazı özellikleri dışarıda bırakmak istiyorsanız, bu özellikle iyi bir RTS veya FPS ise ve hiç kimse ünite ayaklarını görmeyecek veya yine de bakım yapmayacaksa, bu gayet iyi. Ancak genel olarak, birimin karakterin neredeyse tamamen hareketi ile çalışan bir ANA çarpışma nesnesi olmalıdır.

Özellikle 2D: Motorun itmesi için bir ünitenin hareketi için hala bir ana noktanız veya sadece bir tür referansınız olmalıdır. Her birime gitmesi gereken birkaç yere sahip bir yol alt sınıfı verebilirsiniz, seviye kodunda (örneğin, konum1 (x, y) konum2 (x, y) vb.) En iyi şekilde ( ne tür bir oyun üzerinde çalıştığınızı bilmiyor olabilirsiniz) muhtemelen seviye içindeki yerleri belirtmek ve her birimin bunları seviye tarafından belirtilen sırayla işlemesini ve her bir konuma ulaştıktan sonra, istenen konumu bir sonraki almak gerekir.

Her birim için ilk etapta bir yer listesine sahip olmak gibi, bunu değiştirmenin tonlarca yolu vardır, çünkü bu, tüm birimlerin aynı yerlere gitmesi gerektiği anlamına gelmez. Ancak, aynı şekilde, bunu seviye kodunda da yapabilirsiniz (unit1.location1 (x, y) unit1.location2 (x, y) grunt.l1 (x, y) knight.loc3 (x, y) her neyse)

Sadece birkaç fikir! 3D sürümü çok daha az alakalı olmasına rağmen okumanızı öneririm.

EDIT: Ben sadece bunu okuyabilir herkes için tedarik karar verdi (Evet bu doğru) .... (Aslında sadece sorunuzu yağsız ve ben tekrar okuyun kadar oldukça 2B spesifik olduğunu fark etmedi>.>)

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.