Как я могу определить области, заполненные водой?

9

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

В некоторых играх вода определяется только уровнем высоты. Например, все под нулевой высотой находится под водой. Я видел это представление в (в основном старых) играх. Проблема в том, что мне нужны пещеры в открытом мире, которые не затоплены и имеют разные уровни воды для каждого озера и моря.

Другим, более точным, представлением появления воды являются частицы. Каждая капля воды хранится как точка в мировом пространстве. Для их рендеринга я мог бы использовать такие приемы, как метаболлы, чтобы они создавали одну сетку. Это представление было бы здорово для реализма, так как я мог легко рассчитать динамику среди них. К сожалению, ни одна машина не может рассчитать океан метаболов в реальном времени.

Существуют ли другие способы представления воды в двигателе? Я хотел бы иметь динамические озера, поэтому определение акватории по статической геометрии не вариант. Например, если игрок изменяет местность, чтобы расширить озеро, вода должна заполнить этот залив, а общий уровень воды в этом озере должен немного снизиться.

Данияр
источник
2
Как ваша местность организована в двигателе? Существуют разные методы для вокселей, карты высот и полисупа (сетки).
Exilyth
Он задается как сетка, и вода не должна торговать этой сеткой ландшафта иначе, чем другие статические сетки.
Данияр
1
торговать или лечить?
Том Блю Пиддок
1
Есть несколько очень хороших демонстраций такого подхода к метаболу, но я не вижу его применимым в любой реальной игре, которая не полностью сосредоточена на том факте, что симуляция воды в какой-то момент физически правдоподобна. Я не вижу причины против только меша, это также не должно быть проблемой, чтобы он приспосабливался к окружению или даже генерировал его на основе некоторого физического моделирования. Но это то, что вы хотите сделать, только если это действительно необходимо. В качестве эталона для полуреалистичной симуляции воды вы можете выбрать «From Dust».
Слин
1
Решением с переменным размером было решение проблемы «океана метаболов». Кроме того, конечно, будут ограничения на размер в зависимости от объема, так как это средство оптимизации производительности, а не изменения объема воды. Просто добавьте особое внимание, например, близость к игроку и поверхности, для областей, нуждающихся в деталях, таких как водопады, притоки, берега или ручьи.
Attackfarm

Ответы:

3

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

Я вижу проблемы с этой реализацией, но, безусловно, это выглядит как относительно простое и «достаточно хорошее» решение, которое зритель / игрок вряд ли когда-либо заметит отклонения в симуляции.

Attackfarm
источник
2

Если вы использовали ландшафт на основе вокселей, вы могли бы, в дополнение к сохранению плотности грунта на воксель, также хранить значение воды, которое ограничено между 0и 1 - groundDensity. Рисовать воду было бы так же просто, как запустить марширующие кубы, проходящие по значениям воды. Имитация воды будет немного сложнее, но основная предпосылка заключается в том, что вы хотите решить систему так, чтобы:

  1. Вода под поверхностью должна заполнять оставшуюся часть вокселя
  2. Поверхностная вода должна иметь такую ​​же общую плотность groundDensity + waterDensity, как и ее соседи
  3. Вода может быть вытеснена на любой воксель, непосредственно примыкающий к нему и расположенный под ним, при условии, что общая плотность соседа меньше его общей плотности

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

jmegaffin
источник
К сожалению, у меня нет воксельной местности, как указано в комментариях к вопросу. Спасибо, в любом случае.
Данияр