Çalışma zamanında dinamik bir ortamda 2B gezinme ağını nasıl oluşturabilirim?


9

Bu yüzden yol bulmak için A * 'yı nasıl kullanacağımı kavradım ve bunu bir ızgarada kullanabiliyorum. Ancak, oyun dünyam çok büyük ve oyuncuya doğru hareket eden birçok düşman var, bu da hareketli bir hedef, bu yüzden bir ızgara sistemi yol bulmak için çok yavaş. Gezinme ağını kullanarak düğüm grafiğimi basitleştirmem gerekiyor.

Bir ağın "nasıl" çalıştığını kavrarım (çokgenlerin köşelerinde ve / veya kenarlarındaki merkezlerdeki düğümlerden bir yol bulma).

Oyunum, çalışma zamanında prosedürel olarak oluşturulan dinamik engelleri kullanıyor.

Başımı, içinde birden fazla engel bulunan bir uçağın nasıl alınacağı etrafına dolayamıyorum ve yürünebilir alanı, aşağıdaki görüntü gibi, gezinme ağı için çokgenlere bölüyoruz.

seyir ağı

Nereden başlamalıyım? Yürütülebilir alanın bir segmentinin ne zaman tanımlandığını veya daha da kötüsünü, algoritmanın harita üzerinde "yürürken" daha önce tanımlanmış bir yürünebilir alanı alt bölümlere ayırmam gerektiğini fark ettiğimde nasıl anlarım?

Eğer önemli olursa, nodejs'de javascript kullanıyorum.


1
Uygulamaya çalıştığınız dinamik bölümleme, harita öğelerinizin özelliklerine bağlı olacaktır. Engel öğeleriniz, örneğinizde gösterildiği gibi tamamen ızgaraya hizalanmış dikdörtgenlerden mi oluşuyor? Döndürülmüş dikdörtgenler? Düzensiz çokgenler? Veya çok sayıda eğriye sahip çokgen olmayan şekiller? Engellerin şekli için nokta / poli verileriniz var mı? Öyleyse, şekil verileri üçgenler, dikdörtgenler, sadece dışbükey çokgenler veya bir dışbükey ve içbükey çokgenler karışımı mıdır?
Matthew R

@Matthew Dünyam dışbükey çokgen engelleri, eğriler ve içbükey çokgenlerden oluşuyor. Her engel, köşeleri vektör nesneleriyle temsil edilen çokgen bir nesne olarak saklanır.
Stephen

1
Ne için değer, ben bu kağıda dayalı bir çözüm üzerinde çalışıyorum: gradworks.umi.com/3493710.pdf Başarılı olursa, benim çözüm göndereceğiz.
Stephen

1
% 100 gezinme ağı orada bir yere gidip gidemeyeceğinizi size söyleyemez, sadece yürünebilir alanların temel bir
taslağıdır

@Stephen - Uzun Yorum yanıtına bakın .
Matthew R

Yanıtlar:


3

@Stephen - http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/PolyPart/polyPartition.htm Uzun Yorum - Bu makale, biraz zamanım olduğunda okunmaya değer gibi görünüyor. Temel olarak önerebileceğim, makalede bahsedilen Hertel-Mehlhorn Algoritması çizgileri boyunca bir şey (bu özel algoritma için bir referans burada bulunabilir http://www.bringyou.to/compgeom/ ) harita kenarlarının alt bölümlere ayrılması (oyun alanının sınırı dışında), köşelerde oluşan çoklu küçük üçgenlerin oluşumunu azaltmak için belirli bir süre. Bu küçük üçgenler, yol bulma için önceden oluşturduğunuz şeyden daha küçük olmaları nedeniyle sorunlu olabilir. Hertel-Mehlhorn, eğer ilgileniyorsanız daha fazla üçgenleme ile ilgileniyorsanız, üçgen bir bölümleme tarafından üretilen çokgenlerin azaltılması içindir: .

Ayrıca, tekerleği yeniden icat etmek istemiyorsanız, bu kütüphanenin gerçekten ihtiyacınız olan her şeyi yapacağını düşünüyorum: http://code.google.com/p/polypartition/ . Hertel-Mehlhorn dahil olmak üzere bir dizi farklı seçenekle üçgenleme ve indirimleri önceden yapar. Bu bir MIT Lisansıdır, yani bir sorun olduğunda kapalı kaynaklı ve ticari projeler için kullanılabilir.

Kendi uygulamanız üzerinde çalışmaya devam etmeye karar verirseniz, ne bulduğunuzu görmek isterim.


1
Harika cevap, @ Mathew. Ve kesinlikle bu makaleyi okumalısınız! Harika bir tekniği takip etmek ve açıklamak kolaydır (özellikle ağın ajan tabanlı keşfi / üretimi hakkında konuşan Ek A). Javascript için bu algoritmanın bir sürümünü kodluyorum ve iyi geliyor. Tamamlandığında cevap olarak göndereceğim.
Stephen

@Stephen bu işi görmek isterdim
kevzettler

@Stephen Ben de bir javascript sürümü arıyorum
Apolo

6

Bir kafes yerine, hiyerarşik bir A * yaklaşımını düşünebilirsiniz. Bir kafesin en büyük avantajı, bir ızgaradaki karmaşıklığı azaltmaktan ziyade ızgaraya hizalanmamış oyun dünyalarıyla uğraşmaktır.

Hiyerarşik bir yaklaşımla dünyanızı tekrar tekrar alt gruplara ayırırsınız (dörtlü bir ağaç gibi) ve düğümler arasında bağlantı bilgileri üretirsiniz. Daha sonra, dünyanın büyük parçaları arasında hızlı bir yol oluşturabilir ve daha büyük bir yığın içindeki yolu bulmak için yalnızca yüksek çözünürlüklü ızgarayı kullanabilirsiniz.

Hiyerarşik yaklaşım, büyüklük derecelerine daha iyi performans verirken, en iyi ağ sadece size küçük bir doğrusal gelişme sağlayacaktır.

Naif yaklaşım, dünyanızı X'e X daha büyük ızgara hizalı parçalar halinde bölmek, aralarındaki bağlantı bilgilerini oluşturmaktır (örneğin, 2x1 ile 3x1'den 2x2'ye kadar bir yol var ve ortalama yolun mesafesi nedir). .

Bazı özel durumlarda bu yaklaşımla her zaman ideal yollar bulamayabileceğinizi unutmayın. Değişken boyutlu parçalar oluşturmak sorunu hafifletir, ancak dürüst olmak gerekirse, sorunlu yollarla her zamankinden daha iyi hale gelmekten kaçınmak ve oyuncunun, en dejenere vakalar.


1
Daha fazla açıklamalıyım: Oyunum ızgaraya uygun değil. 800 x 600 piksel alanda bir ızgara yapıyordum, her piksel ızgarada bir boşluktu (hala A * anlıyordum, bu yüzden bunun performansını henüz düşünmüyordum). Yukarıdaki örnek görüntüdekiler kadar basit olmayan engellerim var, sadece sorunu göstermeye çalışıyordum. Açıkçası böyle bir oyun alanının revize edilmesi gerekiyordu ve bazı araştırmalardan sonra bir nav mesh'in doğru yol olacağını düşünüyorum.
Stephen

3

Bence bunu aşırı komplike ediyor olabilirsiniz. Muhtemelen anında gezinme ağları oluşturmanıza gerek yoktur. Bunun yerine temel dünyanız için statik bir gezinme ağına sahip olun.

Engellerin etrafındaki yol, direksiyon davranışları kullanılarak çözülebilir (engellerden kaçınma kullanın). Kapalı şansınız engeliniz o kadar büyükse, bir nav-poly'den diğerine seyahatleri doldurur veya tamamen kapatırsa, bu kenar durumunu kontrol etmek için bir yolunuz var ve şu anda bulunduğunuz poli ile Biri engellendi.

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.