Bagaimana cara menghapus medan apung saat dibuat dengan 3D Perlin Noise?

10

Saat ini saya menggunakan Perlin Noise 3D untuk menghasilkan medan acak dalam kombinasi dengan Marching Cubes.

Masalah saya tampaknya terletak pada peningkatan fungsi kebisingan untuk mendapatkan ketinggian yang wajar di medan saya. Jika hanya satu oktaf digunakan, semua titik dalam kaitannya dengan kebisingan jelas diinterpolasi yang menghasilkan data yang cukup halus. Namun, untuk mendapatkan overhang / gua / medan bergerigi, saya harus menggunakan beberapa oktaf dengan berbagai amplitudo dan / atau skala nilai yang dihasilkan hingga ketinggian 'maks' saya yang saya inginkan dari peta.

Saya mungkin kehilangan sesuatu, tetapi dengan menggunakan kubus berbaris dengan suara 3D perlin, saya secara teratur mendapatkan bit mengambang dari medan.

Ada ide tentang bagaimana saya bisa memperbaiki ini atau jika ada fungsi noise lain yang mungkin saya gunakan untuk mendapatkan hasil seperti yang saya jelaskan? Saya menginginkan bukit / lembah / gunung / danau / dll. Tidak perlu bit mengambang yang dipisahkan dari sisa peta. Saya percaya ini adalah masalah yang mirip dengan apa yang dimiliki Minecraft ketika memiliki medan yang hanya mengambang di langit sesekali dari generasi ke generasi.

Terima kasih atas bantuannya, Mythics

Mythics
sumber

Jawaban:

9

Mungkin satu-satunya cara untuk sepenuhnya menghilangkan medan mengambang adalah dengan menguji konektivitas. Tergantung pada ukuran peta Anda, itu mungkin menjadi pilihan. Anda dapat melakukannya dengan memilih titik dasar, seperti bagian paling bawah dari dunia Anda. Kemudian pastikan semua voxel Anda:

  1. Terhubung ke pangkalan.
  2. Terhubung ke voxel yang terhubung ke pangkalan.

Kemungkinan memulai dari titik terhubung yang diketahui (seperti bagian bawah duniamu) kemudian melakukan penjelajahan luas pertama dari voxels yang terhubung akan bekerja dengan cukup baik. Pastikan Anda menandai voxels sebagai terhubung saat Anda pergi. Anda dapat melakukan ini per-chunk.

Selain itu, ada cara yang lebih murah untuk meminimalkan, tetapi tidak sepenuhnya menghapus medan mengambang.

  • Bias gradien : Anda dapat membiaskan penempatan voxel padat dengan gradien. Fungsi gradien akan jatuh agak tajam setelah Anda berada di atas "permukaan tanah". Artikel ini berbicara tentang penggunaan gradien dan memiliki beberapa tips rapi lainnya.

  • Kebisingan peta tinggi: Sebagai gantinya, Anda dapat menghasilkan noise sebagai peta ketinggian. Ini akan menghapus overhang dan gua, tetapi Anda dapat mensimulasikan mereka dengan lapisan noise tambahan yang menarik.

  • Kebisingan yang kurang bising : Gunakan lebih sedikit oktaf dalam kebisingan medan Anda dan hasilkan kebisingan subtraktif untuk mendapatkan overhang dan gua.

MichaelHouse
sumber
Dataran mungkin hanya dihubungkan melalui bongkahan yang berdampingan jika itu merupakan penggantungan dari sana.
Loren Pechtel
@ Loren: Tapi tidak apa-apa. Selama mesin memungkinkan Anda mengatasi bongkahan dengan indeks penuh, itu akan bekerja tanpa masalah.
Phil
@ LorenPechtel Saya katakan Anda bisa melakukannya per chunk, tetapi Anda harus memeriksa potongan yang berdekatan ketika Anda berada di tepi chunk. Ini dapat menjadi masalah saat membuat medan baru dan belum membuat bongkahan yang berdekatan. Ketika Anda datang ke situasi ini di mana Anda memiliki potensi daerah terapung, Anda dapat membuat bongkahan yang berdekatan, atau menggunakan algoritma bunyi untuk mengurai voxels hingga Anda menemukan "batuan dasar" atau koneksi yang diketahui ke bongkahan saat ini.
MichaelHouse
0

mungkin sudah terlambat untuk menjawab, tetapi saya mulai sekarang dengan hal pembuatan medan voxel ini, dengan Perlin Noise dan saya menemukan cara untuk membuat medan tanpa potongan-potongan mengambang itu. Saya pikir ini dapat membantu Anda. Jadi, untuk membuat medan, saya pertama-tama menghasilkan peta ketinggian daripada membaca piksel dari peta tinggi itu. Sekarang sampai pada bagian yang menarik, saya membaca nilai "kecerahan" (sebenarnya adalah skala abu-abu) dari setiap piksel pada peta tinggi tersebut dan yang memberi saya ketinggian untuk bagian peta tersebut, kemudian untuk membuat medan saya berasumsi bahwa peta ketinggian ini adalah medan saya dilihat dari atas, jadi jika nilai skala abu-abu piksel (setelah dipetakan ke medan "maxHeight") pada peta tinggi itu, katakanlah 30, itu berarti bahwa pada titik tertentu di medan saya, saya hanya akan menghasilkan 30 voxel di sumbu y dan ini memberi saya medan tanpa bagian mengambang. Jika Anda ingin gua dan sebagainya, Anda dapat menerapkan suara lain pada aslinya (di bawah permukaan) untuk membuat gua-gua itu. Semoga ini berhasil untuk Anda.

Sammael
sumber
1
Saya percaya ini mirip dengan poin kedua dalam jawaban saya di atas?
MichaelHouse