Bagaimana fungsi noise 3d perlin digunakan untuk menghasilkan medan?

20

Saya dapat membungkus kepala saya menggunakan fungsi noise 2d perlin untuk menghasilkan nilai ketinggian tapi saya tidak mengerti mengapa fungsi noise 3d perlin akan digunakan. Dalam blog Notch, http://notch.tumblr.com/post/3746989361/terrain-generation-part-1 , ia menyebutkan menggunakan fungsi perlin 3d untuk generasi terrain di Minecraft. Adakah yang tahu bagaimana itu akan dilakukan dan mengapa itu akan berguna? Jika Anda melewati nilai x, y, dan z bukankah itu berarti Anda sudah memiliki tinggi?

Xavier
sumber

Jawaban:

19

Derau 2D perlin baik untuk peta ketinggian, tetapi dalam kasus ini tampaknya ia tidak menggunakan peta ketinggian. Sebaliknya ia memiliki kisi 3D, di mana sel mana pun bisa kosong. Ini memungkinkan gua dan formasi semacam itu, di mana ketinggian tanah bukan nilai tunggal untuk lokasi 2D yang diberikan.

msell
sumber
14

Alih-alih mengambil sampel "ketinggian tanah", saya memperlakukan nilai kebisingan sebagai "kepadatan", di mana segala sesuatu yang lebih rendah dari 0 adalah udara, dan apa pun yang lebih tinggi dari atau sama dengan 0 akan menjadi tanah.

Sederhananya, untuk setiap tempat di mana blok dapat, fungsi noise dievaluasi, dan jika itu adalah> 0, sebuah blok ditempatkan. Fungsi kebisingan Notch condong dengan menambahkan ketinggian dari permukaan air ke nilainya, itu sebabnya daerah yang lebih rendah sebagian besar padat (tinggi adalah negatif besar, jadi tinggi + kebisingan juga negatif) dan daerah yang lebih tinggi sebagian besar kosong (tinggi positif besar, jadi tinggi + noise juga positif).

Mungkin ada beberapa alkimia tambahan untuk memutuskan jenis blok apa yang dihasilkan, dan untuk mengukir gua. Tapi saya kira itu tidak terkait langsung dengan fungsi noise ini.

Perhatikan juga bahwa metode ini berfungsi untuk Notch karena Minecraft memiliki medan berbasis voxel. Jika Anda mencoba melakukan itu di dunia berbasis poligon, hanya mengambil contoh fungsi noise tidak akan cukup. Anda harus menggunakan beberapa algoritma untuk mengubah sampel menjadi permukaan, dan membuat poligon yang mendekati permukaan ini. Salah satu algoritma tersebut adalah marching cubes .

Lupakan
sumber
8

Kebisingan 3D menjadi hal wajib jika medan membutuhkan jaringan gua dan overhang.

Untuk mengekstrak permukaan isosurface dari informasi kepadatan, 2 teknik yang paling populer adalah Marching Cubes (MC), dan Dual Contouring (DC) yang lebih baru. Struktur data yang dibutuhkan sangat berbeda tergantung pada metode yang dipilih.

Seperti yang disebutkan sebelumnya, artikel Geiss's GPU Permata 3 adalah titik awal yang sangat instruktif untuk memahami dan mengimplementasikan medan MC pada GPU (Perhatikan bahwa pendekatan MC-nya berjalan sepenuhnya pada GPU dan membutuhkan setidaknya SM4 - GS yang mampu).

Karena data kepadatan pada voxel MC hanya dapat tetap di tepi voxel, MC klasik dapat membentuk volume tanpa mempertahankan fitur tepi yang tajam. DC tidak mengalami kelemahan ini karena info densitas dinyatakan sebagai titik 3D (QEF minimizer) yang diletakkan di mana saja di dalam voxel plus tanda di setiap sudut.

Di sisi lain, MC tidak menderita dari wajah berpotongan sendiri karena semua segitiga yang dihasilkan tertutup dalam voxels yang sesuai, sedangkan DC membutuhkan perhitungan tambahan untuk mencegah persimpangan antara wajah yang dihasilkan. Penulis DC membahas masalah ini dalam versi yang ditingkatkan dari algoritme mereka.

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

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

Orang ini juga mengusulkan pendekatan yang lebih bersih berdasarkan analisis cembung / cekung untuk menghindari persimpangan-sendiri. Ia menggunakan aturan pemisahan quad yang lebih baik untuk membantu menjaga orientasi edge:

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

MC klasik juga tidak out-of-box "bebas retak" dan mungkin memerlukan penambalan retak jika dijalankan pada oktan yang tidak dibatasi. DC tidak menderita dari masalah terakhir ini.

Berikut ini adalah survei yang cukup bagus dan lengkap dari sebagian besar teknik ekstraksi mesh: http://www.cs.berkeley.edu/~jrs/mesh/

Pendekatan octree / voxel secara intrinsik adalah "CSG-friendly", yang membuatnya lebih mudah untuk merencanakan strategi level game yang sepenuhnya "dapat dirusak", tetapi jika seseorang perlu menerapkan semua ini dalam sebuah game, kedalaman octree juga perlu frustasi. -tergantung.

Jika seluruh barang cocok dalam memori atau streaming dengan benar, data juga dapat digunakan untuk rendering AO dan komputasi fisika / tabrakan.

Okr
sumber
"Kebisingan 3D menjadi wajib jika medan membutuhkan jaringan gua dan gantung." Wajib? Seperti, apakah ini satu-satunya cara untuk menghasilkan gua dan menggantung? Nggak. Saya membuat peta ketinggian dari derau 2D perlin dan kemudian mengukir gua dan menggantungnya sebagai langkah terpisah, untuk tampilan yang lebih alami. Sangat menyesatkan bagi pengembang game muda untuk mengatakan bahwa ini adalah HANYA cara untuk menghasilkan gua dan menggantung di dunia yang dihasilkan secara prosedural.
Domarius
5

Dugaan saya, dalam contoh khusus itu, adalah bahwa ia menggunakan nilai z untuk menentukan jenis bahan apa: batuan dasar, batu, tanah, atau udara.

Tetrad
sumber
-3

Minecraft menggunakan algoritma marching cubes untuk menghasilkan medan 3D. Saya tidak punya referensi untuk ini, maaf. Saya tidak yakin persis apa yang Notch bicarakan ketika ia menyebutkan fungsi Perlin Noise - mungkin benih untuk algoritma marching cubes. Info lebih lanjut di sini:

Dan artikel Permata GPU yang bagus jika Anda tertarik untuk berbaris:

Aaron Snoswell
sumber
2
Marching cubes adalah algoritma untuk menghasilkan mesh dari bidang skalar. Itu berarti perlu memiliki data terlebih dahulu, kemudian menghasilkan mesh agar sesuai dengan data. Ini bukan untuk menghasilkan data atau medan.
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
      }
    } 
  } 
} 
Maxim DC
sumber
2
-1; Bahkan dengan klarifikasi yang Anda tambahkan ini adalah jawaban yang sangat buruk, itu tidak jelas menjelaskan tujuan dari potongan kode atau dampak semantiknya pada data yang dihasilkan, dan itu tidak menjawab sebagian besar pertanyaan yang sebenarnya dimiliki pengguna.
Saya sudah mengedit kode, bagaimana dengan sekarang?
Maxim DC
Ini menjelaskan bagaimana noise 3D digunakan untuk membuat medan, ini benar menurut pendapat saya
Maxim DC
Kemudian jelaskan ini dalam jawaban Anda dan jawab pertanyaan yang diajukan pengguna. Kalau tidak, itu adalah jawaban deadcode.
Tom 'Blue' Piddock