Küresel harita gösterimi


19

En son oyunum ufak bir uçakta gerçekleşecek. Bir kürenin yüzeyindeki hücreleri temsil etmek için iyi veri yapısı arıyorum. Üçgenler, kareler, beşgenler, altıgenler? Hangisi en çok gerilmeyi en aza indirir ve en iyi döşemeyi oluşturur?

Küresel haritalama en kolay olanıdır, ancak kutuplardaki esneme kabul edilemez. Cubemapping de oldukça kolaydır, ancak küp köşelerinin yakınında hala önemli ölçüde gerginlik olacaktır. Bir ikosahedronun alt bölümlere ayrılması gerilme açısından en iyi gibi görünmektedir, ancak birçok üçgen dizinin indekslenmesi ve sınırlarda komşu hücrelerin bulunması zor olacaktır.

Sanırım N-gons'u temsil eden tek bir doğrusal nokta dizisi kullanabilirdim, her biri N komşu indeksleri dizisine sahipti, ancak bu büyük bir alan israfı gibi görünüyor.

Oyunda RTS öğeleri var, bu yüzden etki haritaları gibi şeyler depolayacağım ve A * yol bulma ve evrişim gerçekleştireceğim, bu yüzden temsilin verimli olması gerekiyor.


Sadece oyuncuların bir yöne gitmesine ve nihayet başladığı yere gelmesine izin vermek yerine haritanın kesin topolojisi ne kadar önemlidir? En basit ve en etkin temsil bir torus / çörek olacaktır.
congusbongus

1
Evet, küresel haritalamadan ve kutuplarla ilgili problemlerinden bahsettim. 3B yüzey noktasından dizi indeksine olabildiğince az esneme ile eşleştirmeye ihtiyacım var.
DaleyPaley

Bir küre oluşturmak için tetrahedonu alt bölümlere ayırmayı deneyebilirsiniz. Eşit büyüklükte ve dağıtılmış üçgenlerden oluşur.
thalador

1
@thalador Öneri için teşekkürler. Emin değilim ama üçgen rotaya gidersem ikosahedronların tetrahedronlardan daha iyi olduğunu düşünüyorum. Ama neyse, tesselasyon sorun değil. Beni rahatsız eden verimli dizi indeksleme.
DaleyPaley

Yanıtlar:


12

Tamam, bu konuyla ilgilenen herkes için şimdi seçtiğim çözümü ayrıntılandıracağım. Bana cevap veren ve fikir veren herkese teşekkürler.

İlk olarak, 'en iyi' tesselasyon için, kesilmiş ikosahedronu bir başlangıç ​​noktası olarak seçeceğim . Alt bölümlere ayrılması , eğriliği sağlayan 12 beşgen ile altıgenlerin çok güzel bir şekilde tesselasyonuna yol açar . Ayrıca, ikili alt bölüme devam etmek bana güzel özelliklere sahip render için çok iyi bir üçgen ağ verecektir. 12 beşgen hücreye gelince: Onları görmezden gelebilir, onları özel yapabilirim (bazların inşa edilebileceği tek yer gibi) veya bunları sahne altında saklayabilirim.

Altıgen ve beşgen hücreler, komşulara kolay erişim ve hızlı geçiş için yarım kenarlı bir veri yapısında saklanacaktır . Tek zor kısım, belirli bir dünya noktasının hangi hücrenin içinde olduğunu bulmaktır, ancak bu rastgele bir hücreden başlayıp komşulardan noktaya doğru yürüyerek yapılabilir.

Umarım birisi bu bilgiyi faydalı bulur. Çok şey öğrendim ve bazı sonuçlar elde etmeyi dört gözle bekliyorum.

Düzenle:

Burada yarım kenarlı veri yapısı kullanılarak ikosahedron alt bölümümün ve çift ağ anahtarlamamın sonucunu gösteren bir resim var.

Hücre bölgelerini daha da homojen hale getirmek için birkaç gevşeme tekrarı yapabilirim.

ikosahedron alt bölümü


7

Sorunuzda önerdiğiniz gibi, bir icosahedronu alt bölümlere ayırmaya dayalı olarak bunu zarif bir şekilde yapmanın bir yolu vardır. Bir ikosahedron 20 eşkenar üçgenden oluşur ve bu üçgenler 5 set halinde gruplandırılabilir, burada bir setteki 4 üçgen paralelkenar şeklini oluşturur:

resim açıklamasını buraya girin

(İçinden çizilen bir dalgalı dört üçgen grubu, bahsettiğim paralelkenarlar. Oklar, bunu bir ikosahedrona katlamak için hangi kenarların birbirine yapıştırılacağını söylüyor.)

Bu üçgenler daha küçük üçgenlere bölünürse, tüm paralelkenar n x 4n dikdörtgen dizisi gibi dizine eklenebilir (örnekte n = 4):

resim açıklamasını buraya girin

Her hücredeki sayılar dikdörtgen dizinin sütun sayılarıdır. Dizideki komşuları bulmak için kurallar oldukça basittir: yatay komşular sadece artı veya eksi 1 sütundur, dikey komşu eksi bir satır ve artı bir sütun veya artı bir satır ve eksi bir sütundur. sütun sayısı sırasıyla çift veya tek.

Bununla birlikte, bir paralelkenardan diğerine sınırı geçen komşuları bulmak için hala bazı özel durum kodları yazmanız gerekir. Bazı yerlerde, bir paralelkenarın üst veya alt kısmı diğerinin yanına bağlanacak veya üst ve alt aralarında yatay bir ofset vb. İle bağlanacaktır. Muhtemelen yarım kenarlı bir yapı veya benzeri çünkü paralelkenarlar burada yararlı olacaktır. Bununla birlikte, en azından ilişkiler 5 paralelkenarın tümü arasında simetriktir: hepsi, hangi tarafın komşularının diğer tarafına bağlandığı aynı modeli izler.


Bu gerçekten çok güzel bir temsil. Üçgen yöntemlerle ilgili temel kaygım, üçgen dizileri ve tüm dikişleri korumaktı. Burada hala küçük bir dikiş var ama diziler dikdörtgen. Teşekkürler, bilmek çok iyi
DaleyPaley

3

Hmmm - streç hakkındaki yorumlar, küresel ve düzlemsel haritalama arasında hareket ettiğinizi gösterir, kutuplardaki bozulmalara yol açan şey budur

Fayansların düz ve düzgün olmasını istiyorsanız, bir icosahedronun, özellikle de kesilmiş bir icosahedronun oldukça yaygın olduğunu haklıyorsunuz

Tüm farklı eşlemeleri burada bulabilirsiniz - Vikipedi'de Küresel Çokyüzlülükler

Yüzler arasındaki ilişkileri sürdürdüğünüz sürece, bu bir topoloji problemidir - kanatlı kenarı veya dörtlü kenarı yararlı bulabilirsiniz (ve yepyeni bir cebir formuyla tanışmak için harika bir fırsat elde edebilirsiniz) Kanatlı Kenar


Ah, kesik bir ikosahedron. Evet, tam da ihtiyacım olan şey bu. Teşekkürler. Ayrıca, kanatlı kenarı hiç kullanmamış olsam da, örgü manipülasyonu için çok fazla yarım kenar kullandım, bu yüzden bu alanda iyi bilgiliyim. Şerefe, bir çözümün yakınındayım.
DaleyPaley

2

Sanırım partiye biraz geç geliyorum, ama burada keyfi boyut ve düzgün görünümün küresel bir dünyasını korumak için kullanılabilecek olası bir çözüm.

Burada anlaşılması gereken en önemli şey, dünyanın düz olmadığı ve bu nedenle% 100 üniform bir döşemenin imkansız olacağıdır (bu, Tüylü Top Teoreminden sonra gelir ). Bazı düzensizliklere izin verilmelidir ve umabileceğimiz en iyi şey, bu düzensizlikleri yüzeye eşit olarak yaymak ve her birini mümkün olduğunca küçük yapmaktır.

Deterministik olmayan bir şekilde yapmak oldukça kolaydır. İlk olarak, yüzey etrafında eşit olarak N rastgele nokta seçin. Bu noktaların gerçekten aynı olduğundan emin olun (bkz. Küre noktası toplama , formül 9-11). İkinci adımda, bu noktaları daha az rastgele ve daha düzgün hale getiriyoruz: tüm bu noktaların birbirlerini itmeleri için negatif elektrik yüküne sahip olduklarını varsayın. Noktaların denge durumuna gelene kadar birkaç adım boyunca hareketini simüle edin. Noktaların bu son konfigürasyonu, kürenin yüzeyi etrafında neredeyse eşit bir şekilde dağılmış bir ağ sağlayacaktır.


1
Tüylü top teorisini hiç duymamıştım, oldukça ilginç. Kendimi çocukça şaka yapmaktan alıkoymak zorundayım. Daha önce bu şekilde kürelere puan dağıttım, ancak sorun çokgenleştirmenin bir politopu alt bölümlere ayırmaktan çok daha yavaş olmasıdır. Ayrıca, hücrelerin şekilleri ve değerliliği benim beğenmem için çok düzgün olmayacaktır. Yinede teşekkürler.
DaleyPaley
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.