Render sungai dalam kotak

8

Saya telah membuat peta ketinggian acak dan sekarang saya ingin membuat sungai. Saya telah membuat algoritma yang didasarkan pada * untuk membuat sungai mengalir dari puncak ke laut dan sekarang saya sedang mencari tahu algoritma yang elegan untuk membuatnya.

Ini adalah 2D, persegi, mapgrid. Sel-sel yang pases sungai memiliki nilai integer sederhana dengan bentuk ini: rivernumber && pointOrder. Yaitu: 10, 11, 12, 13, 14, 15, 16 ... 1 + N untuk sungai pertama, 20,21,22,23 ... 2 + N untuk yang kedua, dll. Ini dibuat dalam memetakan waktu pembuatan kisi dan dijalankan hanya sekali, saat dunia dihasilkan.

Saya ingin memperlakukan setiap sungai sebagai vektor, tetapi ada masalah, jika sungai yang sama memiliki cabang (karena saya mengeluarkan suara untuk menghasilkan cabang), saya tidak bisa hanya menghubungkan titik-titik secara berurutan.

Alternatif kedua adalah untuk menghasilkan algoritma yang kompleks di mana menganalisa setiap titik, memeriksa apakah yang berikutnya bukan cabang, jika demikian memicu algoritma lain yang merawat cabang kemudian kembali ke sungai utama, dll. Sangat kompleks dan tidak elegan.

Mungkin ada solusi dalam algoritma generasi dunia atau algoritma rendering sungai yang umum digunakan dalam kasus ini dan saya tidak menyadarinya.

Ada tips? Terima kasih!!

Gabriel A. Zorrilla
sumber
Saya kira Anda dapat menggunakan beberapa algoritma yang digunakan untuk pembuatan labirin dan hanya memotong beberapa egdes untuk membuat peta sungai yang lebih realistis.
Ali1S232
1
Saya memiliki jalur sungai, tetapi tidak tahu bagaimana menangani cabang ketika merendernya, menghubungkan titik-titik.
Gabriel A. Zorrilla
Punya titik di pertemuan (titik pertemuan dua sungai) yang diperlakukan sebagai simpul khusus?
Bebek Komunis
1
Saya pernah melihat artikel tentang cara membuat jalan di tilemap. Itu dipilih ubin berdasarkan yang tetangga ubin juga memiliki properti jalan. itu menciptakan sekitar 16 ubin berbeda (termasuk semua rotasi). langkah ini dilakukan hanya selama pembuatan adegan. tidak tahu apakah Anda bisa melakukan hal yang sama atau tidak.
Ali1S232
4
Bisakah Anda memberi kami tangkapan layar dengan beberapa sketsa di atasnya untuk menunjukkan dengan lebih baik apa yang Anda coba lakukan?
AttackingHobo

Jawaban:

1

Ini tutorial / permainan dev blog menyediakan metode yang sangat baik untuk menghasilkan sungai, dan mereka membuat sangat baik. Saya tidak yakin apakah ini dapat diterapkan secara efektif dalam situasi Anda, karena Anda telah mengambil pendekatan yang berbeda (dan memiliki peta berbasis kisi) tetapi tentu saja layak untuk dipertimbangkan.

dlras2
sumber
Bagus sekali.
Tim Holt
1
Lebih detail yang mungkin berguna: Sungai-sungai di proyek itu mengalir dari gunung ke lautan. Volume meningkat ketika mengalir menuruni bukit, dan sungai-sungai yang bergabung bersama menambah volume mereka. Lebar garis pada peta adalah sqrt dari volume. Setiap lokasi di sungai menunjuk ke bawah bukit; garpu di sungai berarti dua atau lebih lokasi menunjuk ke tempat menurun yang sama. Saya pikir ini bisa digunakan pada grid juga.
amitp
0

Satu hal yang bisa Anda lakukan adalah meminta masing-masing simpul menangani sendiri. Buat melewati ketika setelah generasi tetapi sebelum menampilkan dan memberikan masing-masing kuadrat sungai daftar pintu masuk (angka lebih rendah, sungai yang sama) dan keluar (angka lebih tinggi, sungai yang sama).

Dari data ini Anda harus bisa mengetahui di mana pintu masuk dan keluar (menyimpan lokasi relatif mungkin akan membantu) dan Anda dapat dari sana membuat sungai persegi berdasarkan koneksi. Cara paling sederhana untuk melakukan cabang adalah dengan menghubungkan pintu masuk / keluar ke pusat alun-alun.

Representasi grafis ini dapat diambil dengan berbagai cara, dan Anda belum memberikan informasi yang cukup tentang penggunaannya bagi saya untuk merekomendasikannya secara langsung; jadi bukannya saya hanya akan menyebutkan sebuah cara yang melibatkan sistem particleish di mana setiap segmen air mengalir dinamis "menurun".

Mintalah kuadrat akar memulai sejumlah "potongan air" di setiap pintu masuknya dan minta mereka memutuskan secara acak dari pintu keluar yang tersedia saat pembuatan. Ketika menyentuh pintu keluar, muncul satu di ubin masuknya dan kembalikan potongan air ke awal kotak itu. Karena sudah muncul ke dalam kotak berikutnya (hanya lakukan ini sekali per potong dalam satu kotak), dan Anda sudah tahu pengaturan dan perhitungan (jangan mengacak ulang), Anda dapat membiarkan potongan ini di dalam kotak dengan sangat sedikit perhitungan, dan jika Anda mau, kemungkinan menggunakan shader.

Ini memiliki keuntungan juga membiarkan sungai Anda pergi ke sungai kecil setelah cabang, dan dua sungai yang dihasilkan tidak harus memiliki ukuran yang sama. Butuh beberapa saat bagi sungai untuk mengisi penuh dari atas ke bawah, tetapi efek yang dihasilkan harus agak menyenangkan karena Anda bisa berakhir dengan sesuatu seperti ini hanya berdasarkan pada simpul yang memiliki sungai.

10--10--6--6--2--2
    |      |     
    4--4   4
       |   |
       4---6--6--6
       |  
       2

Itu juga, tergantung pada seed dan kode, memiliki potensi untuk terlihat berbeda setiap kali Anda menjalankannya, bahkan jika penempatan node sama.

Semoga contoh ini ada di suatu tempat di sepanjang garis yang Anda cari.

Lunin
sumber