Pembuatan sungai atau jalan prosedural untuk medan yang tak terbatas

28

Saya harus mengatakan jalan, bukan jalan karena saya berpikir lebih seperti abad pertengahan. Juga, tidak mencari realisme. Jawaban yang saya cari adalah agar sesuai dengan cetakan yang saya gambarkan daripada realisme.

Saya mencari metode untuk menghasilkan jalan prosedural / sungai dengan gaya melengkung, tapi saya ingin melakukannya untuk sistem tipe medan tak terbatas. Sama seperti bagaimana perlin noise menghasilkan gumpalan, saya ingin menghasilkan segmen garis panjang acak (mungkin panjang tak terbatas).

Saya menyadari strategi seperti jawaban yang disarankan ditemukan di sini , namun itu bergantung pada titik awal dan akhir yang ditentukan untuk bekerja, saya tidak memiliki titik awal dan titik akhir yang ditentukan. Saya ingin dapat memanggil fungsi menggunakan koordinat arbitrer dan mengembalikannya apakah koordinat spesifiknya adalah bagian dari sungai / jalan.

Saya tidak ingin memerlukan medan yang akan dihasilkan sebelumnya. Itu termasuk peta ketinggian (seperti yang digunakan untuk simulasi curah hujan atau serupa). Saya juga tidak ingin memerlukan titik awal / akhir.

Apakah ada algoritme atau perubahan pada algoritme kebisingan yang mungkin diketahui seseorang untuk mencapai apa yang saya coba jelaskan?

Yang paling dekat dengan saya sejauh ini adalah fraktal multi-ridged, jika saya menggunakan nama dengan benar. Saya hanya mengambil nilai absolut dari nilai noise (dengan asumsi diskalakan menjadi -1 hingga +1) dan menetapkan ambang batas. Masalah utama saya dengan ini adalah garis yang tumpang tindih terlalu sering, kebanyakan melingkar, kadang-kadang bertemu untuk membentuk danau besar yang rapi tetapi tidak diinginkan, dan sering kali ketebalan garis terlalu banyak bervariasi.

Berikut adalah gambar dari apa yang saya miliki sejauh ini dalam 2D, tetapi pada frekuensi yang sangat tinggi untuk menunjukkan lebih detail:

masukkan deskripsi gambar di sini

Mythics
sumber
karena sungai "mengalir" bisa jadi mudah untuk menentukan sungai hanya dengan menggunakan noise untuk menentukan titik asal, setelah itu cukup gunakan data peta ketinggian tinggi Anda untuk menentukan jalur.
Perang
jalan bisa menjadi sedikit lebih menantang, saya menganggap membangun jalan berdasarkan penggunaan, jika seorang pemain / semua pemain secara teratur berjalan di atas beberapa medan itu akan menjadi jalan.
Perang
1
@ user19142 OK, bukan duplikat. Anda dapat menemukan beberapa kegunaan dari pertanyaan / jawaban ini juga: gamedev.stackexchange.com/questions/53400/... Dan saya akan menyertakan tautan sebelumnya lagi sebagai "terkait" gamedev.stackexchange.com/questions/45403/… gamedev. stackexchange.com/questions/29044/… gamedev.stackexchange.com/questions/31263/…
MichaelHouse
4
Saya pikir jalan tidak akan terlalu bisa dipercaya jika dihasilkan dengan kebisingan. Jalan dibuat oleh kecerdasan, bukan oleh fisika dan waktu. Meskipun mereka mungkin mirip satu sama lain di kali, mereka cukup berbeda sehingga Anda mungkin tidak dapat menggunakan algoritma yang sama untuk keduanya.
MichaelHouse
1
Jalan-jalan di proyek itu adalah garis kontur yang mengikuti ketinggian tertentu, sehingga Anda bisa membuatnya secara lokal. Itu bekerja di sana tetapi peta ketinggian tidak dihasilkan dengan suara Perlin.
amitp

Jawaban:

11

Hanya ide saya untuk mengarsipkan ini apa yang Anda inginkan tanpa (banyak) perhitungan dan kemungkinan untuk dunia tanpa batas.

Bagian pertama dari algoritma adalah penggunaan Voronoi-Diagramms . Anda membagi dunia Anda menjadi kisi-kisi, setiap kisi memiliki alamat dalam bentuk (xgrid, ygrid). Untuk setiap sel di mana Anda perlu membuat jalan, Anda meletakkan variabel xgrid dan ygrid ke fungsi hash yang mengembalikan nomor CellSeed . Anda menggunakan CellSeed sebagai seed untuk generator angka acak yang menghasilkan koordinat poin untuk Diagram Voronoi.

Sekarang Anda perlu mencari tepi diagram dan node di mana banyak sisi bertabrakan. Anda juga dapat menyimpan informasi ke dalam grafik untuk akses yang lebih mudah.

Setelah langkah ini, Anda dapat mencari jalur melalui jaringan yang valid.

Untuk jalur yang valid, Anda sekarang dapat membuat jalan (mereka memiliki tepi tajam).

Catatan : Anda juga perlu membuat koordinat diagram Voronio untuk semua sel neightbor sehingga Anda tidak memiliki batas di tepi sel.

Jika Anda tidak ingin sharph edge, Anda dapat menghitung titik tengah dari setiap koneksi dan menggunakan arah sebagai garis singgung untuk interpolasi bezier antara dua tepi dalam grafik.

Tentang penggunaan Voronoi-Diagramms

Untuk mengarsipkan kota seperti struktur jalan, titik-titik dari fungsi pseudo acak dapat disejajarkan pada kisi, sehingga jalannya berbentuk persegi panjang.

Untuk lebih banyak county seperti jalan, poin harus lebih teratur.

diagramm dari wikipedia

Tentang fungsi Acak Pseudo untuk menghasilkan posisi titik untuk Diagram-Diono

Ini bisa berupa fungsi acak normal atau himpunan Hammersley untuk distribusi poin yang tidak rumpun yang lebih seragam.

Quonux
sumber
Apakah Anda memiliki contoh fungsi hash? Saya memiliki tujuan yang sama (dunia tanpa batas yang menggunakan voronoi untuk jalan) tetapi saya tidak bisa memahami bagaimana ini harus dilakukan. Setiap voronoi lib saya dapat menemukan koordinat yang diharapkan dari kotak berlari yang segera mengalahkan tujuan.
BotskoNet
Tidak, fungsi hash hanya untuk menetapkan begineed ke sel. Bisa jadi sesuatu yang sepele seperti x * prime1 + y * prime2 + z * prime3. Di mana bilangan prima tidak sama satu sama lain dan idealnya besar, Anda harus menghitung di sini dengan bilangan bulat 64bit / tidak ditandatangani. Ini bukan masalah jika lib menggunakan kotak pembatas, karena untuk setiap sel Anda hanya perlu mengkonsi semua titik dalam sel ditambah semua titik sel lingkungan (yang merupakan 8 sel lingkungan).
Quonux
Anda akan mengalami masalah presisi dengan presisi tunggal jika lib menggunakan presisi tunggal atau jika Anda menggunakan precsion tunggal. Untuk memintas masalah jika lib hanya menggunakan presisi tunggal dan Anda tidak melakukan sebagai berikut: Sebelum mengubah posisi menjadi presisi tunggal kurangi posisi global sel pusat dari mereka, kemudian masukkan ini sebagai mengapung ke lib, kemudian ubah hasil kembali.
Quonux
Saya sebenarnya tidak pernah mengimplementasikan algoritma ini tetapi fungsi hash memang bisa menjadi hal yang sepele.
Quonux
8

Untuk pembuatan jalan (dan kota), makalah terbaik yang saya temukan adalah makalah ini:

Pemodelan Prosedural Kota oleh Y Parish dan P Müller

Ini menggunakan L-System dan dapat menghasilkan pola jalan AS dan UE. Jika Anda tidak ingin membuat jalan untuk seluruh kota, Anda bisa menghasilkan jalan utama. Ini dapat mengambil peta ketinggian, peta air dan peta kepadatan populasi dalam input.

Rak
sumber
+1 hanya karena saya suka kertasnya. Benar-benar tidak cocok dengan bagaimana saya ingin mencoba menghasilkan jalan / jalur / sungai WHILE menghasilkan medan secara dinamis.
Mythics
6

http://vterrain.org/Culture/Roads/ bagian "Menghasilkan Jalan 3D" memiliki beberapa informasi tentang pembuatan jalan .

Masalah dengan jalan adalah mereka menghubungkan landmark (meskipun mereka sering mengikuti medan bukannya langsung dari A ke B).

Secara pribadi, saya akan menghasilkan medan, kemudian menempatkan sungai (mungkin menggunakan erosi, lihat http://vterrain.org/Water/ bagian "hidrogeologi"), lalu letakkan kota di tempat-tempat yang masuk akal (misalnya dekat sungai atau lainnya sumber air, atau di tempat di mana air dapat diangkut menggunakan saluran air atau menara air dan pipa) dan akhirnya menghasilkan jalan antar kota.

Untuk membuat ini lebih mudah digunakan dalam dunia prosedural, Anda dapat membuat titik-titik perantara di medan di mana jalan paling mungkin terjadi ketika dihasilkan di tempat itu, lalu sambungkan titik-titik perantara jika sebuah jalan benar-benar dibuat di tempat itu.

Exilyth
sumber
4

Pertama, sungai dan jalan sangat berbeda. Jalan cenderung mengikuti isolasi (ketinggian yang sama / serupa) - alasannya adalah lebih mudah untuk melakukan perjalanan di jalan yang tidak naik atau turun jauh. Sungai, sebaliknya, bergerak tegak lurus terhadap isoline / isoclines (menuruni bukit). Sungai terbentuk di cekungan (kumpulan gunung yang semuanya mengalir ke bawah ke lembah tertentu) dan cenderung membentuk struktur seperti pohon. Selain itu, jalan sering melakukan perjalanan tegak lurus ke sungai, untuk membentuk jembatan logis. Ide terbaik adalah pertama-tama menghasilkan sungai, dan kemudian membuat jalan logis (yaitu jalan antar kota). Sayangnya saya tidak punya waktu untuk membahas lebih detail, tetapi mudah-mudahan ini akan membawa Anda ke jalur yang benar.

Ini mungkin tampak jelas, tetapi lihatlah peta Google di berbagai jenis medan dan jalan; Anda akan mendapatkan pemahaman yang lebih baik tentang bagaimana penampilan mereka.

Gavan Woolery
sumber
1
Saya memodifikasi pertanyaan lagi untuk membuatnya lebih dimengerti bahwa saya tidak tertarik pada realisme di dekat sebanyak saya dalam cara algoritma perlu bekerja. Saya sangat menghargai jawabannya meskipun sebagian besar untuk beberapa istilah yang digunakan. Cobalah untuk memikirkan keinginan saya lebih seperti coretan panjang acak tak terbatas yang dapat dihasilkan dengan data minimal yang diperlukan (seperti peta ketinggian).
Mythics