- Анимация пружины с помощью костей в 3dsMAX
- 1. Зачем это надо?
- 2. Устройство пружины
- 3. Анимация деформируемой части
- 4. Анимация недеформируемых частей пружины.
- 5. Почему это работает.
- 3D Studio MAX: первые шаги. Урок 23. Построение иерархий с помощью системы костей Bones
- Теоретические аспекты
- Понятие системы костей
- Создание структуры костей
Анимация пружины с помощью костей в 3dsMAX
1. Зачем это надо?
Вполне логичный вопрос. Тем более что в 3dsMAX‘е имеются уже для этих целей соответствующий объект, который так и называется Spring (англ. — пружина). Создать ее можно из меню Create > Dynamic s > Spring или выбрав на командной панели (Command Panel) закладку Create > кнопка Geometry > в выпадающем списке Dynamics Objects > Spring.
Этот стандартный объект имеет немало параметров, отвечающих за форму (длинна, ширина, количество витков, сечение) и за метод построения концов пружины (End Point Method). Все это благополучно анимируется, а при выборе End Point Method > Bound to Object Pivots концы пружины можно привязать к конкретным объектам в сцене, тогда анимировать придется только эти объекты (если они еще не были заанимированы), а пружина уже будет самостоятельно изменять свою длину и местоположение в сцене.
Но если пружина необходима абсолютно другого сечения, чем те, которыми располагает стандартный объект: круглое, прямоугольное и D-образное? Или уже есть готовая модель пружины со своим набором материалов, текстур, текстурных координат? Или же пружину эту надо отэкспортить вместе с анимациями в какой-либо движок (Engine), а он совсем не знает о существовании такого замечательного объекта как Spring, и понимает только Skin-анимацию? Короче говоря, существуют такие ситуации, когда вопрос «Зачем это надо?» не возникает.
2. Устройство пружины
В более общем случае пружину можно разделить на три части:
- красным цветом обозначен недеформируемый нижний конец пружины, т.е. все точки этой части не изменят своего положения относительно друг друга;
- желтым – деформируемая часть;
- зеленым – недеформируемый верхний конец.
3. Анимация деформируемой части
Для начала будет удобно скрыть недеформируемые части пружины(перейти в режим редактирования полигонов, выделить соответствующие недеформированным частям и скрыть Edit Geometry > Hide Selected):
Основная особенность анимации деформируемой части пружины состоит в том, что при изменении длинны пружины, меняется расстояния между витками, при этом форма сечения должна оставаться неизменной. Если применить простое масштабирование вдоль оси пружины, то при растяжении толщина сечения будет увеличиваться, а при сжатии – уменьшаться:
Для того чтоб избежать подобных неприятностей понадобится модификатор Skin и две кости(Bones). При чем, абсолютно не важно ни количество витков пружины, ни форма сечения, ни разность между углами относительно оси пружины, в которых начинается первый виток и заканчивается второй. Важно правильно расположить кости:
- они должны быть параллельны пружине;
- первая кость должна начинаться строго в нижней части сечения первого(нижнего) витка и заканчиваться в нижней части последнего витка;
- вторая кость должна начинаться строго в верхней части сечения первого витка и заканчиваться в верхней части последнего витка.
Войти в режим создания костей можно из меню Create > Systems > Bones IK Chain или из командной панели(Command Panel) закладка Create > кнопка Systems > в выпадающем списке Standard > Bones:
При создании костей необходимо использовать привязки для правильного расположения. Создание первой кости:
Для удобства кости можно отодвинуть от оси пружины, чтоб они не находили друг на друга; завершающие косточки – удалить(в них нет необходимости):
Первая кость будет называться bone_down, вторая – bone_ up. Модификатор Skin назначается на саму пружину, в его параметры(Parameters) добавить созданные кости Bones > Add:
Дальше необходимо настроить коэффициенты влияния костей на вершины сетки пружины по следующим правилам:
- на точки, расположенные в нижней части любого сечения пружины, будет влиять только первая кость bone_down;
- на точки, расположенные в верхней части любого сечения пружины, будет влиять только вторая кость bone_up;
- на промежуточные точки коэффициент влияния первой кости bone_down будет равен отношению удаленности точки от верхнегокрая сечения к толщине сечения, второй кости bone_up – отношению удаленности точки от нижнего края сечения к толщине.
Для данного примера:
- толщина сечения равна 5;
- желтые точки расположены в нижней части сечения: коэффициенты влияния bone_down = 1.0, bone_up = 0.0;
- красные точки расположены в верхней части сечения: bone_down = 0.0, bone_up = 1.0;
- синие точки удалены от нижнего края сечения на 1, от верхнего – на 4: bone_down = 1/5 = 0.2, bone_up = 4/5 = 0.8;
- зеленые точки удалены от нижнего края на 4, от верхнего – на 1: bone_down = 4/5 = 0.8, bone_up = 1/5 = 0.8.
Для назначения коэффициентов влияния костей на вершины в свитке параметров модификатора Skin нажать кнопку Edit Envelopes, в группе Select напротив Vertices поставить галочку и в группе Weight Properties нажать кнопку Weight Tool (на кнопке нарисован гаечный ключ), после чего появиться дополнительное окно с одноименным названием:
Для удобства можно выделить все вершины и сбросить коэффициент влияния первой кости bone_ down в ноль. Коэффициенты влияния на вершины назначать лучше сразу на цепочки вершин, расположенных вдоль витков: выделить две соседние вершины и нажать кнопку Loop, выбрать кость в параметрах модификатора, затем нажать кнопку на которой изображен требуемый коэффициент(0, .1, .25, .5, .75, .9, 1) либо рядом с кнопкой Set Weight ввести требуемую величину и нажать ее:
После всех этих манипуляций должно получиться следующее:
Теперь если выделить кости bone_up и bone_down, войти в режим масштабирования, выбрать в качестве центра точки привязки объектов, то при масштабировании костей вдоль оси пружины сама пружина будет корректно сжиматься и разжиматься, при этом толщина сечения изменяться не будет:
4. Анимация недеформируемых частей пружины.
Теперь можно сделать видимыми скрытые полигоны отвечающие, за недеформируемые части. Для этого выбрать объект пружины, перейти на уровень редактирования полигонов и нажать кнопку Edit Geometry > Unhide all:
Для анимации недеформируемых частей понадобится еще две кости: первая кость располагается по оси пружины и ее начало и конец соответствуют началу и концу пружины, вторая – просто завершающая косточка:
Первая кость будет называться bone_start, а вторая – bone_end. В настройках иерархии вращение второй косточки должно быть заблокировано Command Panel > Hierarchy > Link Info > Locks > X, Y, Z:
Для настройки первой кости понадобиться утилита Bone Tools, которая находится в меню Animation > Bone Tools. .Кость должна иметь возможность изменять свою длину (убрать галочку с Freeze Length) и при этом сохранять неизменной свою матрицу трансформаций(Stretch > None):
Кости влияющие на деформируемую чать пружины bone_down и bone_up привязываются к кости bone_start инструментом Select and Link:
В параметры(Parameters) модификатора Skin добавляются оставшиеся кости bone_start и bone_end. Для скрытых ранее недеформируемых частей пружины назначаются соответствующие коэффициенты влияния:
- для нижней части bone_start = 1.0, все остальные кости 0.0;
- для верхней части bone_end = 1.0, все остальные кости 0.0.
Теперь при изменении положения корневой кости bone_start за ней перемещаются вершины нижней недеформируемой части пружины(через модификатор Skin), кости bone_down и bone_end, которые изменяют положения вершин деформируемой части, и косточка bone_end, изменяющая положения вершин верхней недеформируемой части. При изменении положения косточки bone_end,за ней меняет свою ориентацию корневая кость bone_start и соответственно вся пружина, а также изменяют свое положение относительно продольной оси пружины вершины верхней недеформированой части. Осталось связать масштабирование вдоль оси пружины костей bone_down и bone_end с перемещением косточки bone_end вдоль оси пружины.
Для начало необходимо получить зависимость коэффициента масштабирования костей деформируемой части от расстояния от косточки bone_end до начала кости bone_start:
Пояснения к рисунку:
- L – расстояние от косточки bone_end до начала кости bone_start (для начального положения L’);
- c1, c2, c3, c4 – отступы от концов костей bone_down и bone_up до краев пружины, из-за присутствия недеформируемых частей эти величины неизменны при растяжении или сжатии пружины;
- ld и lu – длины костей bone_down и bone_up соответственно, нетрудно заметить, что они равны между собой, поэтому в дальнейшем будут обозначаться l (для начального положения l’).
Необходимо найти соотношение l/l’ = s, что и является коэффициентом масштабирования костей деформируемой части. Итак:
L = c1 + lu + c2 = c3 + ld + c4, c1 + c2 + l = c3 + c4 + l, следовательно c1 + c2 = c3 + c4 = C = L’ — l’,
L = C + l, l = L — C, l’ = L’ — C,
l / l’ = (L — C) / (L’ — C) = (L — (L’ — l’)) / (L’ — (L’ — l’)) = (L — L’ + l’)/(L’ — L’ + l’) = (L — L’ + l’) / l’ = (L — L’)/l’ + 1.
Таким образом s = (L — L’)/l’ + 1, где L’ и l’ известные величины (их можно получить используя Command Panel > Utilities > Measure. В данном примере получилось L’ = 147, l’ = 132:
Следующие действия проделываются для каждой кости bone_up и bone_down:
- выделить кость отвечающую за деформируемую часть;
- перейти Command Panel >Motion >Parameters >Assign Controller;
- назначить Sceale контроллер ScaleXYZ;
- назначить X Scale контроллер Float Expression;
- появится окно настройки контроллера:
- тут в группе Create Variables создается новая векторная переменная end_pos и назначается ей контроллер $bone_end.transform.controller.Position, теперь эту переменную можно использовать в выражении Expression, куда и вписываеться полученная ранее формула (length(end_pos) — 147) / 132 + 1, где length(end_pos) и есть расстояние от косточки bone_end до начала кости bone_start, так как переменная end_pos содержит координаты косточки bone_end относительно родительской кости bone_start.
Вот вроде и все. Теперь если выделить косточку bone_end и выбрать инструмент перемещение Move и подвигать ее должно получиться так:
5. Почему это работает.
Основная идея заключается в правильном расположении костей, отвечающих за деформируемую часть пружины: они смещены друг относительно друга на величину толщины сечения. Именно поэтому при одновременном масштабировании относительно своих точек привязки этих костей расстояния между врхними и нижними точками сечения пружины остаеться неизменным и равным смещению.
Конечно справедливости ради стоит добавить что при растяжении или сжатии пружины сечения должны не только перемещаться вдоль оси, а еще и «закручиваться». Но при небольших изменениях длинны пружины это в глаза не кидается, да и для не очень больших нужно присматриваться, чтоб заметить несоответствие с реальной жизнью. Но и это тоже можно решить, разместив косточки, отвечающие за деформируемую часть пружины, строго по оси пружины и повесив на них еще один контроллер, который будет их вращать вокруг оси пружины и изменять смещение относительно друг друга. Формулы там конечно будут пострашнее и оставляются для настоящих фанатов сделать все как в реальности. Целью было показать основной принцип костевой анимации пружин и вроде она была достигнута.
Источник
3D Studio MAX: первые шаги. Урок 23. Построение иерархий с помощью системы костей Bones
В предыдущих уроках мы ознакомились с методами прямой и обратной кинематики, при которых иерархические связи передаются от предков к потомкам либо наоборот. И в том, и в другом случае мы строили иерархические цепочки вручную, связывая отдельные объекты между собой, однако построить полноценную иерархическую модель таким способом проблематично, ведь большинство моделей представлено множеством взаимосвязанных и весьма сложных по структуре элементов, которые при движении должны изменяться согласованно. Одним из альтернативных способов формирования связанных иерархических структур является построение иерархий с помощью системы костей Bones. Простые примеры создания подобных иерархических цепочек мы и рассмотрим в данном уроке.
Теоретические аспекты
Понятие системы костей
Кости (Bones) — это особый тип иерархически связанных между собой объектов, которые чаще всего используются для анимации других объектов или иерархий, так как позволяют манипулировать телом персонажа. Как правило, подобная система костей помещается внутрь тела персонажа (то есть имитирует его скелет — рис. 1) и определяет последовательность и особенности связывания отдельных его элементов между собой, при этом каждая часть тела привязывается к своей косточке. Обычно анимируемый персонаж состоит из единой системы Bones.
Рис. 1. Пример системы костей, помещенной внутрь тела персонажа
За создание костей отвечает тип объектов Bones категории Systems (Системы) панели Create (Создать) — рис. 2. Технология их создания напоминает создание линейных сплайнов. Нужно щелкнуть левой кнопкой мыши в одном из окон проекций в точке положения начального сустава первой кости, затем там, где должен быть второй сустав, — при этом на экране визуально будет отображена лишь первая кость, расположенная между двумя суставами. Каждый последующий щелчок левой кнопкой мыши будет добавлять к системе одну кость, а нажатие правой кнопки мыши прекратит создание системы костей, при этом на конце цепочки появится дополнительная маленькая кость, используемая при назначении инверсной кинематики (если для данной иерархии применение IK-кинематики не предполагается, то дополнительную кость можно удалить). В случае создания ветвящейся иерархии (например, от тазовой кости должны отходить две ноги) вначале создается цепочка костей только что описанным способом (основная ветвь), затем при активной кнопке Bones левой кнопкой щелкают на той кости (в частности, на тазовой кости), от которой должна отходить вторая цепочка, а потом формируют дополнительную ветвь костей — она уже окажется привязанной к основной ветви. Созданным костям (так же как и иным объектам) присваиваются шаблонные имена: Bone01, Bone02 и т.п., которые лучше заменять на более информативные. Полученный в итоге скелет образует готовый иерархический каркас (рис. 3). Поскольку иерархия генерируется автоматически в процессе создания системы костей, первая созданная кость становится Root-объектом, а каждая новая кость добавляется в качестве дочерней для предыдущей кости.
Рис. 2. Категория Systems с активированным типом объектов Bones
Рис. 3. Иерархическая структура костей для персонажа
Bones-объекты отображаются в окнах проекций, но невидимы при визуализации. Однако при необходимости они могут отображаться — для этого следует включить флажок Renderable (Визуализируемый) в диалоге ObjectProperties (рис. 4), вызываемом из контекстного меню либо командой Edit=>ObjectProperties (Редактирование=>Свойства объекта).
Рис. 4. Включение флажка Renderable
Кости имеют ряд параметров: ширину (Width), высоту (Height), заострение (Taper) и плавники (Fins). Последние представляют собой своеобразные выступы вдоль кости и по умолчанию отключены (рис. 5). Данные параметры определяют форму костей и могут упрощать управление ими — например плавники облегчают контроль над вращением костей и могут помочь в процессе создания кожи. Названные параметры определяются непосредственно при создании скелета либо редактируются позднее — через панель Modify (свиток Bone Parameters — рис. 6) или окно BoneTools (команда Character=>BoneTools — Персонаж=>Параметры костей) — рис. 7.
Рис. 5. Пример костей с плавниками, настроенными различным образом
Рис. 6. Свиток BoneParameters
Рис. 7. Окно BoneTools
Окно BoneTools наряду с параметрами костей позволяет осуществить с ними множество других преобразований:
- изменить длину кости (режим BoneEditMode);
- создать новую цепочку костей (CreateBones);
- создать конечную косточку на конце выбранной (CreateEnd);
- создать кость, соединяющую выбранную и любую другую (ConnectBones);
- удалить из цепочки выбранную кость без уничтожения родительских отношений (RemoveBone);
- удалить выбранную кость с уничтожением родительских отношений (DeleteBone);
- сделать выбранную кость Root-костью иерархической структуры (ReassignRoot);
- разбить выбранную кость на две кости с автоматическим созданием сустава между ними (Refine);
- получить зеркальное отображение выбранной кости (Mirror).
Создание структуры костей
Создайте новую сцену, нажмите на панели Create кнопку Systems и активируйте инструмент Bones. Удостоверьтесь, что в свитке IK Chain Assignment (Назначение IK-цепи) флажки Assign to Children (Назначить для потомков) и Assign to Root (Назначить для Root-объекта) отключены (рис. 8). Активируйте окно проекции Left, щелкните в левом верхнем углу окна, затем передвиньте курсор немного вправо и вниз и кликните снова (появится первая кость). Аналогичным образом создайте еще три кости и завершите Bones-структуру нажатием правой кнопки (рис. 9). Если длина какой-то из костей оказалась меньше либо больше желаемой, то ее несложно изменить, но не через панель Modify (в свитке доступных для редактирования на данной панели параметров длина отсутствует), а через окно BoneTools. Для примера откройте данное окно, воспользовавшись командой Character=>BoneTools, включите режим редактирования костей, щелкнув на кнопке BoneEditMode, и измените длину любой из костей, перемещая инструментом SelectandMove ее дочернюю кость (рис. 10). По окончании выключите режим BoneEditMode.
Рис. 8. Свиток IKChainAssignment
Рис. 9. Исходная структура костей
Рис. 10. Изменение длины первой кости
Воспользовавшись инструментом SelectandMove, попробуйте произвольным образом переместить вначале первую кость (то есть Root-объект), а затем любую другую и обратите внимание, что перемещение Root-объекта приводит к перемещению всей структуры костей, а перемещение любой другой кости обеспечивает перемещение данной кости вместе со всеми ее дочерними объектами, при этом непосредственный родитель данной кости вращается. В то же время перемещение последней кости никак не повлияет на остальные, так как дочерних объектов у нее нет. Все это говорит о том, что иерархическая цепочка управляется по законам прямой кинематики — это действительно так, поскольку при отключенных флажках Assign to Children и Assign to Root IK-контроллер к системе костей не применяется.
Назначить системе костей IK-контроллер можно двумя способами — вручную или автоматически. Первый вариант применяется к уже готовой системе костей с помощью команды Animation=>IKSolvers (Анимация=>IK-решения), предусматривающей присваивание объектам одного из возможных типов IK-контроллеров (HISolver, HDSolver и т.д.), — такой способ позволяет настроить инверсную кинематику максимально точно. Второй вариант требует изменения настроек свитка IKChainAssignment (нужно установить назначение IK-контроллера включением соответствующих флажков и выбрать его тип) еще перед созданием системы костей, тогда указанное IK-решение будет автоматически применено ко всем костям системы.
Для примера вначале попробуем изменить тип кинематики для системы костей в рабочей сцене. Выделите Root-кость и назначьте цепи контроллер HISolver, применив команду Animation=>IKSolvers=>HISolver и указав в качестве конечного эффектора маленькую кость, — при выполнении данного действия за курсором мыши будет тянуться пунктирная линия. Это приведет к созданию цепи инверсной кинематики с IK-контроллером, о чем будет свидетельствовать появление линии, простирающейся от первой кости к последней, и перекрестия (целевой объект IKGoal) в опорной точке эффектора (рис. 11). Если попробовать подвигать перекрестие, то мы увидим, что это приводит к соответствующим изменениям положения остальных элементов (значит, к Bones-системе применено IK-решение).
Рис. 11. Формирование IK-цепи: процесс связывания объектов в IK-цепь (слева) и вид Bones-системы с IK-цепью (справа)
Теперь создадим подобную систему костей с IK-кинематикой уже в автоматическом режиме. Перезагрузите сцену, применив команду File=>Reset. Активируйте инструмент Bones, включите в свитке IKChainAssignment флажки AssigntoChildren и AssigntoRoot и удостоверьтесь, что в списке IK Solver установлен вариант IKHISolver. При включенном флажке AssignToChildren указанное IK-решение применяется ко всем создаваемым костям, исключая Root-кость, а если включен еще и флажок AssigntoRoot, то данное IK-решение будет применено ко всем костям без исключения. Активируйте окно проекции Left и обычным образом создайте систему из двух основных костей и одной дополнительной (рис. 12) — в итоге все кости окажутся связанными с контроллером HISolver. Будем условно считать, что созданные кости представляют собой плечо, локоть и кисть. Дополним теперь данную Bones-систему тремя пальцами (представим, что это скелет руки некого трехпалого существа). Переключитесь в проекцию Top, вновь активируйте инструмент Bones, щелкните на дополнительной маленькой кости и создайте первый палец (для упрощения задачи ограничимся одной фалангой пальца), немного переместив мышь вниз и влево (рис. 13). Аналогичным образом создайте два других пальца (рис. 14). Выделите первую основную кость и свяжите ее со второй, применив команду Animation=>IKSolvers=>HISolver и указав в качестве конечного эффектора вторую кость, — в точке соединения костей появится перекрестие (рис. 15). Для удобства работы переименуйте кости, назвав первую кость Shoulder, вторую — Upper Arm, третью (то есть дополнительную) — Lower Arm, а пальцы — Finger1, Finger2 и Finger3 соответственно. Вид иерархии полученной в итоге структуры костей представлен на рис. 16
Рис. 12. Вид исходной IK -цепи
Рис. 13. Появление первого пальца
Рис. 14. Появление второго и третьего пальцев
Рис. 15. Окончательный вид IK -цепи
Рис. 16. Вид иерархической цепочки в окне Select Object
Попробуйте поперемещать кость Shoulder, а затем перекрестие в области кисти, и вы увидите, что рука изгибается немыслимым образом (рис. 17). Поэтому придется настроить пределы ограничений на скольжение (Sliding) и вращение (Rotational). Поскольку плечевой сустав не должен двигаться, выделите кость Shoulder и у параметров SlidingJoints включите флажки Active и Limited в отношении всех трех осей при значении ноль в полях From и To (рис. 18). Выделите кость Upper Arm и подберите допустимые пределы ограничений скольжения относительно оси Y для локтевого сустава — мы остановились на значениях From — –20 и To — 20 (рис. 19). Выделите первый палец (кость Finger1), заблокируйте для него скольжение по осям X и Y, но разрешите скольжение относительно оси Z. Кроме того, запретите для данной кости в свитке Rotational Joints вращение относительно оси X, но разрешите вращение относительно осей Y и Z, ограничив при этом вращение относительно оси Z в интервале примерно от –30 до 30 (рис. 20). Аналогичные ограничения и запреты наложите и для двух других пальцев. После этого оцените результат, перемещая цепь IK Chain01 влево/вправо (рис. 21) и вверх/вниз, и убедитесь, что локтевой сустав и кисть теперь ведут себя уже вполне естественным образом (рис. 22).
Рис. 17. Результат перемещения Root-кости до настройки пределов ограничений
Рис. 18. Настройка параметров свитка SlidingJoints для кости Shoulder
Рис. 19. Настройка параметров свитка SlidingJoints для кости Upper Arm
Рис. 20. Настройка параметров свитков SlidingJoints и RotationalJoints для кости Finger1
Рис. 21. Перемещение цепи IK Chain01
Рис. 22. Вид визуализированной системы костей при имитации некоторых видов движения
Источник