Частинки та динаміка в Maya, 3DPAPA
Mike Zugschwert, CG-generalist з більш ніж десятирічним досвідом роботи, розповість про симуляцію води у Maya.
Симуляцію води я почав із створення геометрії, в якій збирався симулювати воду: склянки та пляшки. При цьому важливо пам'ятати про масштаб моделі, я перевірив, щоб робітниками юнітами у мене були встановлені сантиметри, і швидко замоделював необхідні об'єкти в реальному масштабі.
Тепер я міг додати в сцену частинки та скористатися перевагою пресета nParticle. Нижче меню nParticles > Create nParticles розташовано п'ять опцій дефолтних налаштувань.
Я вибрав пресет Water у тому самому меню, виконав команду Create Emitter. Це створило в сцені емітер типу Omni та об'єкт nParticle. За замовчуванням параметр Max Distance емітера типу Omni має значення 0, що означає, що частинки генеруватимуться в одному певному місці. Це не зовсім підходить для симуляції води, оскільки через керуючі симуляцією частинки дуже швидко відскакуватимуть одна від одної. Тому я вибрав емітер, відкрив Attribute Editor і встановив значення 2 для параметра Max Distance, розташованого нижче Distance/Direction Attributes. Також я змінив значення параметра Rate на 500 та помістив емітер усередині пляшки.
Далі мені необхідно змінити число Substeps у Nucleus Solver'а. За замовчуванням було встановлено 4, що могло призвести до нестабільних симуляцій. Я накрутив його до 12, якщо під час симуляції я побачу, як частинки будуть вибухати або рухатися всередині Collision Objects, я завжди зможу збільшити це число. Також я увімкнув галочку Use Plane, розташовану під налаштуваннями Ground Plane. Це утримає частинки, що промахнулися повз склянку, від падіння в нескінченність. Якщо я не створив геометрію на початку координат, томожу завжди можу створити в сцені площину, яку використовуватиму як Collider.
І, нарешті, мені потрібно додати геометрію як об'єкт зіткнення частинок. Я вибрав геометрію та виконав команду nMesh > Create Passive Collider. Це створить нові об'єкти nRigid у сцені для кожного вибраного об'єкта. У вкладці nRigidShape в Attribute Editor я можу налаштувати такі властивості зіткнення, як товщина (Thickness), відскок (Bounce) та тертя (Friction). Дефолтні налаштування зазвичай непогано справляються із симуляцією.
Тепер я можу вирахувати симуляцію. Дефолтні властивості пресета води добре працюють, але я хочу внести кілька правок.
Рада: Якщо ви не використовуєте пресет води, то обов'язково увімкніть Liquid Simulations і вимкніть Self Collisions. З включеною симуляцією рідини частинки почнуть поводитися подібно до води, завдяки силам тяжіння і відштовхування, що виникли, що дозволить їм взаємопроникати. Якщо галочка Self Collide буде включена, вона заважатиме симуляції рідини.
У вкладці nParticleShape в Attribute Editor я починаю змінювати радіус частинок. Чим більше вони будуть, тим менше води мені знадобиться, що також зменшить деталізацію симуляції. Для сцени такого масштабу добре підійде радіус .15. Також я змінив значення Radius Scale Input з None на Randomized ID та збільшив Radius Scale Randomize до .1. Це рандомізує радіус частинок і допоможе запобігти скупченням частинок уздовж стінки, як на зображенні нижче.
Також я хочу, щоб частинки трохи проникали у склянку так, щоб я міг заповнити міш повністю, не залишаючи проміжку між ним та склянкою. Для цього я встановив для Collide Width Scale значення .7.
Нижче Liquid Simulation розташований атрибут Liquid Radius Scale. Він впливає на те, як сильночастинки проникають одна в одну. Мені потрібен був невеликий оверлап, щоб отримати гладкий міш. Дефолтне значення 1 було надто високим. Я скрутив його до .5, пам'ятаючи при цьому, що більше дозволяю часткам взаємопроникати, тим більше часток мені знадобиться, щоб наповнити склянку.
Для швидшого програвання симуляції її необхідно кешувати. Я вибрав nParticles, зайшов у меню nCache та обрав налаштування команди Create New Cache. Тут я налаштував різні опції та вибрав папку для кешу. Зазвичай я віддаю перевагу налаштуванню One file per frame, щоб у разі крашу я міг продовжити з того місця, де закінчив, а не перераховувати кеш із самого початку. Після кешування я побачив, що налаштування кеша з'явилися у вкладці Info внизу вкладки Cache Attribute Editor. Там я міг побачити всі налаштування, використані при створенні кешу, що могло допомогти мені стежити за тим, які настройки мають різні кеші.
Симуляція зайняла 17 хв та 300 кадрів. Наприкінці я мав 34750 частинок.
Для першої симуляції вона виглядала непогано, хоча я хотів ще заанімувати пляшку, щоб вода з неї не лилася постійно в одне місце. Також я хотів наповнити склянку трохи більше. Напевно, 150.000 частинок, при цьому швидкість склала б 25.000 частинок за секунду за 140 кадрів. Я підвищив Liquid Radius Scale до .7 і знову запустив симуляцію, щоб подивитися, як вона виглядатиме.
Нова симуляція розтяглася на 380 кадрів та 3 години (все залежить від системних потужностей). У сцені налічувалося 144, 791 частка.
Нарешті у мене вийшла непогана симуляція, а отже я міг створювати міш. Я виконав команду Modify > Convert > nParticles to Polygons. Так у мене у сцені з'явився міш, з яким я продовжив працювати. Відображення частинок я вимкнув, щобприскорити роботу в'юпорту.
Відразу після низки цих операцій я побачив у сцені лише пару бульбашок.
Сталося це через дуже великий розмір трикутників. Їхній розмір залежить від масштабу сцени. Для своєї сцени я використовував значення, наведені нижче.
Threshold і Blobby Radius Scale будуть впливати на те, як змішується з частинками. Threshold зменшує міш, виходячи з щільності частинок.
Mesh Triangle Size впливає розмір полігонів, у тому числі генерується меш. Max Triangle Resolution автоматично змінить Mesh Triangle Size, якщо воксельна сітка, яка генерує міш, більша за значення Resolution. В основному, для неї встановлено значення 100, і в неї йде понад 100 полігонів на створення всієї довжини міша вздовж однієї з осей, вона змінює розмір трикутників. У більшості випадків, зміна розміру трикутників при симуляції змушує заважати між кадрами, щоб уникнути цього я встановив для цього параметра досить високе значення.
Motion Streak розтягує форму частинок у напрямку руху, створюючи Motion Blur. Mesh Smoothing допоможе згладити міш.
Для параметра Mesh Method я намагаюся використовувати значення Quad Mesh, що дозволяє мені працювати з лоупольним мішом, який потім змужу натисканням клавіші 3. Також я включив галочку Velocity Per Vertex, тому що планував рендер з Motion blur'ом.
Далі я призначив на геометрію шейдера, створив кілька світильників, площину підлоги та відрендерив сцену.