Усі статті
Оновлення продукту · 8 min read

Вода, що поводиться правильно: перший погляд на Numivo Water

Перший погляд на Numivo Water для Unreal Engine, океан, озера, під водою та печери кінематографічної якості, оцінювані за референсними фотографіями, фізично обчислені світло й піна, і плавучість Drop-a-Mesh, що змушує будь-який об'єкт плавати чи тонути без жодного налаштування.

Illustration of a stylised sea with a floating crate and a sinking statue

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

Штормові хвилі, що вибухають об скелястий берег Планка, яку треба взяти. Зауважте, що робить це реальним: піна, народжена з хвиль, що розбиваються, серпанок, що поїдає скелі, статистика баранців по всьому зибу: нічого не розставлено вручну, усе фізика. Ось планка, що ми поставили.

Навіщо ще одна система води?

Більшість ігрової води виглядає чудово рівно в одній умові освітлення, тій, що на скріншоті в магазині. Зсуньте сонце, перемкніться на похмуро, опустіть камеру наполовину під лінію води, і вона розвалюється.

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

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

Оцінюється за фото, а не за смаком

Розробку гейтять референсні фотографії з фіксованими контрактами камери та освітлення, фізичні одиниці світла, зафіксований тонемапер і перцептивна метрика різниці, що вирішує «пройшло/не пройшло», а не настрій арт-директора того дня.

Дві референсні фотографії канонічні, і їх обрали як протилежності:

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

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

Бік камери специфіковано так само суворо, як і бік води, бо фото-порівняння чесне лише тоді, коли камера не може шахраювати. Це означає справжні фізичні інтенсивності світла (полуденне сонце близько 100 000 люкс, а не довільний повзунок яскравості), фіксовану експозицію та фіксовану конфігурацію тонемапінгу й bloom для кожної референсної фотографії. Змініть тонемапер, і будь-яку воду можна підігнати під будь-яке фото. Саме тому тонемапер прибивають першим.

Drop-a-Mesh: плавати без домашки

Перетягніть будь-який меш на водойму Numivo, і він одразу поводиться коректно, система автоматично будує фіз-проксі, рахує витіснений об'єм за кадр із реальної висоти хвилі та виводить «плаває-чи-тоне» з реальної щільності.

Кораловий риф, видимий крізь прозору блакитну воду Під водою — це місце, а не пост-процес. Колір поглинається з глибиною, світло фільтрується вниз стовпами, а межа над головою має перетинатися чисто: озерна референсна фотографія існує, щоб тримати всі три чесними разом.

Колода плаває й перекочується на довгий бік. Ящик погойдується. Кам'яна статуя тоне. Жодного такелажу, жодного розставляння понтонів, жодних скриптів. Під капотом:

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

На акторі є маленька панель для override'ів, змусити плавати, змусити тонути, повзунок демпфування, перемикачі кільватера й сплеску, але override масштабує фізику, а не замінює її. Змусьте валун плавати, і він усе одно погойдується з правильним періодом і лишає правильний кільватер; він просто поводиться, ніби легший. Ця відмінність важлива: примусові результати, що ігнорують солвер, виглядають як пропи, приклеєні до площини, і гравці помічають це миттєво.

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

Що вона охоплює

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

Деталі, що важать, якщо вам важлива вода:

  • Хвилі йдуть з океанографічних спектрів (тих самих статистичних моделей, що описують реальні моря), із напрямним розсіянням і незалежно керованим зибом. Стан моря стає погодним рішенням, «наростаючий шторм, довгий зиб із заходу», замість тридцяти незв'язаних повзунків, які ви штовхаєте, доки не стане штормово.
  • Піна — не намальована маска. Вона народжується там, де хвилі реально розбиваються, старіє з часом і тягне смуги під вітром. Намальована піна, найчастіша ознака фальшивої води, бо не рухається з фізикою, яку має зображати.
  • Під водою — реальне місце. Коректне поглинання кольору за глибиною (червоний іде першим, тоді зелений, лишаючи глибокий синій, знайомий усім з відео занурень), стовпи світла, виведені з того самого каустичного поля, що освітлює дно, і перетин на лінії води без класичної жорсткої смуги артефакту.
  • Печерні водойми отримують власну обробку, стояча чи ледь рухома вода, збурення від крапель, відбиття в напівтемряві, бо спокійна внутрішня водойма оголює інші провали, ніж відкритий океан.
  • Синематики, критерії приймання, а не запізніла думка. Поверхня має лишатися стійкою під глибиною різкості, motion blur і зерном плівки, жодних спекулярних fireflies, що з'являються лише із зерном, жодного мерехтіння, що повільна камера перетворює на стробоскоп.

Чому плавучість, та частина, що всі пропускають

Вигляд можна підробити хорошим шейдером, а поведінку — ні; переконливе «плаває-й-тоне» потребує оцінки об'єму в реальному часі та стійкого солвера, що по-справжньому важко, тож більшість систем видають префаб човна й зупиняються.

Незручна інженерна правда в тому, що красивий шейдер води, розв'язана задача, а загальний солвер плавучості — ні. Підробити вигляд хвилі — задача текстури й нормалей; змусити довільний, ніколи не бачений раніше меш коректно сидіти в тій хвилі, задача фізики, що має працювати на частоті кадрів, переживати швидкі кроки часу й не вибухати, коли камінь із тисячі трикутників зустрічає штормовий зиб. Цей розрив, причина, чому «вода» в більшості рушіїв означає «гарну площину, з якою не можна взаємодіяти», і чому інтерактивна частина, коли вона є, — зроблений вручну човен.

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

Коли ви зможете цим користуватися?

Вона в розробці як розширення Unreal Engine, зі ступеневим викотом, кінематичне превʼю плавання приходить до повного фіз-солвера, щоб сцени можна було населяти рано. Ми не оголошуємо дату; референсні зображення вирішують, коли готово.

Ступеневість навмисна. Кінематичне превʼю (об'єкти йдуть за поверхнею хвилі без повної симуляції сил) приходить першим, щоб художники могли кидати меші й населяти море, поки важкий солвер ще гартується. Ви відчуваєте результат задовго до фіналізації фізики. Повний солвер, авто-проксі та повна панель ідуть далі. Прогрес і віхи з'являються на публічній дорожній карті, а не в сюрпризі дня запуску.

Набір інструментів, поряд із яким вона вийде, скатер, mesh blending, гріди, вимірювання — безкоштовний для проби сьогодні. Якщо хочете, щоб вас сповістили в мить появи публічного білда води, Discord, на який є посилання із сайту, місце, де це оголосять першим, і де порівняння «пройшло/не пройшло» референсних зображень публікуватимуть у міру появи.

Міні-FAQ

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

Які версії рушія? Актуальні релізи Unreal Engine 5. Деталі ляжуть на дорожню карту в міру наближення розширення до публічного білда, а не будуть обіцяні зараз і переглянуті пізніше.

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

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