Catatan: kode sumber lengkap proyek ini diposting di Github [di sini ]. Repositori juga berisi informasi terperinci tentang cara membaca dan menggunakan kode.
Setelah menerapkan simulasi erosi hidrolik berbasis partikel, saya memutuskan bahwa akan mungkin untuk memperluas konsep ini untuk mensimulasikan aspek lain dari hidrologi permukaan.Saya meneliti metode yang ada tentang pembuatan prosedural sungai dan danau, tetapi hasil yang ditemukan tidak cocok untuk saya.Tujuan utama dari banyak metode adalah untuk menciptakan sistem sungai (sangat indah) menggunakan berbagai algoritma (kadang-kadang didasarkan pada peta ketinggian yang dibuat sebelumnya atau masalah terbalik), tetapi mereka tidak memiliki hubungan realistis yang kuat antara topografi dan hidrologi.Selain itu, pemrosesan model air pada relief secara keseluruhan dipertimbangkan pada beberapa sumber daya dan simulasi cairan yang sangat kompleks digunakan.Pada artikel ini, saya akan menunjukkan upaya saya untuk mengatasi masalah ini dengan teknik yang memperluas kemampuan untuk mensimulasikan erosi hidrolik berbasis partikel. Saya juga akan menjelaskan bagaimana, secara umum, saya memecahkan masalah “air pada relief”.Dalam metode saya, saya berusaha untuk kesederhanaan dan untuk realisme dengan biaya sedikit peningkatan kompleksitas sistem erosi yang mendasarinya. Saya merekomendasikan membaca artikel saya sebelumnya tentang sistem ini [di sini , terjemahan pada Habré], karena model baru didasarkan pada itu. Sistem ini mampu dengan cepat menghasilkan medan yang tampak sangat realistis dengan hidrologi. Video ini dibuat secara real time. Sistem ini mampu menghasilkan lanskap seperti itu dalam jumlah tak terbatas.Penjelasan: Saya bukan ahli geologi, jadi saya menciptakan sistem berdasarkan pengetahuan saya.
Konsep hidrologi
Saya ingin membuat sistem generatif yang dapat mensimulasikan banyak fenomena geografis, termasuk:- Migrasi sungai dan aliran
- Air terjun alami
- Formasi Ngarai
- Pembengkakan tanah dan dataran banjir
Akibatnya, sistem hidrologi dan topografi harus dinamis dan terkait erat. Sistem erosi hidrolik berbasis partikel telah memiliki aspek dasar yang diperlukan untuk ini:- Relief mempengaruhi pergerakan air
- Erosi dan sedimentasi mempengaruhi medan
Bahkan, sistem ini mensimulasikan erosi yang disebabkan oleh hujan, tetapi tidak mampu menyampaikan banyak pengaruh lain:- Dalam aliran yang bergerak , air berperilaku berbeda.
- Di kolam berdiri , air berperilaku berbeda
Catatan: Saya akan sering menyebutkan aliran dan kolam . Asumsi dibuat dalam model bahwa ini adalah fenomena skala besar dua dimensi. Mereka sangat mengurangi kompleksitas model.Sebagian besar fenomena geografis di atas dapat disampaikan dengan menggunakan model aliran dan cekungan. Idealnya, mereka harus meminjam dan meningkatkan realisme sistem berbasis partikel.Model hidrologi yang disederhanakan
Menyimpan informasi tentang aliran dan kumpulan dalam satu atau lebih struktur data (grafik, objek, dll.) Terlalu rumit dan membatasi kemampuan kami.Oleh karena itu, model hidrologi kami terdiri dari dua peta: peta aliran dan peta wilayah sungai .Catatan: jangan lupa bahwa mereka dimodelkan sebagai sistem 2D.
Stream dan Pool Map
Peta aliran menggambarkan air yang mengalir di permukaan (aliran dan sungai). Ini menyimpan posisi partikel rata-rata waktu di peta. Informasi lama perlahan-lahan dihapus.Peta cekungan menggambarkan air yang masih ada di permukaan (genangan, kolam, danau, lautan). Ini menyimpan kedalaman air di posisi yang sesuai dari peta.Catatan: peta aliran dan kumpulan adalah array dengan ukuran yang sama dengan peta ketinggian.
Relief dengan dampak hidrologis. Lapisan air di render diambil dari peta hidrologi.Peta hidrologi gabungan. Biru muda adalah peta aliran, biru tua adalah peta kolam renang.Peta-peta ini dihasilkan dan dihubungkan oleh partikel-partikel air yang bergerak di sepanjang medan. Menambahkan peta hidrologi ini juga memberi kita informasi independen waktu yang memungkinkan interaksi partikel dengan simulasi mereka secara terpisah. Partikel dapat berinteraksi melalui penggunaan kartu-kartu ini untuk mendapatkan parameter yang memengaruhi pergerakannya.Catatan: peta aliran ditampilkan setelah melewati fungsi easy-in-out dan diberikan pada medan berdasarkan ini. Untuk mendapatkan aliran yang lebih halus / lebih tajam (atau mengabaikan nilai yang lebih rendah pada bidang datar lebar), tampilan ini dapat dimodifikasi atau menetapkan nilai ambang batas untuknya.Air sebagai partikel
Air disajikan dalam bentuk massa diskrit ("partikel") yang memiliki volume dan bergerak di sepanjang permukaan relief. Ini memiliki beberapa parameter yang mempengaruhi gerakannya (gesekan, laju penguapan, laju pengendapan, dll.).Ini adalah struktur data dasar yang digunakan untuk mensimulasikan hidrologi. Partikel tidak disimpan , tetapi hanya digunakan untuk interaksi antara peta ketinggian, aliran dan genangan.Catatan: konsep partikel dijelaskan secara lebih rinci dalam posting sebelumnya [ terjemahan tentang Habré] (dan jumlah sumber daya lainnya yang tak terbatas).Siklus hidrologi dan interaksi peta
Peta berinteraksi satu sama lain melalui siklus hidrologi. Siklus hidrologi terdiri dari langkah-langkah berikut:- Membuat partikel di medan
- (.. ).
- , .
- , .
- , ( ) .
- .
Di seluruh sistem, hanya ada dua algoritma: Turun (turun) dan Banjir (banjir) . Partikel-partikel yang turun mengubah peta aliran, dan partikel-partikel banjir mengubah peta cekungan. Algoritma ini dijelaskan secara rinci di bawah ini.Diagram satu dimensi dari model hidrologi. Partikel dibuat di medan dan diproses secara siklik dengan dua algoritma: Turun dan Banjir. Dalam prosesnya, peta cekungan dan aliran berubah, pada gilirannya mempengaruhi pergerakan partikel.Penerapan
Di bawah ini saya akan menjelaskan implementasi penuh dari sistem yang digunakan untuk menghasilkan hasil, dan menyajikan contoh kode.Catatan: Saya hanya akan menampilkan potongan kode yang relevan. Informasi lebih lanjut dapat ditemukan di repositori di Github. Semua bagian kode yang relevan ada di file “water.h”.Kelas partikel
Struktur partikel Drop identik dengan struktur sistem sebelumnya. Turun dan banjir sekarang menjadi anggota struktur karena mereka bertindak hanya pada satu partikel pada satu waktu.struct Drop{
int index;
glm::vec2 pos;
glm::vec2 speed = glm::vec2(0.0);
double volume = 1.0;
double sediment = 0.0;
const double volumeFactor = 100.0;
void descend(double* h, double* stream, double* pool, bool* track, glm::ivec2 dim, double scale);
void flood(double* h, double* pool, glm::ivec2 dim);
};
Parameter tambahan adalah faktor volume, yang menentukan bagaimana banjir mentransfer volume ke permukaan air.Algoritma keturunan
Algoritma keturunan hampir sama dengan algoritma erosi partikel sederhana. Dia menerima “track” input tambahan - sebuah array di mana dia menulis semua posisi yang dikunjungi olehnya. Diperlukan larik untuk membangun peta aliran di masa depan.void Drop::descend(double* h, double* stream, double* pool, bool* track, glm::ivec2 dim, double scale){
glm::ivec2 ipos;
while(volume > minVol){
ipos = pos;
int ind = ipos.x*dim.y+ipos.y;
track[ind] = true;
}
};
Seperangkat parameter dimodifikasi oleh flow dan pool map:
double effD = depositionRate;
double effF = friction*(1.0-0.5*stream[ind]);
double effR = evapRate*(1.0-0.2*stream[ind]);
Catatan: Saya menemukan bahwa perubahan parameter seperti itu berfungsi dengan baik.
Dalam sistem sebelumnya, partikel bisa keluar dari siklus ini dan dihancurkan hanya dengan penguapan total atau melampaui batas lega. Sekarang dua kondisi keluar tambahan telah ditambahkan di sini:
if(!glm::all(glm::greaterThanEqual(pos, glm::vec2(0))) ||
!glm::all(glm::lessThan((glm::ivec2)pos, dim))){
volume = 0.0;
break;
}
if(stream[nind] > 0.5 && length(acc) < 0.01)
break;
if(pool[nind] > 0.0)
break;
Jika partikel tidak memiliki akselerasi yang cukup dan dikelilingi oleh partikel lain, atau langsung memasuki kolam, maka ia secara prematur melengkapi keturunan dengan semua volume yang tersisa dan melanjutkan ke algoritma flooding.Catatan: kondisi overflow juga mengatur ulang volume sehingga partikel tidak mengarah ke algoritma flooding.
Algoritma banjir
Sebuah partikel dengan volume yang tersisa dapat membanjiri dari posisi saat ini. Ini terjadi jika berhenti turun (tidak ada akselerasi) atau memasuki kumpulan yang ada.Algoritma flooding mentransfer volume partikel ke permukaan air yang meningkat, mengubah peta cekungan. Teknik ini adalah untuk meningkatkan permukaan air secara bertahap dengan sebagian kecil dari volume partikel menggunakan "bidang uji". Saat permukaan air naik, volume partikel menurun.Animasi algoritma banjir. Bidang uji dan level air meningkat secara bertahap, mengurangi volume partikel. Jika kebocoran ditemukan, maka volume yang tersisa bergerak ke titik kebocoran untuk melakukan penurunan.Pada setiap langkah, kami melakukan pengisian banjir dari posisi partikel (yaitu, secara rekursif memeriksa posisi tetangga), menambahkan semua posisi yang terletak di atas bidang asli (level air saat ini) dan di bawah bidang uji ke "set banjir". Ini adalah area relief yang merupakan bagian dari kolam.Saat mengisi, kami memeriksa kebocoran. Ini adalah titik-titik dari rangkaian banjir yang berada di bawah bidang uji DAN dari bidang asli. Jika kami menemukan beberapa titik kebocoran, kami memilih yang terendah.void Drop::flood(double* height, double* pool, glm::ivec2 dim){
index = (int)pos.x*dim.y + (int)pos.y;
double plane = height[index] + pool[index];
double initialplane = plane;
std::vector<int> set;
int fail = 10;
while(volume > minVol && fail){
set.clear();
bool tried[dim.x*dim.y] = {false};
int drain;
bool drainfound = false;
std::function<void(int)> fill = [&](int i){
if(i/dim.y >= dim.x || i/dim.y < 0) return;
if(i%dim.y >= dim.y || i%dim.y < 0) return;
if(tried[i]) return;
tried[i] = true;
if(plane < height[i] + pool[i]) return;
if(initialplane > height[i] + pool[i]){
if(!drainfound)
drain = i;
else if( pool[drain] + height[drain] < pool[i] + height[i] )
drain = i;
drainfound = true;
return;
}
set.push_back(i);
fill(i+dim.y);
fill(i-dim.y);
fill(i+1);
fill(i-1);
fill(i+dim.y+1);
fill(i-dim.y-1);
fill(i+dim.y-1);
fill(i-dim.y+1);
};
fill(index);
Catatan: untuk kesederhanaan, algoritma pengisian delapan arah digunakan di sini . Di masa depan, dimungkinkan untuk mengimplementasikannya dengan lebih efisien.
Setelah mengidentifikasi banyak titik banjir dan kebocoran, kami mengubah ketinggian air dan peta kolam.Jika titik kebocoran ditemukan, kami memindahkan partikel (dan volumenya "meluap") ke titik kebocoran sehingga dapat mulai turun lagi. Kemudian ketinggian air turun ke ketinggian titik kebocoran.
if(drainfound){
pos = glm::vec2(drain/dim.y, drain%dim.y);
double drainage = 0.001;
plane = (1.0-drainage)*initialplane + drainage*(height[drain] + pool[drain]);
for(auto& s: set)
pool[s] = (plane > height[s])?(plane-height[s]):0.0;
sediment *= 0.1;
break;
}
Catatan: ketika ketinggian air berkurang karena kebocoran, saya menemukan bahwa ini bekerja paling baik dengan tingkat kebocoran yang rendah. Selain itu, menghilangkan bagian dari batuan sedimen membantu implementasi.
Karena ini, partikel-partikel baru yang memasuki kolam yang diisi secara instan memindahkan volumenya ke titik kebocoran, karena menambahkan volume ke kolam tersebut akan memindahkan volume yang sama dari itu.Jika titik kebocoran tidak ditemukan, maka kami menghitung volume di bawah bidang uji dan membandingkannya dengan volume partikel. Jika kurang, maka kami menghapus volume dari partikel dan menyesuaikan level air. Kemudian bidang uji naik. Jika lebih besar, maka bidang uji diturunkan. Proses ini diulang sampai partikel kehabisan ruang atau titik kebocoran ditemukan.
double tVol = 0.0;
for(auto& s: set)
tVol += volumeFactor*(plane - (height[s]+pool[s]));
if(tVol <= volume && initialplane < plane){
for(auto& s: set)
pool[s] = plane - height[s];
volume -= tVol;
tVol = 0.0;
}
else fail--;
float approach = 0.5;
initialplane = (plane > initialplane)?plane:initialplane;
plane += approach*(volume-tVol)/(double)set.size()/volumeFactor;
}
if(fail == 0)
volume = 0.0;
}
Ketinggian bidang pesawat disesuaikan secara proporsional dengan perbedaan volume yang diukur oleh luas permukaan kolam (mis., Berdasarkan ukuran set). Dengan menggunakan koefisien kedekatan, Anda dapat meningkatkan stabilitas cara pesawat mencapai ketinggian air yang benar.Bungkus erosi
Kelas dunia berisi ketiga peta dalam bentuk array biasa:class World {
public:
void generate();
void erode(int cycles);
double heightmap[256*256] = {0.0};
double waterstream[256*256] = {0.0};
double waterpool[256*256] = {0.0};
};
Catatan: Peta ketinggian diinisialisasi menggunakan noise Perlin.
Setiap langkah hidrologi untuk partikel individu terdiri dari yang berikut:
glm::vec2 newpos = glm::vec2(rand()%(int)dim.x, rand()%(int)dim.y);
Drop drop(newpos);
int spill = 5;
while(drop.volume > drop.minVol && spill != 0){
drop.descend(heightmap, waterstream, waterpool, track, dim, scale);
if(drop.volume > drop.minVol)
drop.flood(heightmap, waterpool, dim);
spill--;
}
Parameter tumpahan menentukan berapa kali sebuah partikel dapat memasuki kolam dan meninggalkannya lagi sebelum dihancurkan. Jika tidak, partikel-partikel mati ketika volumenya habis.Catatan: partikel jarang memasuki kolam dan meninggalkannya lebih dari satu atau dua kali sebelum benar-benar menguap selama tahap penurunan, tetapi saya menambahkan ini untuk berjaga-jaga.
Fungsi erosi membungkus kode ini dan melakukan langkah-langkah hidrologi untuk partikel N, secara langsung mengubah peta aliran:void World::erode(int N){
bool track[dim.x*dim.y] = {false};
for(int i = 0; i < N; i++){
}
double lrate = 0.01;
for(int i = 0; i < dim.x*dim.y; i++)
waterstream[i] = (1.0-lrate)*waterstream[i] + lrate*((track[i])?1.0:0.0);
}
Di sini larik lintasan diteruskan ke fungsi keturunan. Saya menemukan bahwa secara bersamaan melacak pergerakan beberapa partikel dan perubahan yang sesuai memberikan hasil yang lebih baik untuk peta aliran. Tingkat adaptasi menentukan seberapa cepat informasi lama dihapus.Pohon
Hanya untuk bersenang-senang, saya menambahkan pohon untuk melihat apakah simulasi erosi dapat lebih ditingkatkan. Mereka disimpan di kelas dunia sebagai vektor.Pohon dibuat secara acak pada peta di tempat-tempat di mana tidak ada kolam dan aliran yang kuat, dan medannya tidak terlalu curam. Mereka juga memiliki kesempatan untuk membuat pohon tambahan di sekitar mereka.Dalam proses menciptakan pohon, mereka menulis ke peta kerapatan vegetasi dalam radius tertentu di sekitarnya. Kepadatan vegetasi yang tinggi mengurangi transfer massa antara partikel yang turun dan topografi. Ini untuk mensimulasikan bagaimana akar menahan tanah di tempatnya.
double effD = depositionRate*max(0.0, 1.0-treedensity[ind]);
Pohon mati jika berada di kolam, atau aliran di bawahnya terlalu kuat. Selain itu, mereka memiliki probabilitas kematian acak. Berkat peta yang teduh dan normal, bahkan sprite pohon yang sangat sederhana membuat relief lebih indah.Catatan: model pohon dapat ditemukan di file "vegetation.h" dan dalam fungsi "World :: grow ()".
Detail lainnya
Hasilnya divisualisasikan menggunakan pembungkus OpenGL buatan sendiri, yang ditata [di sini ].hasil
Partikel dapat dibuat di peta sesuai dengan distribusi yang Anda butuhkan. Dalam demo saya, saya membuatnya dengan distribusi seragam pada 256 × 256 kartu.Seperti dapat dilihat di bawah, simulasi yang dihasilkan sangat tergantung pada pilihan bantuan asli. Sistem ini mampu mensimulasikan sejumlah besar fenomena alam. Saya tidak bisa hanya mendapatkan ngarai secara memadai. Mereka mungkin membutuhkan simulasi yang sangat panjang dan lambat.Fenomena lain dapat diamati dalam sistem, seperti air terjun, tortuosity dan delta sungai, danau, pembengkakan tanah, dan sebagainya.Sistem ini juga sangat baik dalam mendistribusikan aliran dan genangan di tempat-tempat di mana banyak hujan menumpuk, dan tidak di tempat-tempat acak. Oleh karena itu, hidrologi yang dihasilkan terkait erat dengan medan. Simulasi hidrologi waktu nyata pada kisi 256 × 256. Relief asli relatif halus, yang memungkinkan aliran muncul dengan cepat. Pada awalnya, orang dapat mengamati penciptaan kolam dan kebocoran paling sederhana, setelah itu aliran besar muncul dan tetap.Perbandingan efek dari penyempitan aliran
Untuk membandingkan perbedaan yang dibuat dengan menghubungkan peta ke sistem erosi, Anda dapat mensimulasikan hidrologi pada peta yang sama, termasuk dan menonaktifkan berbagai efek.Saya mensimulasikan medan yang sama tiga kali:- Erosi berbasis partikel (erosi dasar) yang menerima peta aliran dan genangan. Kolam masih mempengaruhi generasi
- Erosi dasar dengan parameter diubah oleh peta hidrologi (dalam kombinasi dengan erosi)
- Erosi gabungan dengan parameter diubah oleh peta hidrologi dan memengaruhi erosi oleh pohon
Catatan: ini adalah sistem yang agak kacau, dan jenis hidrologi yang muncul sangat tergantung pada medan. Sulit untuk menemukan contoh bantuan yang "sangat terbuka".Render bantuan dari sistem dasarRender elevasi sistem gabunganRender topografi suatu sistem dengan pohonPengamatan yang menarik: menggabungkan peta hidrologi dengan parameter partikel sebenarnya mempersempit dasar sungai. Khususnya di daerah planar, partikel kurang terdistribusi dan bergabung menjadi sejumlah kecil aliran kuat.Mengurangi gesekan dan penguapan berhasil mengatasi kenyataan bahwa partikel mulai lebih menyukai saluran yang sudah ada.Efek lain lebih terlihat dengan pengamatan langsung pada relief.Peta hidrologi dari sistem dasarPeta hidrologi dari sistem gabunganPeta hidrologis sistem dengan pohonCatatan: hasil ini dihasilkan tepat 60 detik dari waktu simulasi.Pohon juga mempengaruhi penyempitan. Mereka meningkatkan proses memotong jalur yang jelas di daerah curam. Mereka memaksa sungai untuk tetap berada di saluran yang sudah diletakkan, dan karena itu mengurangi tortuosity. Dengan demikian, lokasi pohon mempengaruhi pergerakan air. Contoh mencatat bagaimana lokasi pohon dapat membantu menjaga lokasi aliran. Ini adalah bantuan yang sama seperti sebelumnya, dengan semua efek yang diaktifkan.Dampak Kolam
Sistem untuk menciptakan kolam bekerja dengan baik dan memungkinkan beberapa badan air dengan ketinggian berbeda ada pada bantuan yang sama. Mereka juga dapat saling tumpah dan mengosongkan. Contoh video pembentukan kolam pada relief dasar yang lebih kasar dengan perbedaan ketinggian yang besar. Danau bagian atas secara fisik terletak di atas yang lebih rendah dan mengeluarkan air yang dihasilkan langsung ke danau yang lebih rendah.Catatan: Saya mendapatkan beberapa biji, di mana tiga danau mengalir satu sama lain secara berurutan, tetapi saya tidak ingin menghabiskan banyak waktu mencari yang tepat untuk artikel ini. Saya sudah menghasilkan terlalu banyak gambar dan video.
Dari waktu ke waktu, level ketinggian kolam melompat. Saya pikir ini terjadi ketika level air mendekati level kebocoran dan banyak air ditambahkan. Efek ini dapat dikurangi dengan mengurangi tingkat kebocoran pada fungsi banjir.Setelah beberapa menit generasi berikutnya, beberapa kumpulan baru muncul dengan sendirinya.Pada sudut yang lebih curam, perbedaan ketinggian cekungan lebih terlihat.Peta hidrologi jelas menunjukkan bahwa cekungan pusat bergabung ke cekungan bawah.Eksekusi algoritma flooding mengarah pada fakta bahwa pool melihat "dinding" di perbatasan peta. Ini terlihat pada gambar yang ditunjukkan di atas.Peningkatan lain yang mungkin bisa dilakukan adalah penambahan permukaan laut ke dunia sehingga kolam mengamati kebocoran di tepi peta di permukaan laut, jika tidak mereka hanya meluap.Kecepatan simulasi
Waktu setiap langkah penurunan dan banjir bervariasi dari satu partikel ke partikel lainnya, tetapi sekitar satu urutan besarnya tetap (sekitar 1 mikrodetik). Dengan aliran yang stabil, partikel bergerak di sekitar peta dengan lebih cepat.Waktu banjir bervariasi sesuai dengan ukuran kolam, karena operasi penuangan adalah langkah yang paling mahal. Semakin besar kolam, semakin besar area yang Anda butuhkan untuk menaikkan permukaan air. Kolam-kolam besar jelas merupakan penghambat sistem. Jika Anda memiliki ide untuk meningkatkan kecepatan, beri tahu saya.Waktu penurunan bervariasi sesuai dengan ukuran peta dan banyak parameter lainnya, termasuk tingkat gesekan dan penguapan.Semua video dalam artikel ini direkam secara real time, yaitu, secara umum, simulasi berlangsung cepat.Catatan: tak lama setelah publikasi artikel ini, saya membuat sedikit perubahan dalam metode menghitung permukaan normal, yang meningkatkan kecepatan simulasi. Efek dari ini sangat nyata selama simulasi, tetapi sulit untuk membandingkannya karena variasi besar dalam waktu yang dibutuhkan untuk memulai dan membanjiri. Menurut perkiraan saya, kecepatan simulasi telah dua kali lipat.
Video yang lebih indah
Simulasi hidrologi di medan vertikal yang tidak rata. Sedikit lega. Beberapa danau berubah sedikit berfluktuasi sedikit. Simulasi hidrologi di medan yang rata dan rata.Video berikutnya direkam setelah peningkatan kecepatan. Medan yang lebih datar dan lebih halus. Video dengan sungai terbentuk dari beberapa aliran yang terhubung. Sungai utama memiliki dua titik di mana ia menggabungkan aliran yang lebih kecil, dan kami melihat bagaimana ia tumbuh dalam ukuran. Relief yang lebih tidak merata dengan pembentukan sungai.Saya bisa pergi selamanya.Kesimpulan dan kerja untuk masa depan
Teknik sederhana ini masih berbasis partikel, tetapi berhasil mengatur banyak efek tambahan. Ini memberikan cara mudah untuk mensimulasikan pergerakan air skala besar tanpa sepenuhnya mensimulasikan dinamika fluida. Selain itu, ia bekerja dengan model air yang intuitif.Dalam simulasi, kita dapat mengamati munculnya sungai yang berliku, air terjun, danau dan transfusi danau, sungai yang membelah menjadi daerah datar menjadi delta, dll.Akan menarik untuk menambahkan berbagai jenis tanah dalam bentuk peta tanah tempat parameter erosi dapat diambil.Anda juga dapat dengan mudah mengubah sistem pohon untuk membuat berbagai jenis pohon yang menahan tanah di tempatnya.Sulit untuk menyampaikan berbagai hasil yang dihasilkan dalam beberapa gambar dan video, jadi Anda harus mencoba melakukannya sendiri, ternyata sangat menarik. Saya merekomendasikan untuk bereksperimen dengan parameter peta asli, termasuk kebisingan oktaf dan skala peta.Jika Anda memiliki pertanyaan atau komentar, Anda dapat menghubungi saya. Saya bekerja sangat keras pada proyek ini, jadi otak saya menyatu dan saya yakin saya melewatkan beberapa aspek yang menarik.