Анимация жидкости
Удачной тебе охоты, о Великий Алл! Вот и пересеклись снова наши пути дорожки. Сегодня я намерен рассказать о том, как можно анимировать жидкость, налитую в некую посудину. Что и говорить, скрипты будут, но немного и не больно :), так что пугаться не надо. Ну все, поехали.
Давайте для начала просто построим произвольный цилиндр и представим, что это жидкость в некоторой емкости. Емкость в настоящий момент нам глубоко неинтересна, потому будем работать только с жидкостью. Наша задача - на этом подопытном цилиндре найти и отработать метод изображения анимации жидкости.
Рассматривать мы будем только случай анимации жидкости в емкости с параллельными стенками. Кто знает, почему - молодец, шагом марш за пирожками с верхней полки, ну а кто не догадался, - узнает в конце урока.
Присвойте цилиндру модификатор Taper, указав в качестве primary axis X, а в качестве Effect - Z. Давайте разберемся, что нам это дает. В принципе, этого уже достаточно для анимации жидкости в стакане, так как данный модификатор позволяет создать односторонний скос (при наклоне стакана установить поверхность горизонтально) и имитировать запаздывание жидкости вследствие инерции. Проверить это утверждение просто - наклоните цилиндр, к примеру, на 30 градусов вдоль оси Y и постепенно увеличивайте значение amount в параметрах модификатора. Получили жидкость в наклоненном стакане. У меня это вышло при значении 0.5, но здесь все зависит от соотношения длины и ширины цилиндра, чем "толще" цилиндр, тем большее значение придется ввести.
Давайте представим, что этот стакан еще и двигается вдоль оси Х в отрицательном направлении. Жидкость сначала запаздывает, поднимаясь по стенке стакана, затем догоняет, потом поднимается на другую стенку, и этот процесс повторяется, постепенно затухая. Попробуйте задать несколько произвольных значений кривизны curve и убедитесь, что одного модификатора Taper вполне достаточно для задания такого движения.
Ну а что делать, если наклон не вдоль оси Y, да и движение не вдоль оси X? Можно, конечно, сделать два модификатора Taper - по одному на каждую ось и затем управлять ими, но мы пойдем другим путем. Мы вспомним, что модификатор Taper имеет gizmo, которое так же можно анимировать. Воспользуемся поворотом габаритного контейнера относительно оси Z локальной системы координат, - это даст нам возможность имитировать наклон/движение стакана в любом направлении. Самостоятельно убедитесь в правильности последнего заявления.
Анимировать все это безобразие вручную - нелегкий труд, следовательно, заставим компьютер делать это за нас. Для начала вспомним, что появился такой модификатор, как Flex, позволяющий задавать "запаздывание" геометрии. Параметры его довольно просты, потому описывать не буду. Кому интересно, создайте кубик, повесьте на него модификатор, задайте кубику какое-либо движение и просмотрите анимацию. Пять минут на разбор полета методом оценки изменений параметров модификатора и поехали дальше. Легко понять, что просто применить модификатор Flex к нашей жидкости мы не можем - нам нужно, чтобы жидкость оставалась в посуде. Однако мы можем создать систему, управляющую параметрами модификатора Taper используя модификатор Flex.
Удалите цилиндр, поскольку нам он больше не понадобится. Постройте куб со стороной, равной единице, и назовите его Inerbox. Примените к нему модификатор Flex. Настройте видовые экраны, выполнив Zoom Extents All. Что нам это дает? Так как наш бокс под воздействием модификатора flex будет изменять геометрию, то и расстояния между точками противолежащих граней будут изменяться, причем в соответствии с настройками модификатора flex, проще говоря, - по законам инерции, что нам и нужно. Мы не можем напрямую использовать значения смещений между этими точками, но, привязав с помощью контроллера Attachment вспомогательный объект к точке на грани, можем получить значение положения опорной точки этого объекта. Простое выражение, определяющее разность положений между опорными точками бокса и вспомогательного объекта даст нам параметр, управляющий анимацией жидкости. Постройте объект Dummy произвольного размера, назовите его Inerdum. Из этих двух объектов мы и создадим управляющую систему. Для начала привяжем объект Inerdum к боксу, используя контроллер Attachment, - этот контроллер позволяет привязать положение объекта к конкретной точке на грани другого объекта.
Выделив объект Inerdum, перейдите на панель Motion, выберите в списке Assign Controller контроллер положения и нажмите на кнопку изменения контроллера. В раскрывшемся окне выберите контроллер Attachment и нажмите Ok. Раскроется свиток параметров контроллера Attachment.
Нажмите кнопку выбора объекта привязки Pick Object и укажите мышью на Inerbox. Имя бока появится над кнопкой выбора объекта. Активируйте режим установки позиции на грани Set Position и снова укажите на Inerbox. В параметрах позиции появятся значения положения Inerdum относительно той грани, на которую вы указали мышью. Исправьте значения: face=2, A=0.5, B=0. Мы выставили вспомогательный объект по центру верхней стороны бокса, обеспечив, тем самым, максимальную амплитуду колебаний опорных точек объектов относительно друг друга.
Отключите режим Set Position. Обратите внимание,- значениями положения для контроллера Attachment являются величины A и B, определяющие размещение объекта на грани. Нас же интересует положение опорной точки объекта в пространстве, - для этого измените контроллер позиции на List, оставив в списке Attachment. Выберите новый появившийся трек Available и присвойте ему контроллер Безье. Дважды щелкните по нему, чтобы сделать активным.
Остался последний штрих - если просмотреть значение положения вспомогательного объекта, выбрав инструмент Select and Move, и щелкнув по нему правой кнопкой мыши при выделенном объекте Inerdum, то можно увидеть, что это значение по оси Z равно единице. Запомним этот момент, он нам пригодится в дальнейшем. Сохраните сцену. Данная заготовка может пригодиться во многих анимациях, имитирующих инерцию, так что можете не уничтожать ее, закончив урок.
Все, с приготовлениями покончено, давайте делать стакан и воду. Спрячьте на время объекты Inerbox и Inerdum, выполните Zoom Extents All для пустых экранов. Поскольку наша задача заключается в том, чтобы разобраться с анимацией, модели объектов мы будем делать чисто схематически. На экране Front постройте две линии, представляющие собой сечения стакана и фужера.