Ідеї ​​для 2D моделювання води


18

Я шукаю будь-який внесок на моделювання води в 2D, проти досить великого (називаємо його) заблокованого / не заблокованого масиву (розглядається з боку). Я придумав такі ідеї:

Автомати клітини

Зробіть масове паралельне моделювання на процесорі, використовуючи мобільні автомати . З простими правилами, як:

  • Якщо клітина відкрита донизу, перейдіть до неї.
  • Перевірте ліву і праву комірки, виберіть випадкову з двох і перейдіть до неї.

Плюси

  • Простий у виконанні.
  • Значущий / детермінований у багатокористувацькій системі.

Мінуси

  • Напевно, справді повільно.
  • Не переконливо.

Fluid Dynamics на графічному процесорі

Виконайте грубе наближення динаміки рідини на графічному процесорі щодо такої текстури:

+------+-----+-----+-------+
|R     |G    |B    |A      |
+------+-----+-----+-------+
|vX    |vY   |NULL |Density|
+------+-----+-----+-------+

Плюси

  • Напевно, дуже швидко.
  • Може бути досить переконливим.
  • Наступний піксельний шейдер міг би зробити його безпосередньо.

Мінуси

  • Складно реалізувати.
  • Складно налаштувати.
  • Я не можу виділити одну текстуру за розміром мого рівня.
    • Я міг би перекривати ділянки сітки, але це додало б додаткової складності.

Частинки

Використовуйте частинки для імітації води. Під час візуалізації використовуйте добавку для змішування, а потім застосуйте функцію множення до альфа-каналу, щоб надати води чіткі краї.

Плюси

  • Напевно буде виглядати приємно.
  • Легкий у виконанні.
  • Легко відтворити.
  • Має значення в мультиплеєрній системі, хоча для передачі знадобиться зовсім небагато пропускної здатності.

Мінуси

  • Ефекти міжчастинок, ймовірно, будуть повільними (пошук поблизу).
  • Це може призвести до «протікання» води через тверді простори (оскільки об'єм твердого простору невеликий, наприклад, 1 px).
  • Це може призвести до дивних дірок у воді залежно від розміру частинок.
  • Обидва вищесказані можна пом'якшити, дозволяючи частинкам плисти ближче один до одного, ніж їх реальна величина, однак це спричинить проблеми з роботою між частинками та частинками / ландшафтами.

Якісь подальші ідеї?

Примітка: Це наближення, я не шукаю тут фізично правильної води - просто щось, що "досить добре" (бонусні бали за швидку і брудну). Гра багатокористувацька, тому на жаль весь рівень потрібно моделювати постійно.

Відповіді:


12

кожного разу, коли я намагався імітувати воду, я щойно закінчив застосовувати фільтр низьких частот на текстурі, що представляє рівень води. Це дуже просто здійснити, але він не вдається, коли ви отримуєте масштабні зміни рівня води, які можуть генерувати великі хвилі. У цьому методі є місця, де вода завжди має певний постійний рівень, як кінці річки. у цих випадках ви трохи більше потрібного кольору для певного пікселя.

Плюси:

  • простий у виконанні
  • реалістичні результати у випадку спокійних вод
  • швидке обчислення за допомогою GPU
  • легко визначити статичний рівень води або джерела води

Мінуси:

  • не в змозі імітувати хвилі

для хвилястих вод я використовую деякий спосіб, схожий на ваш алгоритм Cell Automata, але з невеликою зміною, яка дозволить мені використовувати шейдери для обчислення наступного кроку від поточної ситуації, ось код sudo, і знову я маю текстуру, що представляє рівень води в кожному колір пікселя:

foreach (pixel p) in oldTexture
{
    newtexture.pixels[p.x,p.y]    += p.color / 5;
    newtexture.pixels[p.x+1,p.y]  += p.color / 5;
    newtexture.pixels[p.x-1,p.y]  += p.color / 5;
    newtexture.pixels[p.x,p.y+1]  += p.color / 5;
    newtexture.pixels[p.x,p.y-1]  += p.color / 5;
}

Цей алгоритм має функції, схожі на попередній, але він краще працює у хвилястих водах, а не в спокійних. це ваш вибір на основі моря, який ви імітуєте, щоб використовувати будь-який з них.

врешті-решт у вас є текстура, яка повідомляє вам рівень води для кожної позиції, на наступному кроці ви повинні якось намалювати результати, найпростішим способом є створення сітки на основі даних про рівень води.


Дякую, це геніальна відповідь. Я залишаю питання відкритим на деякий час довше; але здається, що у мене є хитрощі для того, щоб задати одну відповідь на запитання тут :).
Джонатан Дікінсон

ви також можете змішати ці алгоритми, щоб отримати кращі результати.
Ali1S232

Як щодо скріншота?
ashes999

@ ashes999 У мене немає скріншота, але тут реалізований той же алгоритм! youtube.com/watch?v=avJPrL9UJ28
Ali1S232
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.