Як я можу визначити ділянки, наповнені водою?


9

Я хотів би покращити мій маленький ігровий двигун із симпатичним моделюванням води. Щоб почати працювати над цим, мені потрібно знайти належний спосіб представити воду в грі. На жаль, я не знаю багато різних представлень, тому я вас запитую. Є подібне питання, яке я задав деякий час тому. Але оскільки я не сформулював це питання чітко, відповідь правильна, але не те, що я шукав.

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

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

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


2
Як організована ваша місцевість в двигуні? Існують різні методи для вокселя проти висоти карти проти полісуп (сітчастий) місцевості.
Вихід

Він надається як сітка, і вода не повинна торгувати цією місцевою сіткою інакше, ніж інші статичні сітки.
danijar

1
торгувати чи лікувати?
Том 'Блакитний' Піддок

1
Є дуже хороші демонстрації такого підходу з метаболу, але я не вважаю його корисним у будь-якій реальній грі, яка не повністю орієнтована на те, що імітація води до певного моменту є фізично правдоподібною. Я не бачу причини проти простої сітки, і це не повинно бути проблемою, якщо вона налаштовується на оточення або навіть генерує її на основі фізичного моделювання. Але це те, що ви хочете зробити лише в тому випадку, коли це дійсно потрібно. Як орієнтир для напівреалістичного моделювання води, ви можете поставити прапорець "З пилу".
Слін

1
Рішення зі змінним розміром полягало в проблемі "океан метаболів". Також, звичайно, можуть бути обмеження дисперсії розміру залежно від обсягу, оскільки це засіб оптимізації продуктивності, а не зміна обсягу води. Просто додайте особливу увагу, як близькість до гравця та поверхні, для областей, які потребують деталей, таких як водоспади, притоки, береги чи потоки.
Attackfarm

Відповіді:


3

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

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


2

Якщо ви використовували місцевість на основі вокселів, ви могли б, крім збереження щільності ґрунту на воксель, також зберігати значення води, затиснуте між 0і 1 - groundDensity. Намалювати воду було б так само просто, як біг маршових кубиків переходити над значеннями води. Моделювати воду було б трохи складніше, але основна передумова полягає в тому, що ви хочете вирішити систему таким чином:

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

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


На жаль, у мене немає воксельної місцевості, як вказувалося в коментарях до цього питання. Все одно, дякую.
danijar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.