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. Вид визуализированной системы костей при имитации некоторых видов движения