Dünya boyutunda bir minecraft'ı harita gibi oluşturmak için ne tür bir donanım gerekir?


10

Bu sorunu düşünüyorum. Mevcut teknoloji ile voksel tabanlı oyunda dünyanın 1: 1 kopyasını oluşturmak mümkün müdür? Bu dev haritayı saklamak için en iyi veri yapısı nedir? Bu veri yapısını gerçek zamanlı olarak oluşturmak için hangi algoritma kullanılmalıdır?

Bu sorular şu varsayımları yapar:

  • Her voksel 1 metreküp çözünürlüğe sahiptir.

  • Kolaylık olması açısından, her voksel yalnızca 1 bayt meta veri bilgisi gerektirir. Bu bilgi vokselin (toprak, su, kaya vb.) “Tipini” tanımlamak için kullanılacaktır.

  • Toprak hacmi 1 * 10ˆ21 metreküptür.

  • "Mevcut teknoloji" ile ticari olarak elde edilebilen, ancak süper bilgisayarlar olmayan her şeyi dahil ediyorum.

  • Haritayı oluşturmak için yalnızca Dünya topografyası ve batimetrisi kullanılacaktır. İnsan binası, bitkiler veya mağaralar hariçtir. Yeraltı blokları jeolojik çalışmalara dayalı olarak seçilecektir, örneğin: derinlik 3000 km'den büyükse bir 'magma' voksel yapın.

  • Tıpkı Minecraft'ta olduğu gibi, harita statik değildir, oyun içinde değiştirilebilir.

  • 'Sonsuz' çekim mesafesi büyük bir artıdır, eğer tüm gezegeni izleyemiyorsanız ve tüm gezegeni izleyemiyorsanız, tüm dünyayı bir haritaya almanın anlamı nedir?

Bu sorunu düşündüğümde aldığım ilk sonuç, her vokselin sadece 1 bayt bellek kapladığını varsayarak, haritayı saklamak için hala 1 zettabayt gerektireceği varsayılarak, Dünya verilerini doğrusal bir şekilde saklamanın mümkün olmadığıdır. Bu nedenle bir tür sıkıştırma gereklidir.

Ben bir voksel octree haritayı sıkıştırabilir, ama ne kadar emin değilim. Bu voksel haritasının entropisi muhtemelen çok düşüktür, bu yüzden sanırım çok yüksek bir sıkıştırma seviyesi elde edilebilir.

feragat

Bu teorik bir soru, voksel bir dünya yazmak gibi bir niyetim yok

DÜZENLE

ESA GOCE zaten Dünya jeoidini 1 cm-2 cm hassasiyetle eşleştirdi. Bu bilgilerin Dünya'nın çok hassas bir yükseklik haritasını oluşturmak için kullanılabileceğine inanıyorum. Bu, Dünya topoğrafyasındaki boşlukları doldurmak için bir algoritma kullanma ihtiyacını ortadan kaldıracaktır.


1
Minecraft'taki dünyaların değerinden dolayı dünyadan daha büyüktür, gerçekten almaya çalıştığınız şey, dünyanın çok çözünürlüklü bir voksel haritasıdır, böylece içinde bulunan sınırlı görüntüleme aralığı yerine hepsini bir kerede görebilirsiniz bu oyun. Bu gerçekten bir ayrıntı düzeyine iner .. Bireysel vokselleri ne zaman gösterirsiniz veya tüm bu vokseller ne zaman bir yığın içinde ortalanır ve düşük çözünürlüklü haritada tek bir nokta olarak işlenir. Ayrıntı seviyeleri, vb. Arasında nasıl hızlı bir şekilde ölçeklendirirsiniz?
James

@James, Minecraft'ın yordamsal olarak oluşturulduğunu unutursunuz, yani bir alanı gerçekten ziyaret edene kadar bellek / veri depolaması gerekmez. Dünyamızı istiyor, yani tüm gezegen için metreküp boyutuna kadar verilere ihtiyacınız olacak.
William Mariager

1
"Bu yine de haritayı saklamak için 1 zettabayt gerektirir. Bu nedenle bir tür sıkıştırma gereklidir." Neden bilmiyorum, ama bu beni güldürdü :) Ayrıca infinity-universe.com/Infinity
Ray Dey

@RayDey Bağlantı için teşekkürler, önizleme videoları etkileyici! infinity-universe.com/Infinity/…
Cesar Canassa

Bağlı olmak. Monitörümde, 1m voksellerle Dünya'nın 1: 1 çoğaltma modeli, bir seferde yalnızca bir vokselin bir kısmını oluşturabilir ...
Peter Taylor

Yanıtlar:


6

Bu, kullandığınız uzamsal altbölüm yöntemine bağlıdır, ancak tüm altbölüm yöntemleri (herhangi bir sıkıştırma yöntemi gibi), veri yapısı ek yükleri ve diğer mantıksal / matematiksel faktörler nedeniyle nihayetinde daha fazla sıkıştırmanın yapılamayacağı yerde kaybolur. Oktrees'te bir örnek bulunabilir. Oktree'deki her bir düğüm için, anlamlı geçişi etkinleştirmek için üst ve / veya alt öğelerine (veri yapısı mimarinize nasıl gittiğinize bağlı olarak) bir işaretçi konulmalıdır. Herhangi bir ağaç yapısı n çocuk içerebilir. 1: n oranı ne kadar düşük olursa, kazanacağınız alan o kadar verimli kullanılır ve sonuç olarak aynı sayıda yaprak vokselini içerecek daha fazla ata düğümünüz olması gerektiğinden (ağaçta kabaca 510 trilyon) daha fazla ata düğümünüz olması gerekir. bunlardan yüzey alanını temsil eder).

Sizin örneğinizde birincil sorunların depolama maliyeti olduğu ve tüm gezegeni (veya bunların parçalarını) adil bir mesafeden oluşturduğu göz önüne alındığında, bir oktree üzerinde önereceğim veri yapısı yoktur. Mipmap oluşturma bir zorunluluktur: 2'ye en yakın yüksek güçte 12,8 milyon metre çap 2 ^ 24 = 16,8 milyon'dur. Geçiş yapmak için 24 oktree seviyesi, GPU'lar ve CPU'lar için çok maliyetli olan çok büyük bir dallanma anlamına gelecektir. Ancak işleri doğru bir şekilde yapmanız koşuluyla, bir seferde sadece birkaç seviye geçmeniz gerekecek. Bununla birlikte, gerekli alan miktarı göz önüne alındığında, alternatifler az ve çok uzaktadır (aşağıya bakınız).

Oktrees'in mipmapleme yetenekleri, onu tarif ettiğiniz gibi büyük hacimler için inanılmaz derecede güçlü bir araç yapan şeydir. Bilinen diğer tüm alt bölüm yöntemlerinden farklı olarak (KD ağaçları hariç), oktree alt bölümleri her seviye için minimum tutar, yani mipmap seviyeleri arasındaki görsel ve fiziksel farklar da minimum düzeyde tutulur, yani yürürken ve ağacın aşağı.

Öte yandan, hiyerarşik ızgara geçişinin minimumda tutulduğu bir dünya oluşturmak istiyorsanız, hızı artırmak için alandan işlem yapmanız gerekecektir.

İdeal 1: n oranından bahsetmişken, bu açıdan kd ağacından daha ince bir yapı yoktur. Oktree'nin her eksen için 2'ye bölünmesi ve 2 ^ 3 = 8 ayrı alt hücre ile sonuçlanması durumunda, kd ağacı her alt bölüm düzeyinde tam olarak bir kez bölünür. Bununla ilgili sorun, bölmek için bir hiper düzlem seçmeniz ve bu hiper düzlemin 3 eksenden herhangi biri etrafında seçilebilmesidir. Uzay açısından en uygun olmasına rağmen, dinamik bir portal tipi yapının kayıt tutulması gerektiğinden, 3D geçişleri (fizik için oktrees kullanırken veya render yaparken temel bir op olan raymarches sırasında olduğu gibi) çok daha zor hale getirir. bireysel kd-ağacı düğümleri arasındaki arayüzler .

RLE, sıkıştırmaya başka bir yaklaşımdır, ancak RLE sıkıştırması bir boyutlu olduğundan ve içinde çalıştığı ekseni seçmeniz gerektiğinden, bu tür bir soruna (işlemlerin tabanının küresel olduğu) uygulamak birçok yönden daha zordur. gezegen, kutup eksenini seçebilir, ancak herhangi bir tek eksenli seçim, belirli optimal olmayan açılardan hareket ederken render ve fizik için traversallerle ilgili belirli sorunları ortaya çıkaracaktır. Elbette, RLE'yi aynı anda 3 eksende, depolama maliyetini üçe katlayabilir veya daha fazla optimizasyon olarak 6 eksende (-x, + x, -y, + y, -z, + z) çalıştırabilirsiniz.

Sorunuzu cevaplamak (ya da değil!)

Doğrudan ne tür bir donanıma cevap vermeyeceğim, ama bence ona bir oktree perspektifinden bakmak, aslında ne tür bir donanımda neyin mümkün olduğuna dair bir fikir vermeye başlıyor . Sizi bu rotadan aşağı indirmeye teşvik ediyorum, eğer gerçekten bilmek istiyorsanız, aslında basit bir seyrek oktree uygulamak en kolay olabilir(referanslardaki Laine'nin makalesine bakın) ve içine küresel bir yüzey voksel kabuğu yerleştirin ve sonuçta alan kullanımının nasıl olduğunu görün. Oradan çıkın. Sistem belleğiniz vermeye başlamadan önce ne kadar uzağa gidebileceğinizi görün. Bu, görselleştirme istemediğiniz sürece bir oluşturucu yazmanızı gerektirmez. Ayrıca bunun en iyi CPU üzerinde yapıldığını unutmayın - GPU'lar büyük ölçüde bu ölçeğin sorunları ile başa çıkmak için bellek kapasitesine sahip değildir. Bu, Intel'in büyük ölçüde paralel işlemcilere doğru ilerlemesinin nedenlerinden biridir: Bu tür bir şeyde daha iyi olan GPGPU'nun faydaları, sistem veri yolu darboğazları olmadan çok daha geniş bir bellek alanına uygulanabilir. Muhtemelen burada veya mathematics.stackexchange.com'da başkaları da vardır,

Sonsuz görüş mesafesi gereksiniminiz açısından, elbette, ama soru her zaman, "hangi mesafeden ne kadar ayrıntıya" gelir. Sonsuz ayrıntıyı oluşturmak sonsuz kaynak gerektirir. Bu, sahne başına değişken mipmaplamanın devreye girdiği yerdir. Ayrıca, tüm veri yapılarının alan için bir miktar hız dengesi içerdiğini ya da tam tersini unutmayın. Aynı miktarda mühendislik çabası için daha büyük bir dünya istiyorsanız, daha az / daha yavaş renderleme anlamına gelir.


4

Bu sorunu düşündüğümde aldığım ilk sonuç, her vokselin sadece 1 bayt bellek kapladığını varsayarak, haritayı saklamak için hala 1 zettabayt gerektireceği varsayılarak, Dünya verilerini doğrusal bir şekilde saklamanın mümkün olmadığıdır. Bu nedenle bir tür sıkıştırma gereklidir.

Büyük olasılıkla gerçek dünyanın her bir metreküpünün özelliklerini asla bulamayacağınız için, varsayımlara dayanarak belirsiz olan bu verileri üretmenin bir yoluna ihtiyacınız olacak. Eğer bunu çözdüyseniz, tüm bu verileri hesaplamanıza ve depolamanıza gerek yoktur, ancak bunu anında oluşturmayı tercih edebilirsiniz.

Her şeyden önce, dünyadaki tüm vokselleri atabilirsiniz, çünkü bunlar sadece birileri gerçekten bir delik kazarsa, örneğin hesaplanmalıdır. vokseller görünür hale gelir.

Yeryüzünün yüzeyi için, muhtemelen hesaplamalarım için bir başlangıç ​​noktası olarak bir görüntü alacağım. Belki bir tür sıcaklık ve nem haritası, uygulanacak blok tiplerini hesaplamanıza izin verir. Örneğin. Su, kum (çöl), çimen, kar vb. Görüntü muhtemelen dünya yüzeyinin her metrekaresi için bir piksel bilgi içermeyeceğinden, biraz varyasyon oluşturmak için bunu biraz gürültü ile karıştırmanız gerekir. yüzey. Her zaman aynı rastgele tohumları kullanırsanız, sonuç yine de deterministik olmalıdır.

Ek olarak, bir yükseklik haritası yararlı olacaktır, böylece yüzey özelliklerinin yüksekliğini belirleyebilirsiniz. Bu şekilde dağlar vb. Ekleyebilirsiniz.

Bu, dünya yüzeyi hakkında bilgi içeren bazı 2D görüntülerin veri hacmine kadar kaynar. İçerideki her şey için, dünya merkezinden uzaklığa bağlı olarak farklı tipte bloklar oluşturduğunuz saf bir prosedür yaklaşımına dönersiniz. Ancak yukarıda belirtildiği gibi, bunlar sadece biri bir delik açtığında hesaplanmalıdır.

Değişiklikleri kalıcı hale getirmek için sadece dünyadaki değişiklikleri kaydederdim . Birisi bir delik kazarsa, hangi voksellerin çıkarıldığı hakkında bilgi depolarım, çünkü çevredeki vokselleri prosedürel olarak oluşturabilmeliyim.

Oluşturmaya gelince: Bu işi yapmak için bazı ayrıntı düzeyi ve kaldırma algoritmalarına ihtiyacınız olacak. Kamera tüm dünyayı gösteren bir zum seviyesinde olduğunda, tüm yüzey voksellerini oluşturmak saçmadır. Bu seviyede, vokseller çok daha büyük olmalı, belki basit bir dokulu küre bile yeterli olacaktır.

Sanırım en zor şey, farklı ayrıntı seviyeleri oluşturmak için kullanabilmeniz için farklı "çözünürlükler" için bile voksel özelliklerini hesaplamanıza izin veren sağlam bir jeneratöre sahip olmak olacaktır.


Sadece değişiklikleri kaydetmeyle ilgili sorun, kısa vadeli bir çözüm olmasıdır. Oyuncular gezegeni değiştirmeye başlarsa, sonunda değiştirilen verilerin gezegen kadar büyük olduğu duruma yol açacaktır.
Cesar Canassa

1
@CesarCanassa Gerçek gezegen verilerinden daha fazla değiştirilmiş veriye sahip olmak gerçekçi bir senaryo değil. Bakın biz insanlar yeryüzünde neyi değiştirdik ... Dünya yüzeyinin sadece küçük bir yüzdesi olduğunu söyleyebilirim. Okyanuslar temel olarak, dünya yüzeyinin daha büyük bölümünü oluşturan dokunulmamış. Oyunu (sürekli) 1 milyon oyuncu ve dünya yüzeyinin m2'si başına 1 voksel (510,072,000km2) hayal edin. Her oyuncu 10 saniyede bir 1 voksel değiştirirse, bu sadece yüzeyi değiştirmek için ~ 160 yıl sürecektir. Ve bu dünyanın içini saymıyor!
bummzack

Vokselleri kitlesel bir şekilde değiştirmenin yolları, örneğin bir adanın patlaması ve batması veya güçlü bir deprem açma çatlakları gibi bir atom bombası. Değiştirilmiş veriler bile Dünya hacminin sadece%
0.0001'i ve

Modifikasyonların Dünya'ya göre küçük olduğu doğrudur, ancak geçtiğimiz yüzyılda yaptığımız modifikasyonlar hala oldukça etkileyici: 1970'lerden ve 1990'ların sonlarından Aral denizi için uydu görüntülerini karşılaştırın. (Bir zamanlar modern 100m çözünürlüklü uydu görüntülerini 1940'lara geri yüklemek için gerekli olan değişikliklere baktım). Ayrıca buz ve kar örtüsünde mevsimsel değişiklikler, buzdağlarını modellemek için bu kadar ileri gitmeseniz bile tonlarca veri gerektirecektir.
Peter Taylor

0

Temel olarak Minecraft ile aynı şeyi yapabilirsiniz. Böyle bir miktarda veri yapmak yerine, bir dünyayı matematiksel formül olarak tanımlayabilirsiniz, görüntülemek için bir veri parçası gerektiğinde, formülü kullanarak oluşturursunuz.

Böyle bir formül genellikle Perlin gürültüsü kavramı kullanılarak inşa edilir , bu her düzeyde ayrıntıya izin verir, gerçek dünyadaki kadar büyük dağ aralıklarına sahip olabilirsiniz, ancak bunların sadece küçük bir bölümünü oluşturmayı seçebilirsiniz. İstediğiniz ayrıntı miktarını oluşturabilirsiniz, bu nedenle yakın şeyler için çok ince ayrıntılar yapmak mümkündür, ancak aynı zamanda gerekli ayrıntı düzeyinde uzak manzaralar da oluşturabilirsiniz.

Minecraft, ziyaret ettiğiniz tüm blokları kaydeder, yapılan değişiklikler ne olursa olsun, sadece üretilen dünya ile güncellenen dünya arasındaki farkı kurtarabilir, ancak büyük blokları kaydetmek daha kolaydı ve nispeten iyi sıkıştırıyorlar.

Bunu gerçekten sınırlayan herhangi bir oyun olduğunu düşünmüyorum, ancak büyük oyun dünyalarının tüm "önemsiz" ayrıntılarının formülsel neslini kullanmak çok yaygın. Sadece partiyi üretmenin ve diske koymanın aksine, ihtiyaç duyulduğunda oluştur yaklaşımının ne kadar yaygın olduğundan emin değilim.


2
Dünyayı 1: 1 tarzda tanımlayan matematiksel bir formülün farkında değilim.
MichaelHouse

"Dünya" değil, benzer bir şey.
aaaaaaaaaaaa

0

Vektör verileri istediğiniz ölçeğe göre ölçeklendirme avantajına sahip olduğundan, Dünya'nın kara kütlelerinin vektör verilerini arayabilirsiniz. Arazinin yüksekliğini oluşturmak için Dünya'nın bir yükseklik haritası ile birleştirin. Son adım, görüntüye göre üst blok türünü seçebileceğiniz bazı ayrıntılı uydu görüntüleri, böylece kaya, kaya bulunan kum, kum vb. Minecraft'ın yaptığı gibi, çalışmak için ayrıntılı coğrafi veriler bulamazsanız. Temel olarak, yalnızca XYZ koordinat girdisi verildiğinde coğrafi verileri bulmak ve bunlardan ekstrapole etmek istersiniz. Bu, sınırlı veriye sahip olduğunuz ve gerisini olabildiğince hassas bir şekilde tahmin ettiğiniz anlamına gelir.

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.