Düzgün olmayan bir gezegen yüzeyinde yol bulma


16

Benim sorum, düzensiz bir gezegen yüzeyinde yol bulmaya en iyi yaklaşımın ne olacağı?


Arkaplan bilgisi

Deplasman haritalamasından 6 küre planlı düzlemden bir gezegen yarattım. Düzlemler başlangıçta bir küre şekline yansıtılmadan önce bir küp oluşturdu.

resim açıklamasını buraya girin

Her bir "öngörülen küp yüzünü" ızgara olarak kullanmak ve mümkün olan en iyi rotayı bulmak için basit bir A * algoritması kullanmak mümkün olup olmadığını merak ediyorum, ayrıca yolun tırmanmasını önlemek için yer değiştirme yüksekliğinin de dikkate alınmasını istiyorum dağlar vb Diğer bir faktör ı elde etmiş olmasıdır (bunun sadece a * algoritması içinde sezgisel olacağını tahmin) gezegen hareketi , Unity3D fizik motorunu yararlanarak gezegenin merkezine doğru yerçekimi uygulanır. Önerilen çözümüm, ajanların hareketinin yerçekimi fiziğine bağımsız olarak kontrol edilmesini gerektirir mi?

Sorumu daha iyi ifade edebilmek için şu anki gezegen bedenim:

resim açıklamasını buraya girin


2
Bu videoya Gezegensel Yok Etme ile ilgilenebilirsiniz . Dünyayı bir küp ve etrafındaki yol bulgusundan sararken aynı şeyi yapıyorlar. Bu gerçekten bir cevap değil, ancak bir küredeki yol bulmayı optimize etmek için A * ile birlikte başka stratejiler kullandıklarını görebilirsiniz. Yol bulma biti 24: 30'da başlar .
MichaelHouse

@ Byte56 Bu bağlantı için teşekkürler maliyete gerçekten ilginç bir yaklaşım, bittiğinde bu oyunu görmek için sabırsızlanıyorum!
Caius Eugene

Yanıtlar:


12

Görünüşe göre kendi sorunuzu cevapladınız. A * muhtemelen en iyi yaklaşımdır. Evet elbette dağlardan kaçınmak için yükseklik bilgilerinin kullanılması da dahil olmak üzere tarif ettiğiniz şekilde kullanılabilir. Dünyanızın yüzeyindeki herhangi bir ızgara hakkındaki bilgilere erişebildiğiniz sürece, A * buluşsal yönteminde kullanamamanız için hiçbir neden yoktur.

Son olarak, yol bulmayı sorunuzun sonunda izlenen yolla karıştırıyorsunuz. Yol bulma, sezgisel olarak eklemediğiniz sürece ve bir gezegenin yüzeyinde olduğunuzdan, yerçekimi ile ilgilenmez, yerçekimi esasen tüm yüzey üzerinde aynı olacaktır. Birçok oyunun hareketle birlikte yerçekimi var, yapamamanın hiçbir nedeni yok.

Temelde kırmızıdan maviye giden, bir küpte olduğu gibi bir kürede aynı olacak şekilde eşlemek istiyoruz.

resim açıklamasını buraya girin

A * sık sık mevcut düğümüne komşu olduğundan, bitişik düğümleri almak için kolayca bir dizi işlev oluşturabilirsiniz. Örneğin, getXPlus(), getXMinus(), getZPlus()ve bu kadar. Bu işlevler geçerli düğümü alır ve düğümü işlev adıyla belirtilen yönde döndürür.

Çoğu zaman bu fonksiyonlar bir değeri arttırabilir ve ancak kenarlarda bu değişecektir.

Küpünüzün yüzeyini bir 2D koordinat sistemine eşlemek isteyeceksiniz. Ancak bunu yapmak size kalmış, sıraya girmek zorunda değiller, her ızgara alanına benzersiz bir X, Y koordinatı verin.

Şimdi bir kenardayken ve bitişik ızgara alanını elde etmek, sadece koordinatları arttırmak zorunda değildir. Hangi yüze geçtiğimizi bulmalı ve o yüzün koordinatlarına geçmeliyiz.

Örneğin, XPlus koordinatının buraya getirilmesi hem X hem de Y koordinatlarını değiştirecektir, çünkü yeni bir yüzdeki yeni bir ızgara alanına geçiyoruz. Yeşil çizgi iki yüz arasındaki bir kenarı temsil eder.

resim açıklamasını buraya girin

Şimdi bunlar sadece küresel koordinatlar, şu anda üzerinde bulunduğunuz küp yüzünü temsil eden 3. boyutla dahili bir yerel koordinat sistemi kullanmak daha kolay olabilir.

Her iki durumda da, küpün önündeki her ızgara alanı için benzersiz bir koordinatınızın olması gerekir. Aralarında geçiş yapmak, koordinat sistemini nasıl uyguladığınıza bağlı olacaktır. Bu koordinatın kürenin yüzeyiyle de nerede eşleştiğini bilmeniz gerekir.

Tüm bunlar eninde sonunda soyutlanmalı, böylece onu bile bilmiyorsunuz.


Yanıt için şerefe. Sanırım mücadele ettiğim şey her bir düzlemin izole edilmiş bir ızgara olması. Dikişlerle nasıl başa çıkılacağına dair herhangi bir öneriniz (veya daha fazla okuma) varsa, matematiksel olarak "küpümü" açacağım, tüm ızgaraları birleştireceğim ve bu veri kümesini kullanarak yolu hesaplayacağım?
Caius Eugene

Gerçekten endişelenmen gereken kenarlar. Bu, bir sarmalayıcı işlevi ile kolayca çözülür (küpünüzü bir sarmalayıcı işlevine sarmalamak, dünyanızı saran ...). Küpü saran düz bir yüzeye soyutlayabilirsiniz. Bitişik ızgara alanını elde etmek için işlevler oluşturun, getXPlus () ızgarayı XPlus yönünde alır, yüzler arasındaki sınırda olması fark etmez, işlev sadece yüzleri değiştirir ve uygun ızgara bilgilerini döndürür.
MichaelHouse

Katlanmış küp üzerinde yol bulma ile ilgili tek yanlışlık, köşelerin eğrilmiş olması ve bu nedenle kenarların farklı uzunluklara sahip olmasıdır. Ortaya çıkan yollarda gözle görülür bir fark yaratmayabilir ve aksi takdirde uzunlukları dikkate alabilirsiniz.
danijar

1
Burada anlaşılması gereken önemli şey, A * 'nın mutlaka bir uçakta işlememesi; bir grafik üzerinde çalışır. Her küp yüzünde, düğümler bir ızgaraya yerleştirilip bağlanmış olsa da, küpün kenarları boyunca düğüm bağlantıları da vardır.
jmegaffin

1
@ Byte56 Harika cevap için teşekkürler, bir çözüm sunmaya başladım, ancak bir barikat vurdum. Belki yanlış anladım. Daha fazla matematik / programlama problemi hissettiğim için stackoverflow'da bir soru yayınladım stackoverflow.com/questions/16089074/…
Caius Eugene
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.