Voksel arazi motorları nasıl yapılır?


53

Birkaç gün önce voksel arazileri denilen bir şey buldum ve oldukça havalı olduklarını düşünüyorum. Ama onları üreten hiçbir şey bilmiyorum. Modelleme yazılımınızda modelliyor musunuz ya da bir yükseklik haritası gibi bir şey kullanıyor musunuz? Vikipedilerin 3d piksel veya volumetrik piksel gibi olduğunu wikipedia'da okudum .

Voksel arazisini yaptıktan sonra, bu vokselleri nasıl alıp yok edebilir / kazılabilir hale getirebilirim ?


Aşağıdakilere göre en iyi cevabı seçeceğim:

  1. kod ve algoritmalar. tercihen C # merkezli
  2. Açıklamalar. Algoritmalara yeni başlıyorum ama nesne yönelimli programlamaya aşinayım
  3. adım gösteriler adım. Sadece konsept değil, yönlendirme.
  4. diyagramlar / çizimler. Hayır, diğer motorların ekran görüntülerini değil.


Bunun karmaşık bir konu olduğunu biliyorum. Ancak, herhangi bir yardım için teşekkürler!

Hayır, minecraft klonu yapmaya çalışmıyorum.


Düzenle

Yardımlarınız için herkese teşekkürler (özellikle Nick Wiggill)! Bu ben (devam eden Çalışma) yapmayı başardı budur.


[birlik] ve C ? Bu ... çok az anlam ifade ediyor.
Martin Sojka,

Anlıyorum C.
Daniel Pendergast

8
Bu kadar cesur bir istekle topluluğa çok fazla inanıyorsun. Demek istediğim, iyi FPS ile günümüzün donanımı için tam dinamik bir voksel arazisi üzerinde tam bir kağıt, kolay olmalı, değil mi? Konu çok geniş ve zor, genel bir çözüm göreceğinizi sanmıyorum ve o zaman bile durumunuz için tamamen yararsız olabilir. Fakat kim bilir, rol modelinize bağlı olarak yapılabilir. Bir Crysis 2 voksel arazisi mi yoksa Delta Force bir mi istiyorsunuz? Belki bir Minecraft klonu yapıyorsunuzdur veya bir kazma oyunu için sadece bir kum simülasyonuna ihtiyacınız var? Bir kapsam tanımlayın lütfen.
EnoughTea

2
Bu katmana göz atın: forum.unity3d.com/threads/… . Özellikle demo
Tetrad

1
GPU Gems 3'ün voksel alanı ile ilgili bir bölümü var: http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

Yanıtlar:


58

Bir voksel arazisi oluşturmak için

(a) Yaygın bir yöntem, Perlin gürültüsünü kullanarak bir yükseklik haritası oluşturmaktır. Bir yükseklik haritası temel olarak piksellerinin karanlığı veya açıklığı ile farklı yükseklikleri temsil eden tek renkli bir görüntüdür.

görüntü tanımını buraya girin

Heightmap görüntüsündeki o pikselin parlaklığına göre, farklı (x, y) konumlarda farklı yüksekliklere (z ekseni) kadar voksellerin "yığınlarını" oluşturmak için bu yükseklik haritasındaki ayrı piksellere bakacaksınız. Bir Perlin paraziti görüntüsü yumuşak olduğu için (karanlığa karşı keskin ışık kenarları yoktur), bunun sonucunda sorunsuz yuvarlanan araziniz olur.

(b) Farklı polyhedralardan manzarayı oluşturarak aşamalı olarak inşa edebilirsiniz. İstediğiniz voksel şekline yaklaşan çokyüzlü bir vektör şekli oluşturun. Herhangi bir 3B-nokta-polihedron yöntemi kullanarak (en sık, dışbükey-gövde-gövde), dünya şebekenizin hangi noktalarının o katedral hacmine girdiğini kontrol edin. Örneğin, uzayda bir piramit tanımlayın. Dünyanızın yerel bölgesindeki her noktayı o piramidal hacme göre kontrol ettikten sonra, hangi noktaların içine düştüğünü anlayacaksınız ve bu hücreleri “boşluk” yerine voksel oldukları anlamına gelen “mevcut” olarak ayarlayabilirsiniz. Artık kendi alanınızda bir voksel piramidi var. Herhangi bir çeşit şekil eklemeye devam edersiniz, bu şekilde bir arazi oluşturabilirsiniz.

(c) (Gerçekten b ile aynı ) Bir modelleme aracı yazın. Voxatron bunun nasıl görüneceğini gösterir. Bu, sadece yedek bir dünyada (editör) voksel formları oluşturmak ve sonra bunları gerçek çalışma zamanı oyun dünyanıza aktarmaktır. Voxlap'ın vokseller için ilk açık kaynak editörü olduğuna inanıyorum . Tek tek vokselleri yerleştirebilir veya vokselleri dünyanıza çekmek için farklı şekillerde / hacimlerde voksel "fırça" kullanabilirsiniz.


Kendi voksel tabanlı oyununuzu inşa etmek için neye ihtiyacınız olacak?

Bu bölümü ekliyorum çünkü voksel yolu kolay değil, en azından şu anda yok. Son zamanlarda, büyük oyuncular tarafından voksel motorlarına bir kez daha renderleme ve fizik uygulamalarına yönelik birçok araştırma yapıldı.

Sadelik bir sorun olabilir, çünkü bir dünyayı ham voksellerden dinamik olarak inşa etmek dünya inşaatı için prosedürel bir yaklaşımdır ve bu doğal olarak basit değildir . Maalesef, burada birkaç teknik terim olacak. Bir voksel motoru yazmak oldukça ciddi bir girişimdir ve özellikle uzaysal kavramlar açısından oyun motorunun geliştirilmesinin birçok alanında bilgi gerektirir ve bu, 3B vektör matematiğini, matrisleri ve temel hesaplamaları makul bir seviyede anlamak anlamına gelir.

Voksel motorları tam olarak yaygın olmadığından, "voksel arazisi nesliniz" in çalışacağınız bir bağlam gerektirdiğini söyledi. Bir voksel motorunun nasıl çalıştığının temel bir açıklamasına geçelim.

Vokseller, dünyanızın temel yapı taşlarıdır. Konumları, sürekli kayan nokta boşluklarından ziyade tam sayı indeksli bir 3B ızgara (dizi) ile tanımlanır (vektör tabanlı 3B oyunlarda kullanıldığı gibi). Bunlar, dünyanızın "atomları" olacak. Minecraft gibi oyunlarda olduğu gibi 3 fit yüksek olabilirler ya da sanal karakterinizin gözünün, görece olarak, çok sayıda kümeleşmedikçe - biraz daha fazla molekül gibi - kümelenmediklerinden daha küçük olabilirler. İki çeşit var:

  • Kübik kafes tabanlı vokseller ( örnek ) - bunlar basitlik için kullanılan ve modern grafik teknolojisi ile birlikte kolayca kullanılabilen daha yeni bir tür. MineCrat ve Dungeon Keeper gibi oyunlarda kullanılır.
  • Nokta vokselleri ( örnek , örnek ) - orijinal voksel. Her biri, küresel bir sınırlama hacmi ile çevrilebilse de, uzayda ayrı, çarpışabilen bir noktadır. Onlar daha basittir, bu nedenle dünyanızda onlardan daha fazlasına sahip olabilirsiniz ve böylece onları daha küçük hale getirebilirsiniz, bu da genellikle elverişlidir. Bunları kullanan iki oyun Comanche ve 1990'ların Midnight Lords versiyonunu yeniden yarattı.

Her iki durumda da, dünyanızdaki vokselleri manipüle etme yaklaşımınız aşağıdaki gibidir.

Dünyanızdaki nesneleri inşa etmek ve taşımak için yukarıda belirtilen matematiksel araçlara ihtiyacınız olacaktır. Örneğin, bir duvar oluşturmak için: Vektörleri kullanarak 3B alanda uygun boyutlarda bir kutu oluşturun. Kutunuzu 3B dünyanızda (sürekli vektör uzayda) istediğiniz dönüşe ve konuma dönüştürmek için matris matematiğini kullanın. Bir voksel motoru için, ilave adım şimdi, voksellerinizden hangisinin o dönen boşluğun içine düştüğünü belirlemek için 3 boyutlu bir polihedron noktası algoritması kullanmaktır.

Temel olarak, bu, dünyanızdaki çoğu nesneyi inşa etme yönteminizdir. Bunun ötesinde, kendi araçlarınızı, “Maya” veya “3DS Max” gibi bir karakteri "modellemek" için yazabilirsiniz. Ancak sizi noktalar, kenarlar ve yüzler yerine voksellerden karakterize ettiğiniz için yöntemleriniz büyük ölçüde farklı olacaktır. Bu nesneleri dünyanızda döndürmeye karar verirseniz, bunu yapmak için benzer şekilde matris dönüşümleri kullanmanız gerekir.

Yıkılabilir arazi, seçtiğiniz bir yönteme göre bir seferde bir vokselin çıkarılması veya önceden tanımlanmış bir hacme göre bunları kaldırmak için büyük hacimli voksellerin üzerinde CSG (Yapısal Katı Geometri) işlemlerinin kullanılması kadar basittir; örneğin, bir lazer ışını bir kayadan vurulursa, vokselleri burada çıkarmak için silindirik bir hacim kullanabilirsiniz, ışın kayaya ateş eder. CSG, voksel dünyanızı oluşturan 3B uzaysal ızgaraları kullanan ve bir taban ızgarasının bir bölümündeki her hücreyi (bu durumda kaya) başka bir ızgaraya (bu durumda, lazer ışını) karşı kontrol eden nispeten basit bir işlemdir.

Malzemenin "akması" için (Vigil'in kum üzerine yaptığı yorumda belirtildiği gibi), akışkan dinamikleri ve hücresel otomatlara bakmanız gerekir. Bunlar Dwarf Fortress'in yazarı Tarn Adams tarafından esasen voksel dünyasında da kullanılıyordu (vokseller bu durumda çok daha büyük olsa da, Dungeon Keeper ile karşılaştırılabilir, ilke aynı kalır). Bunlar son teknoloji konulardır ve tanımlandığı gibi voksel motorları için bir gereklilik değildir, bu yüzden bunu kendi araştırmanız için bir "saplama" olarak bırakacağım.

CSG ve akışkan dinamikleri beni en sonunda optimizasyona getiriyor. Şu anda geliştirilmekte olan Voxel motorları, neredeyse yalnızca , yaklaşmakta olan Atomontage motorunu gösteren bu videoda gösterildiği gibi, farklı çözünürlüklere voksel alanını alt bölme yöntemi olan seyrek voksel octrees (SVO'lar) kullanıyor. Octrees / SVO'ların kullanılması, büyük, tek tip bir şebekenin işlenmesinde yer alan işlem masrafları nedeniyle bir optimizasyon seçiminden daha fazla bir zorunluluktur. Bir octree, esasen, temsil ettiği boşluğun herhangi bir fiziksel hacim içerip içermediğine bağlı olarak, her düğümün 8 veya sıfır alt düğüme sahip olduğu bir ağaçtır (yönlendirilmiş asiklik grafik). Oktree'lerin voksel oluşturmak için nasıl boşluk bıraktığını gösteren diyagramlar burada .

Tanıdığım en iyi açık kaynaklı voksel uygulaması, Voxelstein3D için kullanılan Ken Silverman'ın Voxlap Motoru . C ++ dilinde yazılmıştır ve arazi deformasyonu için CSG işlemlerini uygular.


Topluluk wiki değişikliği kalıcıdır, tersine çevirmenin yolu yoktur. Cevabınızı silmeniz ve yeniden yaratmanız gerekir (elbette mevcut oylarınızı feda ederek)
Jesse Dorsey

meta.stackexchange.com/questions/2974/… moderatörlerin bunu kaldırabileceğini iddia ediyor. Yine de işler değişti mi bilmiyorum. Her iki şekilde de baktığın için teşekkürler.
Mühendis

1
Git hadi, bir dahaki sefere dikkatli ol.
Jesse Dorsey

2
Birincisi, varlıkların yalnızca doğrudan hücreye yatabilen ayrıklaştırılmış bir alandır. Bir satranç tahtasına mükemmel yerleştirilmiş parçalar gibi, hücreler arasında "sınırları" ya da üst üste binenleri üst üste koyamazlar. Oysa sürekli bir uzay, çoğu fizik motorunda olduğu gibi, yani kayan nokta sayılarına dayanır ve dolayısıyla ölçülmek yerine süreklidir. Varlığınız, seçtiğiniz alandaki herhangi bir pozisyonda - tıpkı gerçek hayatta olduğu gibi - oturabilir.
Mühendis

1
Tekstüre işlemi örtülüdür. Ağ tabanlı olsun olmasın, gerçek voksellerin her birinin saf rengi vardır. Yukarıda bahsedilen yaklaşımlar sadece daha gerçekçi detaylar yaratır ve birleşik ağ yaklaşımını etkinleştirir (google Unity VoxelForm). Vokselleriniz ne kadar ince olursa, elde edilen doku detayınız o kadar ince olur. Örnek: nehir yatağını kaya gibi modelleyin (gri). Bu vokselleri malzeme = "kum" olacak şekilde ayarlayarak, yüzeyin x mesafesindeki her pikseli kuma dönüştürün; daha sonra kum renkli hale getirilebilirler. Ek olarak, bu aynı zamanda fiziksel etkileşimlerini de etkileyebilir, böylece kum su ile hareket ettirilebilir veya kazılabilir.
Mühendis

33

İlginç voksel arazisi oluşturmanın en iyi yolu Perlin gürültü yoğunluğu haritasıdır. 3B dünyanın yüksekliğini tanımlayan 2B Perlin gürültü haritası kullanmak yerine, 3B Perlin gürültü haritası kullanın. Haritayı, tabana yakın değerlerin daha katı olması ve tabana yakın değerlerin kesinlikle hava olması için ağırlıklandırın. Bu, dünyanızın yüksekliğini verir, ancak bir dilim arazinin bu yandan görünüşünün gösterdiği gibi Minecraft arazisine benzer çıkıntılar ve mağaralar için izin verir :

Çıkıntılı dünya

Buradan, yüzen adaları test edebilir veya fraktal gürültüyü kullanarak mağara sistemleri ekleyebilirsiniz:

Mağara sistemi olan dünya

Yukarıdaki resimler ve mağara sistemi fikirleri bu mükemmel blog yazısıdır . Perlin gürültüsü hakkında her şeyi burada öğrenebilirsin , ve buradan başlaman için bazı örnek kodlar var .


4

Buradaki diğer cevaplar mükemmel, ama biraz farklı bir yaklaşım benimsedim.

Bir modelleme aracında (3DSMAX) bir ortam yaratıyorum ve ondan seyrek bir oktree yapıyorum. Her kübik, boş olmayan yaprak düğümü bir vokseldir. Oluşturma zamanında, hangi vokselin hangi pikseli kapladığını bulmak için yeniden yayınlamayı (HLSL'de uygulanır) kullanıyorum ve pikseli, kaynak modelden doku değerlerini ortalama alarak ağacı oluştururken hesapladığım düğümde depolanan renge ayarlıyorum.

Bu size birçok güzel avantaj sağlar - ücretsiz, değişken LOD için çarpışma algılama, alan ayırmayı görüntüleme vb. - ve raycaster dışında - uygulaması kolaydır.

Ne yazık ki, bir telefondan örnek kod göndermek neredeyse imkansız.


Alternatif için +1. Makul bir performansla uygulanması imkansız olmasa da, artılar eksiler tarafından ağır basar Voksel ışın çekme GPU'ya çok büyük bir boşaltma uygular. Bunun için gerekli olan aritmetik ve şartlamalar, aynı GPU döngülerinin bir dizi etkileyici ekran-alanı efekti uygulayabildiği zaman çok maliyetlidir. SSAO. En büyük sorun, radyoaktiflik, radyolojide bulunan çoklu zıplamalar ile en iyi şekilde görünmesidir - milyonlarca veya milyarlarca vokselden oluşan ve her ışını kesiminin sıçrama ve birleşme için büyük çaba harcadığı sahne için uygun değildir.
Mühendis

... işte bu yüzden, sadece cevabımın bir kenara atılmasıyla (VoxLap) skalin salınımından bahsetmiştim - hatta uygulanması zor. Dikey bir tarama çizgisi yaklaşımı çalıştırabilirseniz, görüntü işleme işleminin boyutsallığını 3D'den 2D'ye düşürdüğünüz için, maliyet piksel başına ışın taramasından daha az bir büyüklüktür. Bu yaklaşım hala yanındayım, ancak geleneksel RTRT'nizde mümkün olan karmaşık aydınlatma çözümlerini engelliyor.
Mühendis
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.