Bagaimana cara menghasilkan gua yang mirip dengan gua Minecraft?

34

Saya telah bekerja di dunia prosedural 3D untuk sementara waktu sekarang dan saya ingin mulai menambahkan sistem gua. Saat ini saya menggunakan Perlin Noise 2D / 3D untuk generasi medan dikombinasikan dengan Marching Cubes untuk medan yang lebih halus. Aku hanya bingung ketika berbicara tentang gua-gua panjang yang saling berhubungan.

Saya berharap untuk mendapatkan sesuatu yang lebih seperti sistem gua Minecraft. Mereka tampaknya sangat terhubung, bercabang secara acak di hampir segala arah, dan hampir setiap titik di gua akan memiliki tampilan yang cukup melingkar dengan radius yang cukup sama di seluruh (bukan kata-kata terbaik, tetapi tidak yakin bagaimana cara lain untuk meletakkannya) .

Tantangan terbesar untuk menghasilkan gua seperti yang saya inginkan adalah saya ingin menghasilkan dunia dengan cepat. Dunia dihasilkan potongan demi sepotong saat ini, mulai dari tempat pemain itu dan itu menghasilkan keluar dari sana. Saya TIDAK ingin menghasilkan dunia mana pun dan kemudian menggali gua menggunakan pola pengembaraan, automata seluler, dll.

Apakah ada algoritma terkenal yang dapat digunakan untuk ini? Jika demikian, apakah ada yang ingin membagikan bagaimana mereka melakukan hal serupa? Saya sangat menghargai bantuan apa pun.

Sebuah contoh yang baik: masukkan deskripsi gambar di sini

Mythics
sumber
5
Lihatlah di sini , dan gulir ke bawah.
William Mariager
Ada masalah majalah pengembang game dalam 24 bulan terakhir yang memiliki diskusi mendalam tentang cara melakukan apa yang Anda coba lakukan. Saya akan mengunjungi situs mereka.
Joey Green
@ JoeyGreen Apa nama majalahnya? Atau apakah Anda memiliki tautan ke situs mereka?
jumpnett
1
Ini disebut majalah pengembang game. gdmag.com . Anda bisa mendapatkan langganan dan mendapatkan versi pdf majalah selama 10+ tahun terakhir. Jika Anda mendaftar, ada cara untuk mencari melalui masalah sebelumnya dan menemukan masalah yang Anda inginkan.
Joey Green

Jawaban:

30

Gua Minecraft dihasilkan oleh metode "cacing perlin". Generator ular melalui medan dan membuat terowongan. Minecraft tidak menggunakan noise 3D perlin untuk pembuatan gua, karena cenderung meninggalkan kantung yang tidak terhubung di medan. Gua Minecraft belum dihasilkan melalui 3d Perlin noise sejak versi Alpha yang sangat awal.

Berikut adalah gua di Gnomescroll yang dihasilkan dari metode "perlin worm".

Sistem Gua Gnomescroll Tampilan Orang Pertama 1

Sistem Gua Gnomescroll Tampilan Orang Pertama 2

Sistem Gua Gnomescroll Tampilan Orang Ketiga 2

Ini adalah libnoise "Perlin Worms" dari tutorial libnoise. Teknik ini mereproduksi erat gua yang dihasilkan di Minecraft.

Tutorial Linoise Perlin Worms

Parameter mengular mempengaruhi kualitas sistem gua dan menentukan seberapa vertikal gua dan seberapa cepat mereka berubah arah. Gua-gua di cabang minecraft dan jari-jari terowongan gua bervariasi sepanjang gua.

Minecraft membuat gua berdasarkan chunk by chunk. Pendekatan yang diperlukan rumit dan belum ada yang membalik generator gua Minecraft dengan sempurna, meskipun ada minat dari pemodel server.

Pendekatan yang paling mungkin menghasilkan potongan-potongan gua berliku-liku sebagai potongan ketika peta tak terbatas dihasilkan dan diperluas ke luar. Gua-gua pada bongkahan saat ini adalah fungsi dari biji gua pada bongkahan N terdekat untuk beberapa N. Menggunakan generator bilangan acak yang merupakan fungsi dari koordinat bongkahan untuk menabur gua, dimungkinkan untuk menghitung gua pada bongkahan saat ini untuk peta tak terbatas sambil hanya mengevaluasi potongan dalam radius potongan terbatas.

HaltingState
sumber
3
Bisakah Anda menambahkan beberapa informasi atau sumber daya untuk mempelajari hal "cacing perlin" ini?
David Gouveia
1
Ini adalah tutorial tentang "cacing perlin
HaltingState
Tidak perlu, tetapi jika Anda bisa menguraikan paragraf terakhir itu, saya akan sangat menghargainya. Untuk menghasilkan worm, saya anggap Anda akan membutuhkan titik awal per cacing, yang harus berada dalam N potongan dari pemain mana pun di mana N adalah panjang maksimal cacing.
Mythics
3
Persis. Setiap cacing memiliki titik awal dan diakhiri jika berkeliaran di luar radius chunk tertentu. Ada generator bilangan acak yang secara deterministik menghasilkan urutan bilangan acak semu yang merupakan fungsi dari koordinat chunk. Angka acak ini menentukan di mana dan berapa banyak cacing berasal dari simpul itu. Cacing juga bisa bercabang. Beban komputasi berkurang jika cacing lebih "lokal" dan tidak dapat menjelajah lebih dari jari-jari kecil.
HaltingState
Mungkin bukan apa yang ingin saya dengar, tetapi apa yang saya harapkan. Terima kasih lagi HaltingState. :)
Mythics
7

Saya akan menghasilkan awan titik di dalam area di mana medannya padat - Anda dapat bereksperimen dengan kepadatan berbeda. Lalu saya akan menggunakan algoritma seperti pohon spanning minimum untuk menghubungkan semua poin - ini akan memastikan bahwa setiap area dapat dijangkau. Kemudian cukup gambar daerah berongga besar (terdiri dari udara) dari node ke node (yaitu garis tebal voxels).

Gavan Woolery
sumber
Saya mungkin tidak mengerti persis apa yang Anda maksudkan dengan ini, tetapi bagaimana saya akan melakukan ini dengan cepat sepotong demi sepotong ketika dunia menghasilkan?
Mythics
Salah satu cara yang mungkin adalah menghasilkan pohon spanning minimum di dalam setiap chunk secara terpisah, kemudian hubungkan setiap chunk dengan menemukan dua node terdekat di antara kedua chunk tersebut. Setelah potongan diisi dengan algoritme medan default, Anda dapat melubanginya di sekitar pohon rentang minimum.
Gavan Woolery
1
solusi lain (lebih mudah), meskipun kurang efisien dan mungkin "ribut", adalah menggunakan gerakan brown untuk mengukir jalan (seperti semut yang menggali secara acak).
Gavan Woolery
2

Edisi April 2011 Game Developer Magazine menjelaskan secara terperinci tentang hal ini dengan fungsi noise Perlin yang berulang - lihat artikel Creator of Worlds mulai dari halaman 21.

quantumpotato
sumber
Mereka menunjukkan tangkapan layar untuk setiap langkah (fungsi) dan menunjukkan variasi
quantumpotato
1

Gunakan fungsi noise untuk menetapkan nilai untuk setiap bongkahan untuk menentukan apakah memiliki terowongan atau tidak dan kemudian menggunakannya untuk memutuskan di mana menempatkan gua. Jika Anda ingin terowongan, cukup gunakan lebih banyak fungsi noise (dengan biji yang berbeda) dan gunakan nilainya untuk menentukan apakah ada terowongan. Setelah itu, gunakan fungsi "menggambar" biasa untuk membuat terowongan. Untuk membuat semuanya lebih realistis, gunakan lebih banyak noise untuk melakukan perpindahan acak untuk titik asal gua / terowongan tersebut.

Jika Anda tidak ingin menggunakan beberapa fungsi noise, Anda dapat menyelidiki pada jarak yang lebih besar - misalnya, daripada melakukan noise3d (2,2,2) untuk chunk di (2,2,2) melakukan noise3d (2,2, 16) dan gunakan (2,2,16) untuk satu nilai, (2,2,17) untuk nilai kedua, dll .... maka sesuaikan frekuensi Anda untuk membuat semua nilai independen atau berkorelasi pada skala pendek.

Untuk memvariasikan kepadatan gua di seluruh dunia, gunakan fungsi frekuensi lain yang lebih rendah yang akan memengaruhi nilai-nilai tersebut.

Dalam hal ini menghasilkan gua-gua yang berantakan, cukup tingkatkan jarak titik-titik yang saling berhubungan atau setel algoritma.

Saya tidak yakin apakah Minecraft memang gua seperti ini (walaupun saya pikir memang demikian), tetapi solusi ini harus memberikan hasil yang memuaskan.

Llamageddon
sumber
-5

disini adalah

Meskipun sebagian besar gua seperti yang di atas menggunakan cacing Perlin , beberapa orang lebih suka melakukannya secara manual. Dengan cara ini mereka dapat membuatnya seperti yang mereka inginkan tepat untuk blok. Sebuah gua yang dibuat dengan menggunakan cacing Perlin dapat menjadi tidak akurat dan hanya dapat membuat gua setinggi 5 kaki dan lebar 6 kaki, ini bisa tidak akurat karena Anda mungkin menginginkannya setinggi 10 kaki dan lebar 15 kaki.

locklan smith
sumber