Донецкий техникум промышленной автоматики

Моделювання водної поверхні

  1. Моделювання водної поверхні

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

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

Проте вийшла, на мій погляд, досить жива картинка.

Проте вийшла, на мій погляд, досить жива картинка

Модель досить адекватно змінює картину водної поверхні при наближенні, видаленні і зміні кута нахилу камери.

Модель досить адекватно змінює картину водної поверхні при наближенні, видаленні і зміні кута нахилу камери

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

... море можна перетворити в тропічний океан ...

море можна перетворити в тропічний океан

... коли прийде бажання зобразити якусь ефектну марину:

коли прийде бажання зобразити якусь ефектну марину:

Коротше ... знадобиться морський кліп - не обов'язково вирушати на Кариби: якщо не все, то багато чого можна намалювати вдома;) Тут я розмістив для ілюстрації flv-ролик, але, видать, скрипт якийсь кривий - показує через раз. Ну не Web я майстер. Втім, з цієї засланні ролик можна завантажити і подивитися будь-яким flv-проектором - коли в браузері його не видно. Хм.

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

Тому при викладі прийомів побудови моделі я найбільш докладно зупинюся, крім характеристик матеріалу води, саме на висвітленні дна. В іншому ж обмежуся досить швидким викладом етапів створення моря, благо в них немає нічого нового для освоїли ази поводження з додатком MAX. Заради відтворюваності результату будуть згадані (поряд з важливими) в тому числі і конкретні значення деяких другорядних параметрів, мало впливають на підсумок. Втім, які саме параметри вважати важливими, а які - другорядними, заздалегідь визначити досить складно. Хитка це матерія - морська поверхня ...

Моделювання водної поверхні

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

Заводжу геосферу радіусом 800 метрів (цього, вважаю, вистачить) з координатами (0,0, -105) (всі лінійні розміри даються в метрах).

Заводжу геосферу радіусом 800 метрів (цього, вважаю, вистачить) з координатами (0,0, -105) (всі лінійні розміри даються в метрах)

Впливаю на неї модифікатором EditPoly, виділяю всі полігони і звертаю нормалі в свиті EditPoligons (це необов'язково, але зручно - щоб не турбуватися надалі спеціально про те, щоб джерела освітлення сцени не зачинялися цієї нашої «небесної твердю»). Далі застосовую модифікатор UVW Mapping, вибравши в його свиті Parameters опцію Spherical - щоб мати можливість керувати нанесенням текстури.

Далі застосовую модифікатор UVW Mapping, вибравши в його свиті Parameters опцію Spherical - щоб мати можливість керувати нанесенням текстури

Текстуру для неба можна скласти в Photoshop'е або в будь-якому іншому графічному редакторі, щоб вийшло щось в цьому роді:

Текстуру для неба можна скласти в Photoshop'е або в будь-якому іншому графічному редакторі, щоб вийшло щось в цьому роді:

Сподіваюся, що прийоми створення «безшовних» картинок вами вже засвоєні, якщо ж ні - постарайтеся, щоб камера не дивилася в невдалу частину «небес». Створюю перший матеріал моделі - для небесної сфери. Це - стандартний матеріал, який використовує растрову текстуру в карті Diffuse Color з вагою 90, Self Illumination - 100 і значеннями квітів Ambient і Diffuse 18 42 56 (блакитний) і 120 190 230 (синій) відповідно. Розподіл світла по Blinn'у; значення для відблиску (Specular Level, Glossiness і Soften) - 0, 0, і 0,1 відповідно. Втім, оскільки в даному матеріалі використовується самосвеченія на 100%, останні параметри не такі вже й важливі (взагалі більшість параметрів, так само як і вибір вихідного матеріалу для текстури небес визначаються завданням композиції і можуть «плавати» в досить широких межах). Привласнюю нашої геосфері цей матеріал (я так і назвав його «небо»). Ставлю точкове джерело світла. Тіні відключені, інтенсивність - 1, координати - 0,0,0. Назву і його також - «небо». Єдине його призначення - висвітлювати купол небес

Єдине його призначення - висвітлювати купол небес

Розміщую спрямовану камеру з координатами x = 150, y = 141, z = 17, об'єктивом 46мм і «мішенню» в області x = 144, y = -60, z = -15. Саме час подивитися, що вийшло в поле зору камери. Так, нічого особливого, все очікувано ... небо начебто готова.

небо начебто готова

Дном служить площину 2000м на 2000м з координатами x = 162м y = 10м z = -7м. Матеріал для дна - також стандартний. За основу я взяв растр SPONGE.JPG з бібліотеки 3DSMAX ... але взагалі-то можна використовувати будь-яке зображення кам'янистій або піщаній поверхні, зробивши його безшовним:

але взагалі-то можна використовувати будь-яке зображення кам'янистій або піщаній поверхні, зробивши його безшовним:

Значення Ambient і Diffuse 26 27 10 (темно-зелений) і 182 219 119 (салатний) відповідно. Розподіл світла по Blinn'у; значення для відблиску (Specular Level, Glossiness і Soften) - 0, 10, і 0,1. Використовуються карти текстур Ambient Color (50), Diffuse Color (20) і Bump (140). У моєму випадку використовується тайлинг 25 в свиті Coordinates і інвертування в свиті Output кожної карти:

У моєму випадку використовується тайлинг 25 в свиті Coordinates і інвертування в свиті Output кожної карти:

Але це все, звичайно, залежить від того, що саме ви візьмете в якості основи для текстури дна. Привласнюю цей матеріал (назву його "дно") площині - дно готове.

Для імітації сонячних «зайчиків» на донної поверхні нам знадобиться окреме джерело світла з анімованої картою освітленості. Вона є сумішшю типу Mix двох текстур типу Noice з анімованими фазами. Оскільки сонячні відблиски на дні - дуже важлива частина моделі, розповім про це докладно (втім, тим, хто освоїв прийоми складання і анімації складних матеріалів, левову частку моїх подальших сперечань можна сміливо опустити, звернувши увагу лише на структури карт і параметри текстур).

Отже, виділяю будь-яку вільну комірку у вікні редактора. У моєму випадку це - невикористаний поки матеріал Material # 15 (навколо осередку з'являється яскрава біла рамка). Клацанням відкриваю сувій Maps. У розкрився свиті вибираю будь-яку карту - наприклад, Diffuse Color:

У розкрився свиті вибираю будь-яку карту - наприклад, Diffuse Color:

Клацаю по клавіші None в поле карти Diffuse; в спадному вікні матеріалів Material / Map Brouser вибираю варіант Noise і підтверджую вибір кнопкою OK:

Клацаю по клавіші None в поле карти Diffuse;  в спадному вікні матеріалів Material / Map Brouser вибираю варіант Noise і підтверджую вибір кнопкою OK:

Установки карти типу Noise «за замовчуванням», які будуть змінені, показані обведенням. Встановлюю нові значення: вибираю Blur - 2, Blur offset - 2, Noise Type - Turbulence, Levels - 6, Size - 800:

Встановлюю нові значення: вибираю Blur - 2, Blur offset - 2, Noise Type - Turbulence, Levels - 6, Size - 800:

Для створення складеного матеріалу клацаю по кнопці Noise, в спадному браузері матеріалів / карт вибираю варіант Mix, підтверджую вибір кнопкою OK. У відповідь на питання, що робити зі старою картою і не зробити її компонентом нової (за замовчуванням), клацаю OK

У відповідь на питання, що робити зі старою картою і не зробити її компонентом нової (за замовчуванням), клацаю OK

Отримую складний матеріал типу Mix, одним з компонентів якого є вже створений мною Map # 217 (Noise). У свиті Mix Parameters міняю установки як показано. Клацаю по свитку Output і зраджую характер кривої приблизно так, як показано на малюнку. Ця крива визначить в майбутньому нам вид і яскравість кордонів сітки відблисків на поверхні дна.

Ця крива визначить в майбутньому нам вид і яскравість кордонів сітки відблисків на поверхні дна

Повертаюся в сувій Mix Parameters, щоб додати другий компонент карти Mix, для чого клацаю по кнопці None, у вікні матеріалів Material / Map Brouser вибираю варіант Noise і підтверджую вибір кнопкою OK; установки за замовчуванням зраджую наступним чином:

Повертаюся в сувій Mix Parameters, щоб додати другий компонент карти Mix, для чого клацаю по кнопці None, у вікні матеріалів Material / Map Brouser вибираю варіант Noise і підтверджую вибір кнопкою OK;  установки за замовчуванням зраджую наступним чином:

Кольори Color # 1 і Color # 2 для шуму встановлюю на рівні 92 і 144 відповідно. Клацаю по кнопці навігатора карт редактора матеріалів, отримую схему нашого майбутнього карта освітленості дна. Сподіваюся, у вас вийшло те ж саме.

Сподіваюся, у вас вийшло те ж саме

Варто відразу ж і анімувати цей матеріал. Найпростіше це зробити так. Повертаюся в сувій Noise Parameters який-небудь з компонент нашого матеріалу Mix (наприклад, Color 1, в моєму випадку це матеріал Map # 217 (Noise)) - клацаю по полю Phase і вибираю в спадному меню пункт Show in Track Vew

Повертаюся в сувій Noise Parameters який-небудь з компонент нашого матеріалу Mix (наприклад, Color 1, в моєму випадку це матеріал Map # 217 (Noise)) - клацаю по полю Phase і вибираю в спадному меню пункт Show in Track Vew

Відкриється редактор побудови графіка анімації. Яким-небудь інструментом (наприклад, олівцем) малюю криву з двох точок. Потім, виділяючи їх, встановлюю значення для першої, наприклад, точки номер кадру - 0, величина фази - (-9); для другої - 100 і 0 відповідно.

Потім, виділяючи їх, встановлюю значення для першої, наприклад, точки номер кадру - 0, величина фази - (-9);  для другої - 100 і 0 відповідно

Користуючись інструментами, які я виділив на малюнку (не забудьте вибрати режим анімаційної кривої таким, щоб фаза змінювалася в області за опорними точками графіка, інакше море буде "грати" тільки в кадрах з номерами від 0 до 100), отримую графік анімації фази для шуму приблизно в наступному вигляді:

Користуючись інструментами, які я виділив на малюнку (не забудьте вибрати режим анімаційної кривої таким, щоб фаза змінювалася в області за опорними точками графіка, інакше море буде грати тільки в кадрах з номерами від 0 до 100), отримую графік анімації фази для шуму приблизно в наступному вигляді:

Такий графік зміни фази шуму при проекції зі швидкістю 15 - 30 кадрів в секунду відповідає досить природному зміни відблисків і хвиль нашого майбутнього моря. Тепер анімаційне вікно Selected можна закрити. Слід анімувати і другу компоненту матеріалу. У вікні редактора матеріалів в свиті Noise Parameters тільки що анімованого компонента Color 1 (матеріал Map # 219 (Noise)) віконце Phase тепер містить червону окантовку - ознака анімації фази шуму, що лежить в основі текстури компонента. Клацаю в поле Phase і вибираю з меню, що випадає рядок Copy Animation. Переходжу до другого компонента (в моєму випадку - це Color 2, матеріал Map # 217 (Noise)), клацаю правою кнопкою мишки в поле Phase і вибираю пункт Paste Animation - Instance.

Переходжу до другого компонента (в моєму випадку - це Color 2, матеріал Map # 217 (Noise)), клацаю правою кнопкою мишки в поле Phase і вибираю пункт Paste Animation - Instance

Тепер у мене анімовані обидва компонента складного матеріалу Mix. Якщо мені не сподобається темп анімації, досить поправити її для одного компонента - і анімація другого зазнає аналогічні зміни (оскільки ми використовували варіант копіювання Instance). Створюю новий стандартний точковий джерело світла, називаю його «грунт». Координати - 160, 56, 165, рожевий колір (255, 227, 190), тіні включені, тип тіней - Adv. Ray. Traced, інтенсивність - 0,2. Мені потрібно, щоб це джерело малював відблиски на дні - відповідно до того анімованим матеріалом, який я змайстрував. В редакторі матеріалів я переходжу на рівень списку карт (сувій Maps), клацаю правою кнопкою миші по карті, де знаходиться матеріал сонячних відблисків (в моєму випадку Map 217 (Mix) в карті Diffuse Color осередку текстур Material # 15) і в випадаючому меню вибираю рядок Copy.

В редакторі матеріалів я переходжу на рівень списку карт (сувій Maps), клацаю правою кнопкою миші по карті, де знаходиться матеріал сонячних відблисків (в моєму випадку Map 217 (Mix) в карті Diffuse Color осередку текстур Material # 15) і в випадаючому меню вибираю рядок Copy

Тепер переходжу в сувій Advanced Effects джерела світла «грунт», клацаю правою кнопкою миші по кнопці None в області Projector Map і вибираю команду Paste (Instance) в випадаючому меню. Тепер наш джерело містить анімовану карту Map # 217 (Mix), яку я створював в редакторі матеріалів. Якщо картина відблисків мені не сподобається, я зможу відредагувати її в вікні редактора матеріалів; при цьому анімація джерела освітлення перетворюється автоматично.

Якщо картина відблисків мені не сподобається, я зможу відредагувати її в вікні редактора матеріалів;  при цьому анімація джерела освітлення перетворюється автоматично

Дно є, відблиски є, залишилося подбати, щоб джерело освітлення неба висвітлював тільки небо, а джерело освітлення дна - тільки дно. У свиті General Parameters джерела світла «грунт» в поле інструментів Shadows клацаю по кнопці Exclude ... і в спадному вікні Exclude / Include виділяю об'єкт «небеса»: мені зовсім ні до чого відблиски на сфері, що імітує небо. Потім клацаю по кнопці >> і по OK.

Потім клацаю по кнопці >> і по OK

Вікно згорнеться. Далі ту ж процедуру виробляю з джерелом світла «небо», тому що мені зовсім ні до чого засвічувати дно зайвим світлом, призначеному для неба. Проведу пробний рендеринг. У мене вийшло ось що:

У мене вийшло ось що:

Варіюючи параметри компонент матеріалу Map # 217 (Mix), я можу змінювати характерні розміри відблисків, а трансформуючи криву розподілу інтенсивності компонента Color # 1 (Map # 217 (Noise)) - товщину і яскравість сітки. Взагалі, є сенс самостійно поміняти деякі параметри (включаючи коефіцієнт змішування компонент) і вибрати те, що здасться найбільш підходящим.

Тепер потрібно «накрити» дно з анімованими відблисками анимированной водною гладдю. Створюю площину розмірами 2000м на 2000м і координатами 0, 0, 0. Назву її «море». Виключаю цей об'єкт з впливу джерел світла «небо» і «грунт» так, як вже описував раніше. Для створення матеріалу водної поверхні виділяю вільну комірку в редакторі матеріалів Material editor і так і називаю цей матеріал - море. Привласнюю цей матеріал щойно створеної площині. Зраджую установки за замовчуванням в свиті Blinn Basic Parameters в поле інструментів Highlightes. Відкриваю сувій Maps і міняю «вплив» карти Bump з 30 на 20. Тепер займуся створенням матеріалу, що імітує хвилі і брижі на воді.

Клацаю по кнопці None карти Bump викликаю броузер карт і матеріалів, вибираю варіант Mix.

Установки за замовчуванням міняю наступним чином: клавішею Swap реверсують кольору компонент і встановлюю 50% змішування майбутніх карт шумів, що імітують хвилі і брижі морської поверхні. Клацаю по клавішах None компонент матеріалу Color # 1 і Color # 2 вибираю в редакторі карт і матеріалів варіанти Noise. Характеристики шумів для імітації хвиль і брижів вказані на малюнку: в даному випадку обраний режим Fractal, кольору карти шумів Map # 221 компоненти Color 2 встановлюю на рівні 92 і 144. Після цього залишається анімувати матеріали, що становлять карту Bump - щоб поверхня моря ожила. Чесно, мені ліньки докладно розповідати, як це робиться, тим більше, що прийоми там ті ж, що і в анімації карти відблисків на дні, а про неї я вже говорив. У цьому прикладі я просто скопіював анімацію фази одного з компонентів матеріалу Map 217 (Mix) і переніс її в компоненти матеріалу Map 215 (Mix), що формує текстуру Bump поверхні матеріалу «море». Покінчивши з анімацією Bump'а, займуся оптикою - поглинанням, відбиттям і заломленням.

Переходжу на 2 рівня вище, двічі клацнувши по відповідному значку Переходжу на 2 рівня вище, двічі клацнувши по відповідному значку   на лінійці інструментів редактора матеріалів, і вибираю в свиті Maps наступну характеристику матеріалу «море» - Opacity на лінійці інструментів редактора матеріалів, і вибираю в свиті Maps наступну характеристику матеріалу «море» - Opacity. Це дуже важлива характеристика матеріалу: вона забезпечує зміна прозорості поверхні води. Чим менше кут, під яким ми дивимося на водну гладь, тим менше вона прозора, і навпаки. У свою чергу, чим далі від камери ту чи іншу ділянку морської поверхні, тим менше і кут, під яким ця поверхню видно. Тому природно використовувати в цій карті матеріалу текстуру типу Falloff.

У вікні матеріалу Falloff вибираю спад по Френелю і модифікує криву в свиті Mix Curve так, як показано на малюнку. Скинувши - щоб хвилі і брижі не заважали огляду - прапорець Bump в свиті Maps матеріалу «море», варто зробити пробний рендеринг і переконатися, що морська поверхня і справді стає все менш і менш прозорою в міру віддалення до горизонту. Якщо характер цієї зміни здасться вам неприродним, можна скорегувати його, змінюючи криву карти Falloff, зрушуючи кордон видимості дна ближче або далі від горизонту, регулюючи ступінь розмитості цього кордону.

Ось що вийшло у мене. Начебто непогано.

Моделюючи відображення, я використовую стандартний прийом, коли карта Reflection складається з матеріалу типу Raytrace, який маскується матеріалом типу Falloff, тільки тут зворотна ситуація: чим далі до обрію, тим краще водна поверхня відображає навколишній світ (і в першу чергу небо). Складаю «каркас» матеріалу. Для початку заводжу в свиті Maps редактора матеріалів в рядку Reflection текстуру типу Mask. А потім те ж саме роблю з компонентою матеріалу: клацаю по кнопці None компоненти Mask і в списку, що розкривається карт і матеріалів вибираю варіант Falloff

В результаті розкриється поле редакції матеріалу Faloff. Параметри за замовчуванням міняю приблизно так само - але не тотожне - як я вже робив для карти прозорості Opacity дещо раніше. Критерій підбору той же самий: змінюючи характер кривої змішування матеріалу Falloff домогтися природного зміни відбивної здатності «моря» в міру віддалення поверхні води до горизонту.

Піднявшись на рівень вище за ієрархією вкладених матеріалів (використовую значок переходу Піднявшись на рівень вище за ієрархією вкладених матеріалів (використовую значок переходу   ), Я знову відкриваю в редакторі матеріалів текстуру типу Mask ), Я знову відкриваю в редакторі матеріалів текстуру типу Mask. Клацаю по кнопці None компонента Map і вибираю варіант Raytraced. Робота з картою Reflection закінчена: в нашому прикладі я не зраджую жоден параметр, встановлений в цій текстурі за замовчуванням.

Ось, що вийшло, якщо в списку карт Maps матеріалу «море» залишити активної тільки карту Reflection.

Матеріал для моря почти готов. Є ще одна характеристика, без якої анімація води на Близькому плане буде непереконліва. Я маю на увазі рефракцію. Ця карта, в поєднанні з анімованим Bump'ом, забезпечить легке ритмічне спотворення дна, яке ми зазвичай спостерігаємо, коли дивимося на дно крізь спокійну, ледве гойдалося, прозору воду. Я вибрав варіант Thin Wall Refraction з параметрами Thickness 0 і Bump Map Effect 0,5. Сила впливу цієї карти - 25%. Таким чином, матеріал поверхні води складено з карт наступних текстур; їх параметри я вже описав.

Мабуть - доки не забув - поміняю кольору матеріалу «море»: адже я моделюю НЕ ласкаве Терренское, не спекотне Карибське, а прохолодне, хоч і літній, Балтійське море. Тому кольору матеріалу я міняю з смарагдового на сірий.

Щоб у відповідних ракурсах на хвилях з'явилися сонячні відблиски необхідно, натурально, світило. Як сонця використовую стандартний точковий джерело світла, розміщую його приблизно там же, де знаходиться джерело відблисків на дні. Тіні, інтенсивність, колір «сонця» залишаю - за замовчуванням (лише тіні треба буде включити). Ну і виключаю з дії «сонця» все, крім «моря». Ось тепер настав час для візуалізації. Про всяк випадок відкрийте закладку Renderer у вікні Render Setup і переконайтеся, що в установках визуализатора активний режим Auto-Reflect / Refract and Mirrors. А ось пташку в Antaliasing можна зняти. Якщо знадобиться збільшити якість картинки, використовуйте відключені за замовчуванням режими Super Sampling: час візуалізації зросте, зате якість результату вас напевно приємно здивує.

Якщо знадобиться збільшити якість картинки, використовуйте відключені за замовчуванням режими Super Sampling: час візуалізації зросте, зате якість результату вас напевно приємно здивує

Благословясь, учиняють рендеринг.

Благословясь, учиняють рендеринг

Начебто непогано вийшло. Зайняло всього сім секунд на компі з 2GHz процесором далеко не «навороченной» збірки мінімум трирічної давності. Зверніть увагу на мальовничі поєднання «дзеркальності» з придонними відблисками в прикордонних (на рубежах відображення і проникності) областях зламаним брижами морської поверхні. Гра світла, тіней і сонячних зайчиків укупі з розбитим хвилями відображенням небес створює дивовижне відчуття достовірності (не дивлячись на примітивні засоби, використані при моделюванні).

Щоб продемонструвати адекватне дійсності зміна властивостей матеріалу в залежності від ракурсу я помістив пару каменів і анімовані положення камери. Ось що вийшло:

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

Але це вже за межами теми ... Втім, я, здається, повторююсь? Значить, саме час закруглятися.

Успіхів!

Олександр Сокорнов (toft)

Втім, я, здається, повторююсь?