3D Studio MAX: первые шаги. Урок 21. Иерархия и прямая кинематика

Светлана Шляхтина

Теоретические аспекты

Понятие иерархии

Управление иерархическими цепочками

Примеры анимации иерархически связанных объектов

Кручение колеса

Вращение Земли вокруг Солнца

Слежение за движущимся объектом

Шевеление щупалец морского обитателя

Любая сцена состоит из огромного числа объектов, для удобства работы с которыми используют различные варианты их объединения. С одной стороны, это позволяет в последующем выполнять ряд действий сразу в отношении целой группы объектов, а с другой — приводит к тому, что преобразование одного объекта автоматически вызывает преобразование другого. Возможны два подхода к формированию подобных связей. Можно объединить объекты в группы, в которых все объекты являются подчиненными и равноправны между собой. А можно установить между объектами взаимоотношения «предок/потомок», где предок — старший элемент, а потомок — подчиненный элемент иерархического соотношения. Выбор варианта объединения объектов зависит от конкретной ситуации. Обычно в группы объединяют составные элементы сложного объекта и часто повторяющиеся наборы однотипных объектов. А связь «предок/потомок» устанавливают для тех наборов объектов, которые при анимации должны перемещаться согласованно, но при этом у дочерних объектов должна оставаться возможность совершения независимых движений (колеса вращаются и перемещаются вместе с автомобилем, кисть сгибается и перемещается одновременно с рукой и т.п.). С группами объектов мы уже неоднократно сталкивались ранее, а в данном уроке рассмотрим простые примеры применения иерархических связей типа «предок/потомок».

Теоретические аспекты

Понятие иерархии

Иерархия — это набор объектов со связями между ними, при условии, что объекты объединены между собой по принципу «предок/потомок» (рис. 1). Предок — это объект, который контролирует поведение одного или более потомков. Некоторые предки сами могут контролироваться другими предками, имеющими более высокий уровень иерархии. Потомок — объект, контролируемый предками, который одновременно может оказаться родительским для других потомков, находящихся по иерархии ниже его. У каждого предка может быть много потомков, но всякий потомок имеет только одного предка. Самый верхний объект иерархии (ни для одного другого объекта он не является потомком) управляет всеми объектами иерархии и называется корневым, или Root-объектом.

 

Рис. 1. Пример иерархической цепочки из десяти сфер

Рис. 1. Пример иерархической цепочки из десяти сфер

 

Подобный способ объединения объектов позволяет настраивать сложные анимационные движения, при которых путем назначения связи «предок/потомок» можно передавать движение от одного объекта к другому — то есть, перемещая один из входящих в иерархическую цепочку объектов, одновременно перемещать и другие объекты, с ним связанные. Классический пример подобной иерархии — нога человека, представляющая собой иерархическую цепочку из нескольких объектов: бедра, голени, ступни и пальцев. Главным в данной структуре является бедро, и его перемещение приводит одновременно к перемещению голени, ступни и пальцев, причем каждый из данных объектов, перемещаясь с бедром, сохраняет возможность двигаться независимо. Например, при ходьбе все объекты цепочки перемещаются в некотором направлении (задаваемым бедром) и одновременно при этом голень, ступня и пальцы совершают вращательные движения, соответствующие сгибанию в суставах.

Назначение или разрушение связей регулируется расположенными на главной панели инструментами SelectandLink (Выделить и связать) и UnlinkSelection (Разорвать связь с выделенным) — рис. 2. Первый позволяет установить связь между дочерним и родительским объектом, а второй — разрушить связь опять же между объектом-потомком и объектом-предком (при этом связи с нижележащими в иерархии дочерними объектами, если таковые существовали, сохраняются). Для связывания объектов в иерархическую структуру вначале активируется инструмент SelectandLink, затем им выделяется самый младший в предполагаемой структуре объект (или сразу несколько объектов, если они должны располагаться на одном иерархическом уровне), и при нажатой левой кнопке мыши указывается объект, который должен стать родительским для данных объектов. Затем выделяется второй снизу в структуре объект, и в отношении него производится точно такая же операция — и так до тех пор, пока не будет установлена связь с Root-объектом. Разорвать связь проще — достаточно выделить объект, связь которого с вышестоящим в иерархии должна быть уничтожена, и щелкнуть на кнопке UnlinkSelection.

Рис. 2. Кнопки SelectandLink и UnlinkSelection

Рис. 2. Кнопки SelectandLink и UnlinkSelection

 

Для примера смоделируйте набор из 10 торусов (рис. 3). Для этого проще вначале создать один торус, а затем применить к нему операцию Array (команда Tools=> Array — Инструменты=>Массив) с параметрами как на рис. 4. Соедините все торусы в иерархическую цепочку. Выделите последний торус (Torus10), щелкните на кнопке SelectandLink и, не отпуская кнопку мыши, укажите на Torus09. Курсор при этом должен изменить свою форму, а торус Torus09 на мгновение выделится, что будет свидетельствовать об установлении связи. Выделите Torus09 и точно так же свяжите его с Torus08 — и так далее до Torus01.

 

Рис. 3. Исходный набор торусов

Рис. 3. Исходный набор торусов

 

Рис. 4. Параметры настройки операции Array

Рис. 4. Параметры настройки операции Array

 

Убедиться в том, что нужные связи установлены, можно через окно Select by Name (или Select Parent, вызываемое тем же инструментом, но при активной кнопке Select and Link), где при условии включения флажка Display Subtree объекты будут отображаться с учетом их иерархической структуры (рис. 5). Однако есть лучший способ — можно активировать панель Display (Отображение), отвечающую за управление отображением объектов сцены в окнах проекций, и в свитке LinkDisplay для каждого из объектов включить флажок DisplayLinks (Отображать связи) — рис. 6. Естественно, данную операцию разумнее провести сразу для всех десяти торусов одновременно, предварительно выделив их. Включение названного флажка приведет к тому, что между объектами появятся отображающие направление связей объемные стрелки, правда последние будут плохо видны. Поэтому удобнее временно установить для всех объектов полупрозрачный вариант отображения, включив в свитке DisplayProperties (Свойства отображения) панели Display (Отображение) флажок See-Trough (Видеть насквозь) — объекты станут серыми и полупрозрачными, и связи между ними будут видны гораздо лучше (рис. 7).

 

Рис. 5. Вид иерархической цепочки в окне Select Parent

Рис. 5. Вид иерархической цепочки в окне Select Parent

 

Рис. 6. Включение опции DisplayLinks

Рис. 6. Включение опции DisplayLinks

 

Рис. 7. Вид объектов после изменения варианта их отображения

Рис. 7. Вид объектов после изменения варианта их отображения

 

Структура иерархий видна также в окне редактора треков TrackView (Просмотр треков), открытом, например, в режиме работы с кривыми (CurveEditor) — рис. 8, где отображаются все объекты сцены (как связанные, так и несвязанные). Несвязанные объекты по умолчанию считаются дочерними по отношению к некоторому вымышленному глобальному объекту (World).

 

Рис. 8. Окно Track View — Curve Editor с иерархической цепочкой

Рис. 8. Окно Track View Curve Editor с иерархической цепочкой

В начало В начало

Управление иерархическими цепочками

Положение и ориентация связанных в некую иерархическую структуру объектов не только определяется формой иерархии, но зависит также от выбранного метода управления цепочкой. Таких методов два: прямая кинематика и инверсная (или обратная) кинематика. В случае прямой кинематики иерархические связи передаются от предков к потомкам, то есть дочерние объекты наследуют поведение родительских и с ними происходят те же самые преобразования (перемещение, масштабирование и т.д.). В то же время трансформация потомка не вызывает трансформации родительского объекта. Инверсная кинематика работает по-иному — потомки приводят в движение родительские объекты. Иными словами, задается положение и ориентация потомка, и по этим данным программа сама рассчитывает положение и ориентацию родительских по отношению к потомку объектов. Выбор метода производится на панели Hierarchy (Иерархия) — рис. 9, предназначенной для управления связями. По умолчанию используется метод прямой кинематики — для активирования режима обратной кинематики следует открыть на панели Hierarchy закладку IK и щелкнуть на кнопке Interactive IK.

 

Рис. 9. Панель Hierarchy

Рис. 9. Панель Hierarchy

 

Рассмотрим отличия поведения связанных объектов в каждом из данных методов на примере созданной иерархической цепочки торусов. Выделите первый в цепочке торус Torus01 и переместите его вверх по оси Y — вместе с ним переместятся и все остальные торусы, являющиеся по отношению к первому торусу дочерними. В то же время перемещение последнего торуса никак не повиляет на остальные, поскольку дочерних объектов у него нет (рис. 10). А теперь активируйте режим инверсной кинематики (кнопка Interactive IK) и повторите те же самые операции с перемещением первого и последнего торусов — перемещение первого торуса даст те же самые результаты, что и ранее, а вот изменение положения последнего элемента иерархии приведет к соответствующим изменениям положения остальных элементов (рис. 11).

 

Рис. 10. Поведение объектов в случае прямой кинематики — при перемещении первого (слева) и последнего (справа) торусов

Рис. 10. Поведение объектов в случае прямой кинематики — при перемещении первого (слева) и последнего (справа) торусов

 

Рис. 11. Поведение объектов в случае обратной кинематики — при перемещении первого (слева) и последнего (справа) торусов

Рис. 11. Поведение объектов в случае обратной кинематики — при перемещении первого (слева) и последнего (справа) торусов

 

Трансформацию цепочки объектов можно анимировать. Войдите в режим создания анимации с автоматической генерацией ключей, переместите ползунок на 50-й кадр и в окне Front переместите Torus10 вверх. После этого перетащите ползунок на последний кадр, верните торус вниз и выйдите из режима автоматической генерации ключей. Проиграв анимацию, вы увидите, что получится приближенная имитация движения реальной цепочки (рис. 12).

 

Рис. 12. Вид сцены в одном из промежуточных кадров анимации

Рис. 12. Вид сцены в одном из промежуточных кадров анимации

 

Как правило, связанные объекты должны трансформироваться только каким-то определенным образом, то есть все другие варианты трансформаций для них запрещены. Например, конкретный объект в цепочке может перемещаться относительно оси X, но не может двигаться вдоль осей Y и Z, равно как и вращаться или масштабироваться. Установка подобных запретов регулируется через закладку LinkInfo (Информация о связях) — рис. 13 — панели Hierarchy. На данной закладке имеются два свитка: Locks (Запирание) и Inherit (Наследование). Первый отвечает за установку запретов на конкретные виды трансформаций. Второй позволяет регулировать уровень наследования дочерними объектами свойств родительских объектов, то есть определять, какие трансформации и относительно каких осей должен повторять дочерний объект за своим предком. Кроме того, при сборке любой иерархической структуры необходимо сообщить программе, относительно каких центров (то есть опорных точек) вращаются связанные объекты, поскольку по умолчанию вращение производится относительно собственных физических центров объектов, а не точек соединения объектов друг с другом, что далеко не всегда верно. Данный аспект регулируется на закладке Adjust Pivot (Настройка опорной точки) панели Hierarchy.

 

Рис. 13. Закладка LinkInfo

Рис. 13. Закладка LinkInfo

 

Чтобы поэкспериментировать с упомянутыми настройками, создайте сцену с механическим манипулятором (рис. 14) — для удобства назовите детали манипулятора в соответствии с приведенным рисунком. Последовательно, начиная с объекта Hand, свяжите все детали друг с другом в соответствии со схемой, приведенной на рис. 15. Теперь по замыслу нужно сделать так, чтобы объекты Arm, Horizontal Shaft и Hand (условно назовем данные объекты штангой) как единое целое могли поворачиваться относительно оси X (это будет соответствовать подъему всей конструкции вверх под некоторым углом), а объект VerticalShaft со всеми своими потомками — относительно оси Z (что будет приводить к развороту манипулятора). Посмотрим, насколько это возможно сразу после связывания при установленной по умолчанию прямой кинематике.

 

Рис. 14. Исходный вид манипулятора

Рис. 14. Исходный вид манипулятора

 

Рис. 15. Иерархическая цепочка, соответствующая манипулятору

Рис. 15. Иерархическая цепочка, соответствующая манипулятору

 

Выделите объект VerticalShaft и поверните его относительно оси Z — он вместе со всеми дочерними объектами развернется требуемым образом (рис. 16). Правда, при условии, что вы окажетесь внимательными и будете визуально ограничивать вращение по другим осям в процессе вращения. Гораздо удобнее и надежнее (хотя и не всегда обязательно) устанавливать запреты на те варианты трансформаций, которые с объектом происходить ни в коем случае не должны. В данном случае объект VerticalShaft не может вращаться по двум другим осям, а также перемещаться и масштабироваться по всем трем осям. Установим названные ограничения: откройте на панели Hierarchy закладку LinkInfo и в свитке Locks включите флажки для всех трансформаций, кроме вращения относительно оси Z (рис. 17). После этого (даже при желании) произвести в отношении объекта VerticalShaft запрещенные трансформации уже не удастся. Выделите теперь объект Arm и разрешите ему поворачиваться относительно оси X, запретив все прочие варианты трансформаций. Поверните данный объект относительно оси X (рис. 18), и вы увидите, что штанга поворачивается не относительно места соединения с объектом Hinge, а относительно собственного физического центра, что неправильно. Поэтому отмените последнюю трансформацию, откройте на панели Hierarchy закладку Adjust Pivot, щелкните на кнопке AffectPivotOnly (Воздействие на центр связывания) — теперь опорная точка находится в физическом центре объекта. Переместите ее в точку соединения с объектом Hinge (рис. 19) и выйдите из режима редактирования опорных точек, щелкнув еще раз на кнопке AffectPivotOnly, — после этого штанга при подъеме уже будет поворачиваться относительно точки соединения с объектом Hinge, что и требовалось (рис. 20).

 

Рис. 16. Результат поворота объекта VerticalShaft

Рис. 16. Результат поворота объекта VerticalShaft

 

Рис. 17. Настройка запретов для объекта VerticalShaft

Рис. 17. Настройка запретов для объекта VerticalShaft

 

Рис. 18. Результат поворота объекта Arm до перемещения опорной точки

Рис. 18. Результат поворота объекта Arm до перемещения опорной точки

 

Рис. 19. Положение опорной точки: изначально (слева) и после перемещения (справа)

Рис. 19. Положение опорной точки: изначально (слева) и после перемещения (справа)

 

Рис. 20. Результат поворота объекта Arm после перемещения опорной точки

Рис. 20. Результат поворота объекта Arm после перемещения опорной точки

 

Теперь движения манипулятора можно анимировать. Отмените последнее действие. Увеличьте число кадров анимации до 200. Переключитесь в 0-й кадр, включите режим автоматического создания анимационных ключей, активируйте 50-й кадр, выделите объект Arm и поверните его на –20° относительно оси X. Перейдите в 100-й кадр, выделите объект VerticalShaft и поверните его на –70° относительно оси Z. В 150-м кадре верните объект Arm в первоначальное положение, а в 200-м кадре верните в первоначальное положение объект VerticalShaft, выйдите из режима генерации ключей. Проиграйте анимацию — манипулятор будет плавно вращаться, поднимая и опуская штангу (рис. 21).

 

Рис. 21. Вид манипулятора в одном из кадров анимации

Рис. 21. Вид манипулятора в одном из кадров анимации

 

Нередко в качестве составных элементов иерархической цепочки наряду с обычными визуализируемыми объектами используются фиктивные объекты-пустышки — объекты типа Dummy, доступные из категории Helpers панели Create. Данные объекты не отображаются при рендеринге, а в окнах проекций представлены в виде каркасных кубов (рис. 22). Основное назначение объектов Dummy — установка связей между отдельными составляющими сложной иерархической структуры для организации связанной анимации. Например, можно использовать подобный фиктивный объект в качестве центра вращения, связывая с ним множество различных визуализируемых объектов — тогда при вращении фиктивного объекта будут вращаться и все связанные с ним другие объекты. Другим широко распространенным направлением применения Dummy-объектов является анимация нацеленных камер и источников света. В таком случае объект-пустышка и камера (или источник света) связываются в иерархическую структуру, где камера с мишенью является потомком фиктивного объекта. После этого достаточно будет назначить траекторию движения объекту-пустышке с его автоматическим поворачиванием в соответствии с направлением вектора движения (флажок Follow в свитке PathParameters панели Motion), и это обеспечит автоматическое следование камеры за фиктивным объектом. Причем направление мишени камеры всегда будет соответствовать направлению вектора движения, а сама камера будет следовать за объектом на указанном расстоянии, автоматически настраивая позиционирование.

 

Рис. 22. Отображение фиктивного объекта в окне проекции Perspective

Рис. 22. Отображение фиктивного объекта в окне проекции Perspective

 

Для примера перезагрузите сцену (команда File=> Reset) и создайте произвольный криволинейный сплайн, объект типа Dummy (команда Create=>Helpers=> Dummy) и произвольный сложный объект, предназначенный для перемещения по сплайну (мы остановились на группе объектов в виде куба и двух шаров) — рис. 23. Выберите объект-пустышку и примените к нему команду Animation=>Constraints=>PathConstraint (Анимация=>Ограничения=>Ограничения пути), указав в одном из окон проекций сплайн пути. Откройте панель Motion (Движение) и в свитке PathParameters (Параметры пути) установите флажок для параметра Follow (Следовать) — рис. 24. Данное действие обеспечит не только следование объекта-пустышки вдоль пути, но и его автоматическое поворачивание в соответствии с направлением вектора движения. При необходимости отрегулируйте положение фиктивного объекта в нулевом кадре так, чтобы он располагался на спирали. Теперь нужно настроить движение основного объекта (то есть куба с двумя шарами) — это можно реализовать и без объекта Dummy, но на практике внедрение в сцену фиктивного объекта, которому непосредственно и назначается перемещение, часто заметно упрощает управление сложными объектами, поэтому мы пойдем по данному пути. Выделите все три элемента основного объекта (то есть куб и два шара) и свяжите их с объектом Dummy, а затем выровняйте относительно него по всем трем осям. Проиграйте анимацию и убедитесь, что основной объект полностью унаследовал особенности перемещения фиктивного объекта, так как движется по спирали задуманным образом (рис. 25).

 

Рис. 23. Исходный вид сцены

Рис. 23. Исходный вид сцены

 

Рис. 24. Настройка параметров движения объекта Dummy

Рис. 24. Настройка параметров движения объекта Dummy

 

Рис. 25. Вид сцены в нескольких кадрах анимации

Рис. 25. Вид сцены в нескольких кадрах анимации

В начало В начало

next

КомпьютерПресс 11'2007


Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует