Я хотел бы улучшить мой маленький игровой движок с помощью приятной на вид симуляции воды Чтобы начать работать над этим, мне нужно найти правильный способ представления воды в игре. К сожалению, я не знаю много разных представлений, поэтому я спрошу вас. Есть похожий вопрос, который я задал некоторое время назад. Но поскольку я не сформулировал проблему четко, ответ правильный, но не тот, который я искал.
В некоторых играх вода определяется только уровнем высоты. Например, все под нулевой высотой находится под водой. Я видел это представление в (в основном старых) играх. Проблема в том, что мне нужны пещеры в открытом мире, которые не затоплены и имеют разные уровни воды для каждого озера и моря.
Другим, более точным, представлением появления воды являются частицы. Каждая капля воды хранится как точка в мировом пространстве. Для их рендеринга я мог бы использовать такие приемы, как метаболлы, чтобы они создавали одну сетку. Это представление было бы здорово для реализма, так как я мог легко рассчитать динамику среди них. К сожалению, ни одна машина не может рассчитать океан метаболов в реальном времени.
Существуют ли другие способы представления воды в двигателе? Я хотел бы иметь динамические озера, поэтому определение акватории по статической геометрии не вариант. Например, если игрок изменяет местность, чтобы расширить озеро, вода должна заполнить этот залив, а общий уровень воды в этом озере должен немного снизиться.
источник
Ответы:
Я не могу сказать, что обычно используется, но моей первой мыслью было бы использовать систему частиц с частицами разного размера, представляющими воду разных объемов. Верх воды будет использовать более мелкие частицы для формирования волнистости поверхности и волн, вода, ближайшая к игроку, будет использовать мельчайшие частицы для имитации брызг и небольших волн, в то время как чем дальше или глубже будет вода, тем больше частицы , Это позволило бы получить динамическое число частиц, имитирующих воду любого размера, динамику воды при ее изменении и некоторый разумный и контролируемый уровень производительности.
Я вижу проблемы с этой реализацией, но, безусловно, это выглядит как относительно простое и «достаточно хорошее» решение, которое зритель / игрок вряд ли когда-либо заметит отклонения в симуляции.
источник
Если вы использовали ландшафт на основе вокселей, вы могли бы, в дополнение к сохранению плотности грунта на воксель, также хранить значение воды, которое ограничено между
0
и1 - groundDensity
. Рисовать воду было бы так же просто, как запустить марширующие кубы, проходящие по значениям воды. Имитация воды будет немного сложнее, но основная предпосылка заключается в том, что вы хотите решить систему так, чтобы:groundDensity + waterDensity
, как и ее соседиИдеальный алгоритм должен выполняться в вычислительном шейдере, по одному пути выполнения на воксел. Если вы хотите получить фантазию, вы можете также сохранить скорость воды в этом вокселе для дополнительных эффектов моделирования: например, пытаясь распределить количество воды, пропорциональное скорости, по ячейкам, «указанным» вектором скорости. Эти данные о скорости также могут быть использованы для перемещения волн, рисования порогов и т. Д.
источник