Küresel bir gezegen ve bölgeleri nasıl yüklenir?


15

Kısmen gezegen keşiflerinden oluşan bir oyun tasarlıyorum. Ben onlar için çok ağır olurdu her detay saklamak yerine onları yüklemek zorundayken tanımlanmış bir tohumdan rejenerasyon, onlar için sahte rastgele nesil kullanmak istiyorum. Bu yüzden sadece bir dosyada rastgele tohum ve varsa oyuncu tarafından yapılan değişiklikleri saklayacağım.

Oyuncu, gezegeni yörüngeden görebilmeli (çok düşük ayrıntılarla, sonra yere inmeli, iniş yaptığı bölgenin ayrıntı düzeyini yavaşça artırabilir ve diğer tarafları boşaltacaktır. Oyuncunun görüş alanının dışına çıkan gezegenin

Düz bir zeminde yapmak zorunda kalsaydım, kare bir yığın sistemiyle kolayca yaparım. Ancak buradaki sorun, gezegenlerin - neredeyse - küreler olmasıdır.

Peki, zemin ayrıntılarını (kabartma ve topraklanmış nesneler) kesin bir noktaya yüklemenin en iyi yolu ne olurdu?
Zaten iki çözüm üzerinde de var, ancak her ikisinin de zayıf bir noktası var:

1. Kürenin kare parçalar halinde kesilmesi.

kare parçalar yöntemi

Oyuncu yere yeterince yaklaştığında, en yakın karelerin ayrıntılarını kendi pozisyonundan iyileştirmem gerekiyor.
Yeterli değilse, oyuncular yerdeyken veya yere çok yakın olduğunda yüklemek için her kareyi alt karelerde kesebilirim.

Ancak resimde gördüğünüz gibi, oyuncu bir direğe inmeye çalıştığında bir sorun var: kareler çok ince dikdörtgenler, hatta son çizgi için üçgenler ve ek olarak yüklenecek çok sayıda olmaları gerçeği, jenerasyon bozuk görünecektir.

2. Bir ikosahedrondan başlayarak.

ikosahedron yöntemi

Burada, oyuncunun yaklaştığı sırada üçgen şeklindeki mozaiklemeyi arttırabilirim.

Ama üçgenleri oyuncunun pozisyonundan daha yakın nasıl bulacağımı bilmiyorum. Bu durumda Kartezyen koordinatların yararlı olabileceğini duydum , ama onları nasıl kullanacağımı bilmiyorum.


Ben bunun için C ++ / OpenGL kullanıyorum, bu yüzden burada üretmek ve yüklemek için ana şey yüzey kabartma ve renk / doku temsil köşe.


Yazmaya başlamadan önce, dünyanız bir küre mi? Her ızgaranın bir dosyaya kaydedilmiş özelliklere sahip olduğu bir küreye ızgara yerleştirmeye mi çalışıyorsunuz?
Alec Teal

@AlecTeal Bir gezegeni simüle etmeye çalışıyorum. Yani küresel bir küre. Ve asıl sorun, oyuncunun herhangi bir noktaya, bir direğe veya ekvator boyunca topraklamaya çalışabilmesidir.
Aracthor

2
Yani .... sormak lazım "küresel dünya oyun motoru" için arama yaptı mı orada bir sürü uygulama var gibi. Neden çalışmıyorlar? Ayrıca bu yüzden küp haritalarımız var, bu nedenle bir küreye homeomorfik herhangi bir topolojik manifoldda standart grafikler bunlar!
Alec Teal

1
Ayrıca dört küre seçeneği değerlendirmek için önermek
dnk drone.vs.drones

maths.kisogo.com/index.php?title=Notes:Spherical_coordinates ön taslağı. Resimlere ihtiyacı var ve bitirmek için.
Alec Teal

Yanıtlar:


5

Tamam, ben buraya yazdım:

http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates

(Matematik işaretine ihtiyacım vardı ve ayrıca oldukça uzun)


Belgeyi uygulama

Belge, bir manifold kavramını tanıtarak başlar, bir manifold, parçalarının "homeomorfik" olduğu (temelde: aynı) R ^ n parçaları (R ^ 2, x / y düzlemidir) biliyorum)

Bir grafik, bir manifoldun bazılarını (muhtemelen hepsi, bir küre durumunda hepsini kaplayamaz) kapsar.

Makalede, açıları koruyan küre için 4 grafik geliştiriyorum, yani düzenli mesafeyi koruyorlar.

Bir küredeki noktalara koordinatlar vermek aslında oldukça zor! Bunun yerine (örnekteki bir dairede olmasına rağmen) her noktaya, i'nin bir küre için 1 ile 6, bir daire için 1 ve 4 arasında bir sayı olduğu (i, x, y) formunun bir koordinatını vermektir. Bu grafik numarası.

X ve y, bu grafikteki açıları ifade eder (veya daire ise sadece x).

Bir kürenin 6 şeması, üst / alt yarım küreler, sol / sağ ve ön / arka yarıkürelerdir.


Koordinatlar

Artık her noktaya iyi davranmış bir "hoş" koordinat verebilirsiniz. Matematiksel terimlerle, çizelgelerin alanları "açık" haritalardır, bu, her bir noktanın etrafındaki topun sette de olacağı şekilde bazı pozitif sayılar olduğu anlamına gelir. Örneğin (0,1) aralığı (0 <x <1 ise x içeren küme açık), (0,1) (örneğin 0,001) içindeki herhangi bir p'yi alın, sonra bir sayı (örneğin 0.0005) vardır. 0.001'in 0.0005'i içindeki herhangi bir noktanın da (0,1) olduğu.

Bunun anlamı, tarifleri çizelgelerden geçirebilmenizdir.

Şimdi geliştirdiğimiz çizelgelerde 45 derece çakışma var. Bu araçlar koordinatları (i, x, y) güvenle formunun noktaları belirtebilir bir özelliği vardır, (i, x + a, y + b) fazla olarak ave b(derece cinsinden) -45 ve +45 arasındadır

Formun herhangi bir noktası (i, x + a, y + b), "normal" 3 boyutlu uzayda sorunsuz bir noktaya kolayca dönüştürülebilir.


uygulama

Artık bir şey için koordinatları bir kürede saklamanın ve bu koordinatlarla geniş alan alanlarını bölgeleri belirtmenin bir yolu var, bunlar da koordinatlar gibi davranıyorlar, örneğin açıklar (bunun yerine 2 açı kullanırsanız bir sorun var)

Ayrıca, "düzenli bir küre nasıl oluşturulur" cevaplarını şimdi tamamen atabilirsiniz çünkü tek yapmanız gereken 6 uçak yapmak ve kenarlarının hizalandığından (önemsiz olduğundan) ve sonuç:

Kullanımı kolay koordinatlarla güzel bir küreye sahip olacaksınız

Herhangi bir sorunuz lütfen yorum, az ön bilgi almaya çalıştım. Ben de insanlara öğretmek için yeniyim


@Alec_Teal Siz yayınladığınızdan beri cevabınızdayım, karmaşık ve anlaşılması zor (çok fazla matematik formülü kullanmıyorum) ama bence anlamam gerekiyor ... Metodunuz küp tabanlı küre yukarıda açıklandığı gibi? "Grafiklerinizin" kare projeksiyonlar mı yoksa daha fazlası mı olduğunu
anlamadım

@Aracthor daha genel. Bir grafik, kelimenin tam anlamıyla bir kitaptaki (haritaların) bir grafiğidir, tek yaptığı bir alana bir ızgara uygulamaktır. Diyelim ki örneğin bir torus veya 2 delikli torus var, bu yöntemlere ihtiyacınız olacak. Buradaki cevapların hiçbiri, farklı bir görev olan geometriyi oluşturmanın düzenli yolları kadar bir küre üzerindeki koordinatlarla ilgilenmiyor. Formüllere yardımcı olabilirim, mümkün olduğunca erişilebilir yazmaya çalıştım, ama bu benim ekmek ve tereyağım, bu yüzden karmaşıklığı görmüyorum.
Alec Teal

@Alec_Teal Doğruladım, ama yine de her şeye sahip olduğumu düşünmüyorum. Ancak bu tartışmaya bir sohbet odasında devam edelim .
Aracthor

13

Daha önce de belirttiğiniz gibi, bu soruna bir dizi çözüm var, ancak hiçbiri% 100 ideal değil. Küreler zor.

Küp tabanlı

Spore ve büyük olasılıkla diğer oyunlar tarafından kullanılan ortak bir rota (kaputun altına bakmaksızın kesin olarak söylemek zor olsa da), küreyi bir küp üzerine yansıtmak ve her küp yüzünde kare bir ızgara kullanmaktır.

(Alec Teal ve dnk drone.vs.drones yukarıdaki açıklamalarda açıklandığı gibidir)

Küre bir küp temel alınarak alt bölümlere ayrılmıştır

( LoD için kübik bir temsili kullanmayı açıklayan bu yazıdaki resim )

Bu, enlem-boylam yönteminin çok daha az tepe distorsiyonu ile birçok avantajına sahiptir. Bir vektörü normalleştirerek veya mutlak değerdeki en büyük bileşenine bölerek, yüz ızgarasındaki konumlar ve küredeki konumlar arasında ileri geri dönüş yapmak kolaydır. Ayrıca , tüm gezegeni uzaktan görüntülerken faydalı olabilecek küp haritalama dokulama teknikleri ile iyi uyum sağlar .

Tipik haritalama yaklaşımı gnomonik projeksiyon olarak adlandırılır ve yukarıdaki resimde gördüğünüz gibi yine de bir yoğunluk uyuşmazlığı sorunu vardır. Izgara, küp köşelerinin yakınında, yüzlerin merkezlerinden çok daha yoğundur. Tekdüzelik önemliyse, bunu doğru eşleme formülleriyle azaltabilirsiniz, ancak bu genellikle eşleştirmeyi tersine çevirmeyi zorlaştırır.

Eşitliği artırmak için haritalama işlevini değiştirme

Her durumda, köşelerde, 90 derecelik açılarla dört karenin sıradan bir ızgara kesişiminin 120 derecelik açılara sahip 3 eşik toplamı buluşması haline geldiği köşelerde hala açısal bir bozulmaya sahip olacaksınız.

İkosahedron tabanlı

Benim en sevdiğim yaklaşım, tarif ettiğiniz ikosahedral versiyon olurdu, çünkü tepe açısal bozulmayı olabildiğince küçük hale getirir. Üçgen ızgaranın normalde 60 derecelik açılarla toplanan altı üçgeni olacağı yerde, ikosahedron köşelerinde 72 derecelik açılarla toplanan 5 üçgen bulunur. Yani her bir küp örneğindeki karelerden daha az bozulma gösterir.

Küp versiyonunun kareleri kadar tanıdık bir bölge değil, muhtemelen bu yüzden popüler değil. Üzerinde çalışmak biraz daha matematik gerektirir.

Yakındaki noktaları belirlemek, göründüğü kadar zor değildir. Herhangi bir icosahedron bazlı jeodezik küre düzenli bir üçgen ızgaraya düzleştirilebilir:

Jeodezik mozaiklerin düzenli bir üçgen ızgara üzerine düzleştirilmesi Üçgen ızgara üzerinde bir ikosahedron ağı

Ve düzenli bir üçgen ızgara, burada tartışıldığı gibi kare bir ızgara gibi ele alınabilir .

Üçgen kare ızgara izomorfizması

Yani bir kez ikosahedronun hangi yüzünde olduğunuzu belirlediğinizde (bir ikosahedral ağa karşı bir raycast ile yapılabilir - bu kısmı basitleştirmek için akıllı bir matematiksel yol bilmiyorum), çevre tanıdık kullanarak doldurulabilir ızgara geçişi. :)

Düzenle:

Sınıf I jeodezik kullanıyorsanız, küp tabanlı bir sürümü saklamak için kullanacağınız altı kare grafiğe benzer şekilde, seviye parçalarını / dokularını / yükseklik haritalarını verimli bir şekilde saklamak için gezegenlerinizi beş dikdörtgen grafiğe açabilirsiniz:

Bir geosferin dikdörtgen grafiklere açılması

(Bu, başka bir cevapta Bulanık Mantık tarafından dile getirilen kaygıyı gidermeye yardımcı olabilir. Bu da mümkündür, ancak Sınıf II jeodezikler için biraz daha karmaşıktır. Sınıf III'ü araştırmadım)

İşin püf noktası, bu grafiklerin eksenlerinin kullanımda gerçekten dikey olmamasıdır, bu nedenle mevcut yazma ve akış araçları / teknolojisi onu kutudan çıkarmaz. Yine de kendi yığın akışınızı yazmayı veya anında işlemsel nesli kullanmayı planlıyorsanız, bu bir sorun olmayabilir. Ayrıca, kaynak haritalarınızı daha geleneksel araçlar kullanarak gerekenden daha yüksek çözünürlükte oluşturarak, daha sonra doğrudan takılan yoğun ve verimli bir gösterim oluşturmak için grafik ızgarası boyunca örneklenen bir pişirme işlemiyle çalıştırarak yazma sorunu üzerinde çalışabilirsiniz. ikosahedral yapıya.


1
Burada iyi şeyler var. + 1'ledim ama daha sonra bir cevap yazmayı planlıyorum (ben de cevap verdiğimde oylamanın erken aşamalarından uzak durmaya çalışıyorum). Benim tek yorumum, bu yaklaşımın küreleri oluşturmak için yüzeyi modellemekten daha iyi olması
Alec Teal

Sadece merak edersen, şimdi cevabımı bitirdim.
Alec Teal

4

Yığılmış LOD'lu dört küre, prosedür veya önceden tanımlanmış yükseklik haritalama ve dokular gibi herhangi bir ayrıntılı arazi seviyesiyle uzaydan yere gitmek istiyorsanız tercih edilen yöntemdir.

Icosasphere daha düzgün bir ağ sağlar ve döşenmesi kolaydır, ancak önbelleğe almanız gereken dokuları ve yükseklik haritalarını eşlemeye çalışırken sorunlara yol açar ve bu şekilde çok kompakt veya basit olmayacaktır.

Dört kürenin kıstırma noktaları vardır, ancak yeterli mozaikleme ile onları hiçbir şekilde göremezsiniz. Daha sonra dokuları eşleyebilir ve DLOD'u her bölge (yığın) çok az sorunlu bir kare ızgara gibi etkili bir şekilde uygulayabilirsiniz. Bu, bir icosasphere ile karşılaştırıldığında uygulanması daha basittir ve hem hesaplama hem de kaynaklarda daha verimli olacaktır.

Sean O'Neil'in Gamasutra'da prosedürel bir evren üretme hakkındaki makalelerine bakın:
- Yükseklik haritaları ve dokular için Bölüm 1 Perlin Gürültüsü ve Fraktal Brownian Hareketi.
- Bölüm 2 Gezegen üretimi için DLOD ile prosedürel mesh için ROAM Algoritması. Performans sorunlarından muzdarip. Tavsiye edilmez ama eğitim değeri için iyi.
- Bölüm 3 Büyük ölçek, optimizasyon ve kayan nokta sorunlarıyla ilgili sorunları giderir. Temel olarak evren ölçeği ile ilgilidir, ancak isterseniz ışık yılı ölçeklerinden santimetreye geçiş yaparken gezegenler için de geçerlidir.
- Bölüm 4 Gezegen üretimi için parçalanmış (dört ağaç) DLOD ile Quad-küre uygulamasını tartışıyor <- özellikle bu makaleye bakın


0

Programlama konusunda uzman değilim, ancak bir tür kontrol noktanız olabilir. Bir güvenlik kontrol noktasından temizlenirken, elbette animasyonla, gezegenin yüzeyi yüklenebilir ve bunun tersi de geçerlidir.


Bu, keşfedilebilir gezegen yüzeyini bir küre olarak tasarlamama seçeneğini açarak sorunu ortadan kaldırır, ancak çözmez.
Philipp
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.