Pembuatan gua dengan cacing Perlin

12

Saat ini saya mencoba membuat Minecraft seperti medan voxel dengan 3D Simplex Noise dan juga ingin mengimplementasikan gua.

Saya menemukan metode Cacing Perlin di utas ini , yang menghasilkan hasil yang sangat bagus. Namun, saya tidak tahu bagaimana cara menghasilkannya secara chunk. Apakah ini mungkin atau adakah alternatif yang menghasilkan cacing yang mirip seperti gua berdasarkan sepotong demi sepotong?

Sunting: Ini adalah masalah yang saya tidak tahu bagaimana menyelesaikannya.

Sunting2: Ini adalah hasil dari menggabungkan 2D Ridged Multifractal Noise dengan Simplex Noise heightmap. Masih perlu beberapa penyesuaian, tetapi ini adalah hasil yang saya inginkan. Terima kasih kepada Byte56.

user000user
sumber
Anda harus menggunakan formula langsung untuk pembuatan medan jika memungkinkan. Jika Anda dapat menghitung voxel hanya berdasarkan koordinatnya dan tanpa informasi tentang yang berdekatan, bidak tidak lagi menjadi masalah. Jika Anda ingin menggunakan cacing perlin, yang saya kira tidak dapat dihitung untuk setiap voxel secara terpisah, lihat paragraf terakhir di jawaban yang diterima dari pertanyaan yang Anda tautkan.
danijar
1
Pada dasarnya, itu adalah pertanyaan saya. Medan dasarnya mudah untuk dihitung hanya dengan koordinat yang diberikan, tetapi saya tidak tahu cara menghitungnya, apakah ada gua atau tidak.
user000user

Jawaban:

5

Sebagian besar algoritma derau perlin akan memungkinkan Anda untuk mengambil nilai derau di lokasi tertentu, dengan sesuatu seperti noise(x,y,z). Ini membuatnya cukup sepele untuk menghasilkan noise berdasarkan chunk by chunk. Yang perlu Anda lakukan adalah melewati posisi global, bukan posisi chunk.

for(int i = 0; i < CHUNKMAX_X; i++)
    for(int j = 0; j < CHUNKMAX_Y; j++)
        for(int k = 0; k < CHUNKMAX_Z; k++)
            if(isSolid(perlinNoise.get(chunkPosition.x + i,
                                         chunkPosition.y + j,
                                         chunkPosition.z + k))
                thisChunk[i,j,k] = new Voxel(solid);
            else
                thisChunk[i,j,k] = new Voxel(air);

Jadi Anda dapat melihat, kami membuat medan untuk chunk, dengan mengulangi batas chunk, dan memeriksa untuk melihat apakah posisi global itu solid atau tidak. Ini kemungkinan metodologi yang sama yang Anda gunakan untuk menghasilkan medan secara umum.

perlinNoise.getmengambil posisi global dan mengembalikan kepadatannya. Di mana isSolidhanya akan menjadi tes sederhana untuk melihat apakah voxel itu "cukup padat" untuk memenuhi syarat untuk padat.

perlinNoise.getbisa jadi lebih kompleks dari sekadar algoritma noise sederhana. Anda dapat memiliki cek berdasarkan kedalaman voxel di dunia Anda. Misalnya, jika voxel di bawah apa yang Anda putuskan adalah "level dasar absolut", maka ia dapat menggunakan algoritme cacing perlin untuk mengembalikan kepadatan, jika di atas basis absolut, ia dapat menggunakan fungsi kerapatan normal untuk memberi Anda medannya lebih bervariasi. Saya akan merekomendasikan beberapa campuran antara keduanya.

Menggabungkan berbagai fungsi kebisingan Perlin hanyalah sesuatu yang harus Anda mainkan dan lihat apa yang berhasil. Yang terbaik adalah mengatur lingkungan Anda sehingga Anda hanya dapat mengubah beberapa nilai dan bertukar hot-terain tanpa perlu memuat ulang game Anda. Selamat bereksperimen.

MichaelHouse
sumber
2
Terima kasih atas jawabannya. Namun, saya tidak tahu bagaimana menggunakan Perlin "biasa" atau Noise Simplex untuk membuat gua seperti cacing. Mereka berbentuk bulat, diskalakan ke satu arah atau tidak terlalu panjang. Dan untuk algoritma Perlin Worms, saya tidak tahu bagaimana menentukan apakah posisi saat ini di dalam worm, tanpa mengetahui posisi kepala.
user000user
1
Algoritma cacing tidak bergantung pada mengetahui "posisi kepala". Dari apa yang Anda katakan, tampaknya masalah Anda bukan dengan menghasilkan suara pada sepotong demi sepotong. Ada tutorial tentang pertanyaan yang Anda tautkan untuk menerapkan cacing perlin. Cara menghasilkan medan "biasa" dapat ditemukan di sini .
MichaelHouse
Generasi medan dasar dengan 3D Simplex Noise berfungsi dengan baik, tapi saya tidak tahu cara menentukan posisi / segmen cacing di dalam bongkahan. Dari apa yang saya mengerti, Anda memberi cacing posisi kepala dan n segmen dan menghitung sudut antara segmen dengan fungsi noise. Berikut adalah gambar yang mungkin lebih baik menjelaskan, apa masalah saya: tautan .
user000user
2
Ada berbagai jenis kebisingan. Menggunakan posisi kepala dan mengikuti dari sana adalah satu metode. Jika Anda melihat di dekat bagian bawah halaman ini , Anda akan menemukan beberapa kebisingan yang menciptakan jenis kebisingan yang Anda inginkan tanpa perlu posisi kepala terlebih dahulu.
MichaelHouse
Terima kasih atas petunjuknya. Saya menerapkan Noise Ridractultractal 3D, meskipun, hasilnya dengan itu agak tidak memuaskan. Saya akan mencoba menggabungkannya dalam 2D ​​dengan 2D Heightmap dan kemudian melaporkan lagi. Ini dapat membuat lebih banyak gua seperti cacing.
user000user
3

Saya pikir ini cara kerjanya di Minecraft. Setiap cacing memiliki panjang maksimum (sebut saja M). Kepala setiap cacing dihitung berdasarkan posisi chunk. Ketika Anda membuat setiap potongan, Anda harus memeriksa semua potongan dalam Mradius, dan mengikuti semua cacing mereka. Ini tidak ideal dalam hal kinerja, tetapi berhasil.

Tom Dalling
sumber