3B perlin gürültü fonksiyonu arazi oluşturmak için nasıl kullanılır?


20

Yükseklik değerini üretmek için 2d perlin gürültü işlevini kullanarak başımı sarabilirim, ancak 3d perlin gürültü işlevinin neden kullanılacağını anlamıyorum. Notch'in blogunda, http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 , Minecraft'ta arazi üretimi için bir 3d perlin gürültü işlevinden bahsetti. Bunun nasıl yapılacağını ve neden yararlı olacağını bilen var mı? X, y ve z değerlerini geçiyorsanız, zaten yüksekliğiniz olduğu anlamına gelmez mi?

Yanıtlar:


19

2D perlin gürültüsü yükseklik haritaları için iyidir, ancak bu durumda yükseklik haritası kullanmıyor gibi görünüyor. Bunun yerine, herhangi bir hücrenin boş olabileceği bir 3D ızgarası var. Bu, zemin yüksekliğinin verilen 2B konum için tek bir değer olmadığı mağaralara ve bu tür oluşumlara izin verir.


14

“Yer yüksekliği” ni örneklemek yerine, gürültü değerini “yoğunluk” olarak değerlendirdim; burada 0'dan düşük olan her şey hava, 0'dan yüksek veya 0'a eşit olan her şey öğütülmüş olacaktı.

Basitçe söylemek gerekirse, bir bloğun olabileceği her yer için bir gürültü fonksiyonu değerlendirilir ve> 0 ise bir blok yerleştirilir. Çentik gürültü fonksiyonu, su seviyesinden değerine yükseklik ekleyerek çarpıktır, bu nedenle daha düşük alanlar çoğunlukla sağlamdır (yükseklik büyük negatiftir, bu nedenle yükseklik + gürültü de negatiftir) ve daha yüksek alanlar çoğunlukla boştur (yükseklik büyük pozitiftir, bu nedenle yükseklik + gürültü de pozitif).

Muhtemelen hangi tür blokların üretileceğine karar vermek ve mağaraları oymak için ek simya vardır . Ama sanırım bu doğrudan gürültü işleviyle ilgili değil.

Ayrıca Minecraft'ın voksel tabanlı bir arazisi olduğundan bu yöntemin Notch için çalıştığını unutmayın. Bunu çokgen tabanlı bir dünyada çekmeye çalışırsanız, basitçe örnekleme gürültü fonksiyonu yeterli olmaz. Örnekleri bir yüzeye dönüştürmek ve bu yüzeye yaklaşan çokgenler oluşturmak için bazı algoritmalar kullanmanız gerekir. Böyle bir algoritma yürüyen küplerdir .


8

Arazinin mağara ağlarına ve çıkıntılarına ihtiyacı varsa 3D gürültü zorunlu hale gelir.

Yoğunluk bilgisinden bir izosurface çıkarmak için en popüler 2 teknik Yürüyen Küpler (MC) ve daha yeni Dual Contouring (DC) 'dir. İhtiyaç duyulan veri yapısı seçilen yönteme bağlı olarak oldukça farklıdır.

Daha önce de belirtildiği gibi, Geiss'in GPU Gems 3 makalesi, GPU'daki MC arazilerini anlamak ve uygulamak için çok öğretici bir başlangıç ​​noktasıdır (MC yaklaşımının tamamen GPU'da çalıştığını ve en az SM4 - GS özellikli bir alan gerektirdiğini unutmayın).

MC voksellerdeki yoğunluk verileri yalnızca voksel kenarlarında kalabileceğinden, klasik MC keskin kenar özelliklerini koruyarak ses seviyesini ayarlayabilir. Yoğunluk bilgisi vokselin içinde herhangi bir yere ve her köşedeki işarete yerleştirilmiş bir 3D nokta (QEF minimizer) olarak ifade edildiğinden DC bu dezavantaja maruz kalmaz.

Öte yandan, MC tüm kesişen yüzlerden muzdarip değildir, çünkü üretilen tüm üçgenler karşılık gelen vokselleri içine alırken DC'nin üretilen yüzler arasındaki kesişmeleri önlemek için ek hesaplamalara ihtiyacı vardır. DC yazarları bu sorunu algoritmalarının geliştirilmiş bir sürümünde ele aldılar.

http://www.cs.wustl.edu/~taoju/research/interfree_paper_final.pdf

http://www.cs.berkeley.edu/~jrs/meshpapers/SchaeferWarren2.pdf

Bu adam aynı zamanda kendi kendine kavşaklardan kaçınmak için dışbükey / içbükey analize dayanan daha temiz bir yaklaşım öneriyor. Kenarın yönünü korumaya yardımcı olmak için daha iyi dörtlü bölme kuralları kullanır:

http://www2.mae.cuhk.edu.hk/~cwang/pubs/TRIntersectionFreeDC.pdf

Klasik MC de kullanıma hazır bir "çatlaksız" değildir ve sınırsız oktrees üzerinde çalıştırılırsa çatlak yaması gerektirebilir. DC bu son sayıdan muzdarip değildir.

Çoğu ağ çıkarma tekniklerinin oldukça güzel ve eksiksiz bir araştırması: http://www.cs.berkeley.edu/~jrs/mesh/

Bir oktree / voksel yaklaşımı özünde "CSG dostu" olup, düzgün ve tamamen "yıkılabilir" bir oyun seviyesi stratejisi planlamayı kolaylaştırır, ancak eğer tüm bunların bir oyunda uygulanması gerekiyorsa, oktree derinliğinin de sinir bozucu olması gerekir. bağımlı.

Tüm öğeler belleğe sığarsa veya doğru şekilde akışa tabi tutulursa, veriler AO oluşturmak ve fizik / çarpışmaların hesaplanması için de kullanılabilir.


"Arazinin mağara ağlarına ve çıkıntılara ihtiyacı varsa 3D gürültü zorunlu hale gelir." Zorunlu? İçinde olduğu gibi, mağaralar ve çıkıntılar üretmenin tek yolu bu mu? Hayır! 2D perlin gürültüsünden bir yükseklik haritası oluşturuyorum ve daha sonra daha doğal bir görünüm için mağaraları ve çıkıntıları ayrı bir adım olarak oyuyorum. Genç oyun geliştiricilerinin, prosedürel olarak oluşturulmuş bir dünyada mağaralar ve çıkıntılar üretmenin SADECE yolu olduğunu söylemek yanıltıcıdır.
Domarius

5

Benim tahminim, bu özel örnekte, z değerini, ne tür bir malzeme olduğunu belirlemek için kullanmasıdır: ana kaya, taş, kir veya hava.


-3

Minecraft, 3D arazi oluşturmak için yürüyen küpler algoritmasını kullanır. Bunun için bir referansım yok, üzgünüm. Belki de yürüyen küpler algoritması için bir tohum olan Perlin Gürültü fonksiyonundan bahsettiğinde Notch'un neden bahsettiğinden emin değilim. Daha fazla bilgi burada:

Ve küpleri yürümekle ilgileniyorsanız harika bir GPU Gems makalesi:


2
Yürüyen küpler, skaler bir alandan bir kafes oluşturmak için bir algoritmadır. Bu, önce verilere sahip olması gerektiği anlamına gelir, daha sonra verilere uyacak bir kafes oluşturur. Veri veya arazi üretmek için değil.
MichaelHouse

-6
for (int x = 0; x < Width) 
{
  for (int y = 0; y < Depth) 
  {
    for (int z = 0; z < Height) 
    {
      if(z < Noise2D(x, y) * Height) 
      {
        Array[x][y][z] = Noise3D(x, y, z)
      } else {
        Array[x][y][z] = 0
      }
    } 
  } 
} 

2
1; Eklediğiniz açıklama ile bu oldukça kötü bir cevap olsa da, kod snippet'inin amacını veya ortaya çıkan veriler üzerindeki anlamsal etkisini açık bir şekilde açıklamaz ve kullanıcının gerçekten sahip olduğu soruların çoğunu ele almaz.

Kodu düzenledim, ya şimdi?
Maxim DC

3D gürültünün arazi yapmak için nasıl kullanıldığını açıklıyor, bence bu doğru
Maxim DC

Ardından bunu cevabınızda açıklayın ve kullanıcının sorduğu soruları yanıtlayın. Aksi takdirde bir çıkmaz kod yanıtıdır.
Tom 'Blue' Piddock
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.