Bagaimana saya bisa mendefinisikan area yang diisi air?

9

Saya ingin meningkatkan mesin gim kecil saya dengan simulasi air yang terlihat bagus. Untuk mulai bekerja pada itu saya perlu menemukan cara yang tepat untuk mewakili air dalam permainan. Sayangnya saya tidak tahu representasi yang jauh berbeda, jadi saya akan bertanya kepada Anda. Ada pertanyaan serupa yang saya tanyakan beberapa waktu lalu. Tetapi karena saya belum merumuskan masalah dengan jelas, jawabannya benar tetapi tidak apa yang saya cari.

Dalam beberapa permainan, air hanya ditentukan oleh level ketinggian. Misalnya segala sesuatu di bawah ketinggian nol adalah di bawah air. Saya melihat representasi ini di game (kebanyakan lebih tua). Masalahnya adalah saya suka gua di dunia luar yang tidak banjir dan ketinggian air yang berbeda untuk setiap danau dan laut.

Representasi lain yang lebih tepat dari terjadinya air adalah partikel. Setiap tetesan air disimpan sebagai titik di ruang dunia. Untuk membuat mereka, saya bisa menggunakan teknik seperti metaballs sehingga mereka membangun satu jala tunggal. Representasi ini akan bagus untuk realisme karena saya dapat dengan mudah menghitung dinamika di antara mereka. Sayangnya tidak ada mesin yang bisa menghitung samudera metaballs secara real time.

Apakah ada cara lain untuk merepresentasikan air dalam mesin? Saya ingin memiliki danau yang dinamis, jadi mendefinisikan area air dengan geometri statis bukanlah pilihan. Sebagai contoh jika pemain memodifikasi medan untuk memperluas danau, air harus mengisi teluk itu dan tingkat air keseluruhan danau itu harus sedikit menurun.

danijar
sumber
2
Bagaimana medan Anda diatur dalam mesin? Ada berbagai teknik berbeda untuk medan voxel vs. heightmap vs. polysoup (mesh).
Exilyth
Ini diberikan sebagai jaring dan air tidak boleh berdagang dengan medan yang berbeda dari jaring statis lainnya.
danijar
1
berdagang atau mengobati?
Tom 'Blue' Piddock
1
Ada beberapa demo yang sangat bagus dari pendekatan metaball seperti itu, tapi saya tidak melihatnya bisa digunakan dalam permainan nyata yang tidak sepenuhnya fokus pada kenyataan bahwa simulasi air sampai batas tertentu secara fisik dapat dipercaya. Saya tidak melihat alasan terhadap hanya mesh, itu juga seharusnya tidak menjadi masalah untuk menyesuaikannya dengan sourroundings atau bahkan menghasilkan berdasarkan beberapa simulasi fisik. Tetapi itu adalah sesuatu yang hanya ingin Anda lakukan jika benar-benar dibutuhkan. Sebagai referensi untuk simulasi air semi realistis, Anda mungkin ingin memeriksa "Dari Debu".
Slin
1
Solusi ukuran variabel adalah untuk masalah "lautan metaballs". Selain itu, tentu saja akan ada batasan untuk varian ukuran tergantung pada volume, karena ini merupakan cara untuk mengoptimalkan kinerja, tidak mengubah volume air. Cukup tambahkan pertimbangan khusus, seperti kedekatan dengan pemain dan permukaan, untuk area yang membutuhkan detail seperti air terjun, anak sungai, pantai, atau sungai.
Attackfarm

Jawaban:

3

Saya tidak bisa mengatakan apa yang umum digunakan, tetapi pemikiran pertama saya adalah menggunakan sistem partikel dengan ukuran partikel berbeda-beda yang mewakili air dari berbagai volume. Bagian atas air akan menggunakan partikel yang lebih kecil untuk membentuk gelombang permukaan dan gelombang, air terdekat pemain akan menggunakan partikel terkecil untuk mensimulasikan percikan dan undulasi kecil, sedangkan semakin jauh atau lebih dalam air akan, semakin besar partikel . Ini akan memungkinkan sejumlah partikel dinamis yang mensimulasikan air dalam ukuran apa pun, dinamika air saat ia berubah, dan beberapa tingkat kinerja yang wajar dan terkendali.

Saya dapat melihat masalah dengan implementasi ini, tetapi sepertinya solusi yang relatif sederhana dan "cukup baik" sehingga penonton / pemain akan ragu untuk melihat penyimpangan dalam simulasi.

Attackfarm
sumber
2

Jika Anda menggunakan medan berbasis voxel, Anda bisa, selain menyimpan kepadatan tanah per voxel, Anda juga bisa menyimpan nilai air yang dijepit antara 0dan 1 - groundDensity. Menggambar air akan sesederhana menjalankan kubus pawai melewati nilai air. Mensimulasikan air akan sedikit lebih sulit, tetapi premis dasarnya adalah Anda ingin menyelesaikan sistem sedemikian rupa sehingga:

  1. Air di bawah permukaan harus mengisi sisa voxel
  2. Air permukaan-level harus memiliki kepadatan total yang sama groundDensity + waterDensity, seperti tetangganya
  3. Air dapat dipindahkan ke voxel yang berbatasan langsung dan di bawahnya, asalkan kepadatan total tetangga kurang dari total densitasnya

Algoritma ideal akan berjalan dalam penghitung komputasi, satu jalur eksekusi per voxel. Jika Anda ingin menjadi mewah, Anda juga bisa menyimpan kecepatan air di dalam voxel itu untuk efek simulasi tambahan: misalnya, mencoba mendistribusikan sejumlah air yang sebanding dengan kecepatan ke sel-sel yang "menunjuk" oleh vektor kecepatan. Data kecepatan ini juga dapat digunakan untuk menggerakkan ombak, menggambar jeram, dll.

jmegaffin
sumber
Sayangnya saya tidak memiliki medan voxel, seperti yang ditunjukkan dalam komentar di bawah pertanyaan. Bagaimanapun, terima kasih.
danijar