Идеи для 2D симуляции воды

18

Я ищу любые входные данные по моделированию воды в 2D, относительно довольно большого (назовите это) заблокированного / не заблокированного массива (если смотреть сбоку). Я выдвинул следующие идеи:

Сотовые автоматы

Проведите массовую симуляцию паррала на процессоре, используя клеточные автоматы . С такими простыми правилами, как:

  • Если есть ячейка, открытая снизу, двигайтесь к ней.
  • Проверьте левую и правую ячейки, выберите случайную из двух и перейдите к ней.

Pros

  • Прост в реализации.
  • Значимый / детерминированный в многопользовательской системе.

Cons

  • Вероятно, очень медленно.
  • Не убедительно.

Гидродинамика на графическом процессоре

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

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

Pros

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

Cons

  • Сложно реализовать.
  • Сложно настроить.
  • Я не могу выделить одну текстуру размером моего уровня.
    • Я мог бы перекрывать области сетки, но это добавило бы дополнительную сложность.

Частицы

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

Pros

  • Вероятно, будет хорошо выглядеть.
  • Легко реализовать.
  • Легко сделать.
  • Имеет смысл в многопользовательской системе, хотя для переноса потребуется совсем немного пропускной способности.

Cons

  • Межчастичные эффекты, вероятно, будут медленными (поиск окрестностей).
  • Может привести к «утечке» воды через твердое пространство (потому что твердое пространство мало, например, 1px).
  • Может привести к странным отверстиям в воде в зависимости от размера частиц.
  • Оба вышеперечисленных могут быть смягчены, позволяя частицам дрейфовать ближе друг к другу, чем их реальный размер, однако это вызовет проблемы с характеристиками между частицами и частицами / ландшафтом.

Есть еще идеи?

Примечание: это приблизительное значение, я не ищу здесь физически правильную воду - просто то, что «достаточно хорошо» (бонусные баллы за быстрое и грязное). Игра многопользовательская, поэтому, к сожалению, весь уровень нужно постоянно моделировать.

Джонатан Дикинсон
источник

Ответы:

12

каждый раз, когда я пытался смоделировать воду, я просто применял фильтр низких частот к текстуре, представляющей уровень воды. Его очень просто реализовать, но он терпит неудачу всякий раз, когда вы получаете значительные изменения уровня воды, которые могут генерировать большие волны. В этом методе есть места, где вода всегда имеет постоянный уровень, например, концы рек. в тех случаях вы просто за правильный цвет для этого конкретного пикселя.

Плюсы:

  • легко реализовать
  • реалистичные результаты в случае спокойной воды
  • быстрые вычисления с использованием графического процессора
  • легко определить статический уровень воды или источники воды

Минусы:

  • не в состоянии моделировать волны

для волнистых вод я использую способ, аналогичный алгоритму 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
источник
Спасибо, это блестящий ответ. Я оставлю вопрос открытым еще немного; но похоже, что у меня есть умение задавать один ответ на вопросы здесь :).
Джонатан Дикинсон
Вы также можете смешать эти алгоритмы, чтобы получить лучшие результаты.
Ali1S232
Как насчет скриншота?
ashes999
@ ashes999 У меня нет скриншота, но здесь реализован тот же алгоритм! youtube.com/watch?v=avJPrL9UJ28
Ali1S232