Hidrologi prosedural: simulasi dinamis sungai dan danau

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{
  
  //... constructors

  int index;                         //Flat Array Index
  glm::vec2 pos;                     //2D Position
  glm::vec2 speed = glm::vec2(0.0);
  double volume = 1.0;
  double sediment = 0.0;

  //... parameters
  const double volumeFactor = 100.0; //"Water Deposition Rate"

  //Hydrological Cycle Functions
  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; //Initial Position
    int ind = ipos.x*dim.y+ipos.y; //Flat Array Index

    //Register Position
    track[ind] = true;

    //...
  }
};

Seperangkat parameter dimodifikasi oleh flow dan pool map:

//...
  //Effective Parameter Set
  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:

//... nind is the next position after moving the particle
  
  //Out-Of-Bounds
  if(!glm::all(glm::greaterThanEqual(pos, glm::vec2(0))) ||
     !glm::all(glm::lessThan((glm::ivec2)pos, dim))){
       volume = 0.0;
       break;
  }

  //Slow-Down
  if(stream[nind] > 0.5 && length(acc) < 0.01)
    break;

  //Enter Pool
  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];  //Testing Plane
  double initialplane = plane;                 //Water Level

  //Flood Set
  std::vector<int> set;
  int fail = 10; //Just in case...

  //Iterate while particle still has volume
  while(volume > minVol && fail){

    set.clear();
    bool tried[dim.x*dim.y] = {false};

    //Lowest Drain
    int drain;
    bool drainfound = false;

    //Recursive Flood-Fill Function
    std::function<void(int)> fill = [&](int i){

      //Out of Bounds
      if(i/dim.y >= dim.x || i/dim.y < 0) return;
      if(i%dim.y >= dim.y || i%dim.y < 0) return;

      //Position has been tried
      if(tried[i]) return;
      tried[i] = true;

      //Wall / Boundary of the Pool
      if(plane < height[i] + pool[i]) return;

      //Drainage Point
      if(initialplane > height[i] + pool[i]){

        //No Drain yet
        if(!drainfound)
          drain = i;

        //Lower Drain
        else if( pool[drain] + height[drain] < pool[i] + height[i] )
          drain = i;

        drainfound = true;
        return; //No need to flood from here
      }

      //Part of the Pool
      set.push_back(i);
      fill(i+dim.y);    //Fill Neighbors
      fill(i-dim.y);
      fill(i+1);
      fill(i-1);
      fill(i+dim.y+1);  //Diagonals (Improves Drainage)
      fill(i-dim.y-1);
      fill(i+dim.y-1);
      fill(i-dim.y+1);
    };

    //Perform Flood
    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.

    //...

    //Drainage Point
    if(drainfound){

      //Set the Particle Position
      pos = glm::vec2(drain/dim.y, drain%dim.y);

      //Set the New Waterlevel (Slowly)
      double drainage = 0.001;
      plane = (1.0-drainage)*initialplane + drainage*(height[drain] + pool[drain]);

      //Compute the New Height
      for(auto& s: set) //Iterate over Set
        pool[s] = (plane > height[s])?(plane-height[s]):0.0;

      //Remove some sediment
      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.

    //...

    //Get Volume under Plane
    double tVol = 0.0;
    for(auto& s: set)
      tVol += volumeFactor*(plane - (height[s]+pool[s]));

    //We can partially fill this volume
    if(tVol <= volume && initialplane < plane){

      //Raise water level to plane height
      for(auto& s: set)
        pool[s] = plane - height[s];

      //Adjust Drop Volume
      volume -= tVol;
      tVol = 0.0;
    }

    //Plane was too high and we couldn't fill it
    else fail--;

    //Adjust Planes
    float approach = 0.5;
    initialplane = (plane > initialplane)?plane:initialplane;
    plane += approach*(volume-tVol)/(double)set.size()/volumeFactor;
  }

  //Couldn't place the volume (for some reason)- so ignore this drop.
  if(fail == 0)
    volume = 0.0;

} //End of Flood Algorithm

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();            //Initialize
  void erode(int cycles);     //Erode with N Particles

  //...

  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:

//...

//Spawn Particle
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){

  //Track the Movement of all Particles
  bool track[dim.x*dim.y] = {false};

  //Simulate N Particles
  for(int i = 0; i < N; i++){
   
    //... simulate individual particle

  }

  //Update Path
  double lrate = 0.01;  //Adaptation Rate
  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.

//... descend function
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 dasar


Render elevasi sistem gabungan


Render topografi suatu sistem dengan pohon

Pengamatan 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 dasar


Peta hidrologi dari sistem gabungan


Peta hidrologis sistem dengan pohon

Catatan: 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.

All Articles