Вы находитесь на странице: 1из 204

—A— Кривая анимации, 8

Целевой ограничитель, 19 —Л—


—B— Локализованное скручивание, 43
Bugzilla, 55 Локатор, 9
—C— —М—
Character Studio, 85, 86 Маппинг в Trax, 58
—M— Математические узлы, 69
MEL-скрипт makeSandS, 14 Модель без истории, 35
MEL-скрипт parentShape, 4 Модель для кино, 36
—N— Модель низкого разрешения, 59
normalConstraint, 18 —Н—
—S— Неравномерный масштаб, 13
Set Driven Key, 9 Нечисловые соединения, 7
Shape-узел, 3 —О—
—U— Общее скручивание, 43
Utility-узел, 10 —П—
—Z— Параметр ikBlend, 16
zooObjectMenu, 81 Параметр scaleX, 13
—А— Параметр scaleY, 13
Атрибут, 4 Параметр растяжения, 16
атрибут ikStretch, 16 FK-решатель спины, 85
Атрибут inMesh, 7 Канал, 5
Атрибуты веса, 11 Выходной канал, 5
—Б— Плагин animImportExport, 34
База данных для отслеживания ошибок, Повороты относительно перемещений, 77
55 Поза да Винчи, 32
БлендШэйп Поза для текстурирования, 33
—Г— Поза модели, 33
Гиперграф, 6 Первичная поза привязки, 22
Грубое управление, 69 Поза сборки, 33
—Д— Полигональный меш, 3
Поток, 5 Пределы вращения, 63
Деформирующий узел, 3 Привязка объекта, 21
Дополнительные инструменты, 81 —Р—
—З— Размер и масштаб, 31
Заданная форма выделения, 4 растяжение, 12
—И— Реверсный узел, 11
Игровая модель, 36 Рендер-узел, 7
Инструмент IKманипулятор, 15 —С—
Инструмент Joint, 13 Сервер WIKI, 55
Инструмент Orient Joint, 56 сжатие, 12
Инструмент Prefix, 57 Скалярное произведение, 19
Инструмент выравнивания, 21 Скелет первичной привязки, 34
Исследование и разработка, 38 Скелет сборки, 34
—К— Соединение, 5
команда makeSandS, 14 Соединение unitConversion, 6
Команда setKeyFrame, 10 Составные ограничители, 11
Команда xform, 21 Сочленения
Контактные центральные точки, 39 жесткость, 61
кривая NURBS, 4 размещение и движение, 41
—Т— Узел pCube1Shap, 2
Тип boolean, 4 Узел pCubeShape1, 6
Тип float, 4 Узел plusMinusAverage, 69
Тип integer, 4 Узел polyCube1, 2
Тип message, 5 Узел vectorProduct, 19
Тип string, 5 Узел измерения, 22
—У— Узел с условием, 11
Узел, 2 Узел-описание, 93
поток данных, 2 Узел трансформы, 2
Узел animCurve, 8 Узлы создания, 7
Узел arrowShape, 8 —Ф—
Узел curveInfo, 17 Файл позы, 34
Узел curveLengthRatio, 17 Файл сборки, 34
Узел DagPose, 22 Форма выделения, 4
Узел initialShadingGroup, 2 Формат .FBX, 35
узел multiplyDivide, 14 —Ч—
Узел pCube1, 6 Чистый файл, 35
Любви моей жизни – жене Дженнифер и нашей восхитительной малышке Изабелле: спасибо за
то, что вы – часть этого долгого путешествия, потому что без вас я не смог бы совершить его. Брэд
Кларк
Сандре и Расселу Ходж за их любовь и терпение и всем моим друзьям, которые никогда не
переставали верить в меня. Джон Худ
Биллу Питу, чьи рассказы спокойно стоят в моем книжном шкафу как напоминание о детстве, и
чья автобиография вдохновила меня последовать за моими мечтами. Джо Харкинс

Благодарности
Брэд Кларк
Дженнифер, спасибо за всю твою помощь и за поддержку в те 12 месяцев, что я работал над этой
книгой. Ты дала мне одобрение и любовь, в которых я нуждался, чтобы взяться за эту задачу.
Мои родители, дедушка и бабушка, благодаря которым мой интерес к искусству перерос в
жизненный путь – я благодарю вас. Мой дедушка Роберт Купер (Robert Cooper), который покинул
этот мир, пока я работал над книгой, спасибо тебе за бесконечное количество материалов по
искусству, книг по анимации и знания, которые ты дал мне в течение всей моей жизни. Я буду
вечно благодарен тебе.
Некоторым из лучших друзей, которые только могут быть – Йорме Обурн (Jorma Auburn) и
Джону Худу (John Hood). Без вас эта книга была бы лишь шелухой. Спасибо за энергию и
терпение и за беседы в 4 часа утра о MEL, ИК и всем, что приходило в голову в столь раннее
время утра. Йорма, твоя модель для книги была просто блестящей; ты, наконец, сделала
двуногому существу ноги, которые не выглядели неуместно.
Джо Харкинсу (Joe Harkins), который согласился приняться за этот сумасшедший проект в
последние месяцы, чтобы выручить нас. Ты сделал потрясающую работу в короткий срок, и я не
смогу в достаточной мере отблагодарить тебя. Мы бы никогда не сделали этого без тебя.
Наконец, особая благодарность Майклу Форду (Michael Ford), Кайлу Кларку (Kyle Clark) и
Кевину Харрельду (Kevin Harreld), которые, в первую очередь, удостоили меня честью написать
эту книгу, и которые доверяли мне и подталкивали, когда мне казалось, что они выбрали не того
человека.

Джон Худ
Я бы хотел поблагодарить мою мать и Рассела за их любовь и доброту.
Я бы хотел поблагодарить Брэда Кларка (Brad Clark), без которого я бы никогда не вступил в
этот проект. Ты был со мной в трудные времена, и я благодарю тебя.
Лизе, которая всегда отвечала на звонок, когда мне было нужно поговорить, даже если было
поздно. Твои терпение и доброта были мне большим утешением.
Огромное спасибо Дастину Клингману (Dustin Clingman), Йорме Обурн, Касто Вокалу (Casto
Vocal) и Максу (Max). Вы, наверное, не знаете друг друга, но все вы были для меня огромным
источником вдохновения. Дастин, однажды мы сделаем механические костюмы и совершим
путешествие вокруг мира. Йорма, вы так вдохновляли меня в анимации. Без вас я бы не стал тем,
кем стал. Касто, наши пути всегда как будто пересекаются, и это всегда интересно. Макс, ты
всегда мог развеселить меня. Спасибо.
Лорна Ланнинг (Lorne Lanning), Шерри МакКенна (Sherry McKenna) и Oddworld Inhabitants,
спасибо за возможность учиться и расти.
Я бы хотел поблагодарить Кевина Харрельда, Марту Юстак (Marta Justak) и Джоша Кэри (Josh
Carey) за помощь и поддержу в этом проэкте.
И последнее, но не менее важное: особая благодарность Майку Форду и Кайлу Кларку за
возможность развивать мое мастерство на новом уровне.

Джо Харкинс
Дженн, спасибо за любовь и поддержку и за сопутствие во всем. Твое понимание и одобрение
были благословением этого проекта.
Моей семье, побуждавшей меня исследовать и создавать, поощрявшей во мне дух
изобретательства, мудрость которой вела меня по жизни. Ваша любовь и поддержка – самое
ценное для меня.
Всем в Tippett Studio, моим бывшим коллегам Полу Туриоту (Paul Thuriot), Дэвиду Ричарду
Нелсону (David Richard Nelson) и Мэттью Мантину (Mattew Muntean), которые научили меня
всему. Спасибо за понимание, огромный опыт и за бережное отношение ко мне.
Моему лучшему другу Мэтью Скотту (Mattew Scott), за возможность разделить с ним это
необычайное путешествие в анимации, за все сумасшедшие уикенды, за то, что он – настоящий
друг. Раймонду Свонланду (Raymond Swanland), Лорне Ланнинг и всем чудесным людям из
Oddworld Inhabitants за то, что делились со мной творческим взглядом и чудесными персонажами,
за то, что помогли мне чувствовать себя как дома.
Особенная благодарность Брэду Кларку за то, что он дал мне эту возможность, и за постоянную
помощь. Спасибо Джону Худу, Майку Форду и Джошу Кэри за ценный вклад. Спасибо Кэвину
Харрельду и Марте Юстак, воплотившим этот проект в жизнь.

Авторы также хотели бы отдать должное заслугам


следующих людей:
Джоша Кэри, нашего технического редактора, интенсивно трудившегося сверх своих
обязанностей, чтобы проработать и перепроверить всю техническую часть книги. Спасибо тебе,
Джош, за дополнительную помощь. На последнем этапе редактирования он даже нашел время,
чтобы написать для нас руководство по лицевому риггингу.
Даниэля Лэмота (Danielle Lamothe) и команды Alias® за предоставление программного
обеспечения и помощь в создании контента книги. Благодарность от всех авторов.
Особое признание и долг благодарности всем участвовавшим художникам и техническим
директорам по персонажам. Это Флойд Бишоп (Floyd Bishop) и Bishop Animation, Джош Кэри и
The Animation Farm, Майк Комет (Mike Comet), Рамахан Фолк (Ramahan Faulk), Стэф Гринберг
(Steph Greenberg), Кейт Ланго (Keith Lango), Шахар Левави (Shahar Levavi), Рик Мэй (Rick May),
Чад Мур (Chad Moore), Калеб «Cro» Оуэнс (Caleb “Cro” Owens), Стив Талковски (Steve Talkowski)
и Hornet Inc., Стив Теодор (Steve Theodore).
Дополнительная благодарность Джейсону Шлейферу (Jason Schleifer), Эрику Миллеру (Erick
Miller), Джо Харкинсу и Полу Туриоту за их риггинг мастер-классы, вдохновлявшие и
послужившие большим подспорьем, когда пришло время писать книгу. И всем на форумах
http://jonhandhisdog.com и http://creatureTD.com. Парни, вы – огромная поддержка для новичков и
старших технических директоров, спасибо за то, что помогали и постоянно делились идеями.
И еще: Джим Блум (Jim Bloom), Даг Купер (Doug Cooper), Дэвид Галлахер (David Gallagher),
Рик Гранди (Rick Grandy), Майкл Иснер (Michael Isner), Свен Йенсен (Sven Jensen), Стив Келли
(Steev Kelly), Робин Линн (Robert Linn), Хэмиш Макензи (Hamish Mackenzie) (macroniKazoo), Шон
МакКлелланд (Shawn McClelland), Тим Нэйлор (Tim Naylor), Даг Нельсон (Doug Nelson), Джейсон
Осипа (Jason Osipa), Джейсон Паркс (Jason Parks), Бэй Рэйтт (Bay Raitt), Стивен Т. Л. Роселль
(Steven T. L. Rossele), Бен Раш (Ben Rush), Уилльям Тодд Стинсон (William Todd Stinson), Марк
Свэн (Mark Swain), Джефф Юнэ (Jeff Unay), Натан Уолпол (Nathan Walpole), Дэвид Уолден (David
Walden), Барри Уэйсс (Barry Weiss).
Создание основных персонажей
Дизайн персонажей: Джон Худ
Окончательная модель: Йорма Обурн
UV-развертка текстур: Чад Кендалл (Chad Kendall)
Создание текстур: Грегг Харгров (Gregg Hargrove) и Пио Раваджо (Pio Ravago)

Об авторах
Брэд Кларк
Брэд Кларк – отмеченный наградами художник и аниматор. В течение последних девяти лет
работал в широком диапазоне проектов – от моделирования и риггинга для телевидения и
видеоигр до редактирования данных движения Голума в фильме «Властелин колец. Две башни»
(«The Lord of the Rings: The Two Towers»). Его карьера провела его по всему земному шару: от
Флориды до Филиппин, от Техаса до Новой Зеландии. Брэд преподавал анимацию, персонажный
дизайн и настройку персонажей в Full Sail, обучал аниматоров 2D работе c SOFTIMAGE® в
Маниле и руководил обучением художников Acclaim Austin технологии захвата движения,
риггингу персонажей и созданию скриптов. Последние лекции и презентации он делал для
мастерской Conceptart.org и для мастер-класса по Alias 2004 года, посвященного продвинутому
искусству разработки игр. В настоящее время Брэд работает аниматором и техническим
директором по персонажам студии Animation Farm в Остине, штат Техас
Чтобы обратиться к Брэду и другим авторам с вопросами или предложениями, свяжитесь с
нами по адресу advancedrigging@gmail.com.
Фильмы:
 «Властелин колец. Две башни»
 «Тяжелый ущерб» («Major Damage»)
 «Robots_PSA» (ReelFx)
Телевизионные проекты:
 «Quest: Tales From the Ramayana»
Сфера интерактивных развлечений:
 «The Red Star»
 «NBA JAM ‘04»
 «VEXX»
 «NFL QBClub ‘02/’03»
 «ASB 2002»
 «SHOWDOWN: Legends of Wrestling»
 «Turok: Evolution»
 «100 Bullets»
 «Alias»
(Все игры произведены Acclaim Entertainment)

Джон Худ
Джон Худ – сын пчеловода – родился в болотах Центральной Флориды. Получив степень по
свободным наукам, Джон бросил перспективную работу в обувной торговле, преследуя мечту
стать компьютерным аниматором. Он начал карьеру в Full Sail в качестве координатора
компьютерной анимации. Переехав в Калифорнию для работы в сфере интерактивных
развлечений, он нашел доходное занятие во многих крупных компаниях, таких как Eidos,
Microsoft® и Oddworld Inhabitants. Сейчас он занимает должность технического аниматора в Sony
Pictures Imageworks (Лос-Анжелес, штат Калифорния) и работает над «Открытым сезоном» («Open
Season») – первым художественным фильмом SONY Pictures Animation.
Чтобы обратиться к Джону и другим авторам с вопросами или предложениями, свяжитесь с
нами по адресу advancedrigging@gmail.com.
Фильмы:
 «Открытый сезон»
Сфера интерактивных развлечений:
 «Soul Reaver» (Eidos)
 «Soul Reaver II» (Eidos)
 «Age of Mythology» (Ensemble Studios/Microsoft)
 «Stranger» (Oddworld Inhabitants)
Джо Харкинс
Джо Харкинс – технический директор по персонажам в Sony Pictures Imageworks. Сейчас он
разрабатывает визуальные эффекты художественного фильма «Призрачный гонщик» («Ghost
Rider»). В последнее время он работал над фильмом «Открытый сезон» – первым настоящим
полнометражным анимационным фильмом Sony.
Ранее Джо был техническим режиссером по персонажам в Tippett Studio (Беркли, штат
Калифорния), где занимался фильмами «Маска 2: сын Маски» («Mask 2: Son of the Mask») и
«Константин» («Constantine») (научно-фантастический триллер с Киану Ривзом в главной роли,
основанный на комиксах Hellblazer). В Tippett он также получил ценный опыт работы с такими
фильмами, как «Матрица: революция» («The Matrix: Revolution») и «Хеллбой» («Hellboy»).
Осмысление себя как технического художника позволило Джо поделиться своими знаниями с
другими путем публикаций в профессиональных журналах, таких как 3D World и Computer
Graphics, ведения мастер-класса по Maya в SIGGRAPH 2004, обучения студентов и
профессиональных художников. Он также был приглашенным лектором в 3December, в Академии
Университета искусств, в Expression Center и в Full Sail.
Вы можете обратиться к нему с вопросами или комментариями по адресу joe@creaturetd.com
или advancedrigging@gmail.com.
Художественные фильмы:
 «Лига выдающихся джентльменов» («The League of Extraordinary Gentlemen»)
 «Матрица: революция»
 «Хеллбой»
 «Маска 2: сын Маски»
 «Константин»
 «Открытый сезон»
 «Призрачный гонщик»
Телевизионные проекты:
Gatorade Commercial Campaign
GI Joe SpyTroops Commercial Campaign
GI Joe SpyTroops: The Movie
Введение
Риггер следующего поколения
Производство. Каждый, кто пережил хотя бы один проект в среде производства, знает, каким
лихорадочным оно может быть, каким напряженным, рискованным и веселым. Технический
директор по персонажам может сгинуть в урагане творчества и быть сметенным по
неосторожности. Этой книгой мы надеемся помочь вам, технический директор по персонажам (так
же известный как ТД по персонажам), научиться более совершенным техникам обращения с
возможной бурей.
Этой книгой мы хотим изменить ваш подход к риггингу. Успешный риггинг более осуществим,
если вы разобьете самые сложные проблемы на мелкие задачи. Мы предложим вам взглянуть не
на необъятный процесс работы, а на его отдельные компоненты и понять, как они объединяются в
единое целое. Разбиение риггинга на меньшие части также делает общую задачу более гибкой,
позволяет создать блоки инструментов и решений с возможностью использовать их повторно.
Если вы не работаете в большой студии, вы не можете обратиться за помощью в отдел
программирования и у вас нет шести месяцев для организации конвейера настройки персонажей
или создания кожной системы. Тогда вам приходится успевать сделать за день слишком много
работы, и у вас может не хватать времени на что-то большее, чем торопливое сведение очередной
сборки. Часто оказывается проще сразу приступить к работе над персонажем, не обдумывая
заранее общую задачу. Как бы то ни было, даже срочные задания следует планировать, чтобы
избежать неминуемых производственных проблем.
Этот тип анализа и продумывания – решающая часть процесса риггинга. Аккуратное
планирование – то, что часто отличает самостоятельного художника, который знает как выполнять
определенные действия, от профессионального ТД по персонажам, который действительно
«схватывает» суть риггинга. Вы можете заниматься движением без глубокого понимания, и это
сойдет вам с рук, но не тогда, когда перед вами стоят специфические проблемы риггинга. А если
вы работаете в студии и несете за свою работу ответственность перед другими людьми, то гораздо
сложнее заниматься риггингом, не наблюдая картину в целом. Мы надеемся расширить ваше
мышление до масштабов всего производственного процесса, и показать вам, что трата некоторого
времени вначале на корректную настройку персонажа действительно сохранит вашей команде
время и избавит от головной боли во время работы над проектом.
Для кого эта книга
Существует множество учебников по риггингу, доступны материалы на DVD, так зачем нужна
еще одна книга? Затем, чтобы прогрессировать как ТД по персонажам, а для этого вы должны
понимать, почему сборка делается определенным образом. Многие учебные материалы всего
лишь руководят вашими действиями, предоставляя вам самим догадываться о том, почему нужно
делать так, а не иначе, и как эти действия повлияют на сборку в будущем. Эта книга познакомит
вас с альтернативами, проблемами и решениями, с которыми приходится иметь дело
профессиональному ТД по персонажам. Мы надеемся, что это поможет вам лучше понять, что и
зачем вы сделали. У вас будут средства для решения сложных производственных проблем и
повышения как скорости, так и качества вашей работы, а также работы аниматоров, работающих с
вашей сборкой.
Мы писали эту книгу с мыслью о самостоятельном ТД по персонажам. Может быть, вы
единственный ТД по персонажам в студии видеоигр или один из немногих ТД, создающих
эпизодические телевизионные проекты и не имеющих времени на сложные сборки и симуляцию.
Вы могли сами вычислить установки персонажа, но обнаружить, что учебники и источники,
доступные в данный момент, не дают необходимых вам практических решений. С вашими
навыками риггинга вы можете настроить вращение ноги даже во сне или трехкомпонентную руку
в ИК/ФК, даже не выпив кофе с утра после целой ночи работы, но ваши текущие проекты и
команды начинают требовать большего. Вы хотите улучшить качество и эффективность вашей
работы, но не знаете как. Эта книга даст вам основание и направление, необходимые вам, чтобы
приступить к сложным задачам и начать расти как художник и техник.
Мы постараемся держать вас в курсе развития риггинга в Maya и детально охватить
фундаментальный процесс создания законченной сборки. Если что-то будет неладно, а так и
произойдет, у вас будет знание и понимание правильных рабочих процессов, чтобы вовремя
внести исправления и не потерять голову.
Мы проведем вас через идеи и примеры, чтобы удостовериться, что ваше понимание
фундаментальных принципов достаточно для будущего построения более сложной системы. Мы
также обсудим отношение риггинга к остальным этапам производства. По мере продвижения в
более сложные вопросы риггинга, мы будем пересматривать возможность повторного
использования кода и применения MEL в задачах автоматизации. Кроме того, некоторые вещи, с
которыми сталкивается большинство ТД по персонажам, но о которых не пишут в учебниках, –
это пропсы и особенности их стыковки с персонажами.
Деформации и скиннинг включают отношения между персонажной сборкой и её геометрией. В
этом разделе более детально излагаются основы, представленные в книге «Inspired 3D Characters
Setup», и обсуждаются распространенные проблемы деформирования персонажей, причины их
возникновения и способы решений. Другие главы по деформации описывают, как смешивать
техники и инструменты, чтобы добиться сложной текстуры кожи и движений мускулов, не
жертвуя скоростью и результативностью и не используя специальный плагин. Цель – создать
многослойные деформации с максимальным контролем над обликом персонажа. Никакой риггинг
не имеет значения, если его окончательный образ – плохо деформированное месиво со
сдавленными невзрачными контурами и растягивающимися, по причине плохого скиннинга,
текстурами.
Как технический художник, вы наверняка столкнетесь с массой программного обеспечения,
помимо Maya. Очень важно глубокое и всеохватное знание операционной системы компьютеров,
используемых в вашей студии. Большая часть работы ТД по персонажам будем сконцентрирована
на необходимости автоматизации процесса вне 3D приложения вашего главного компьютера,
когда от вас требуется применение .bat файлов и основных скриптов, а также автоматизация таких
действий, как инсталяция инструментов, обновление моделей, разметка дисков, получение
доступа к управлению версиями программного обеспечения (как Alien Arain) и манипуляция
операционной системой. К счастью, есть несколько крупных веб-ресурсов, обучающих
созданию .bat файлов в Windows и основных скриптов в UNIX. Конечные результаты этих
маленьких быстрых скриптов – важная часть интеграции производственного процесса, они могут
творить чудеса эффективности в вашей студии.
Прежде чем углубляться в эту книгу, вы должны достичь хорошего понимания интерфейса
Maya и того, как использовать программное обеспечение. Кроме того, на протяжении всей книги
(там, где это возможно) распространенные инструменты и техники будут представлены для 3ds
Max, так чтобы ТД, работающий в условиях различного программного обеспечения, смог лучше
переключаться с одной программы на другую. Такое столкновение нескольких программных
пакетов вполне распространено в производстве, и становится все более популярным в игровой
индустрии. Твердое понимание основных идей настройки позволит вам создавать хорошие
сборки, вне зависимости от выбранного 3D приложения.
Наш взгляд на риггинг таков, что даже самые сложные сборки основаны на простых шагах,
которые, складываясь вместе, формируют «продвинутую сборку». Безотносительно своей
сложности или простоты, сборка должна быть удобна для аниматора, обладать хорошим
пользовательским интерфейсом и помогать аниматору в слежение за ключевыми кадрами. К
счастью, основанная на узлах архитектура Maya предоставляет техническому директору очень
открытую систему, погрузившись в которую он получает контроль над каждым уровнем
персонажной сборки и деформации. Риггинг в Maya может быть очень полезным процессом с
возможностью сочетать и использовать почти все части программы, чтобы сделать удобную
аниматору сборку.
Для небольшой студии много очень полезных инструментов и скриптов авто-риггинга можно
скачать из Web, благодаря сообществу очень активных пользователей. Эти бесплатные скрипты –
большое подспорье для небольших студий или для аниматоров, которым нужно настраивать
собственные персонажи. Единственный недостаток скачивания скриптов и их слепого
использования заключается в том, что если что-то идет неправильно или если вам нужно сделать
что-то, на что бесплатные скрипты не способны, то вы можете застрять и задержать всю команду
или просрочить работу.
На что в Персонажных Риггерах смотрят студии
Взглянув на требования киностудий к идеальному ТД по персонажам, показанные далее в
объявлениях, вы можете представить себе современные ожидаемые и требуемые стандарты
создания высококлассных персонажей. Хотя большинство студий перечисляют качества,
которыми должен обладать безупречный кандидат, в действительности набор навыков
большинства людей не соответствует никакой должности в полной мере. Независимо от места
вашей работы, отраженные ниже навыки важны для создания качественных персонажных сборок
и инструментов в текущем производстве современных студий.
Tippett Studio и Sony Imageworks предъявляют примерно одинаковые требования к базовым
навыкам ТД по персонажам.
Tippett Studio: «Создает анимационные контроллеры и поверхностные деформации,
имитирующие естественную поверхность, которая определяется лежащими в ее в основе скелетом
и мускулатурой. Создает аккуратные, детальные, легко управляемые аниматорами «куклы».
Technical Animators – Sony Imageworks: «Ответственный за создание специальных персонажных
установок и технической поддержки персонажной анимации на всем протяжении производства.
Работает на производстве с командой для определения различных установок анимации и помощи
в решениях».
К профессиональному ТД по персонажам предъявляются большие требования, чем всего
несколько лет назад. Создание сложных мускульных систем и более интенсивное использование
имитации и технологии захвата движения (motion capture) подняли планку знаний большинства
ТД по персонажам. Использование технологии захвата движения в играх не новость, но вот что
действительно ново, так это владение более сложными деформациями и более реалистичными
персонажами кинематографического качества. Так что техническим директорам приходится
лучше понимать, как размещение сочленений и анатомия вместе помогают создать персонажей,
которые в движении выглядят естественно. «Half Life 2» от Valve software – одна из первых игр,
демонстрирующих использование псевдо-мускулатуры при помощи костей, которая настроена
так, что скручивание, сжатие и растяжение происходят в реальном времени, чтобы зафиксировать
это состояние и придать мускулам персонажа реалистичную выпуклость. Скоро это станет скорее
правилом, чем исключением, по мере того как «железо» ПК и консолей будет развиваться и
становиться более мощным.
Помимо требований времени, проекты стали теперь более сложными и реалистичными, в то
время как время на создание объектов сократилось. Возросла необходимость эффективного и
гибкого риггинга с применением сценариев и программ, автоматизирующих составные задачи.
Вне технических требований существуют и другие необходимые требования – способность
работать в команде, сильные навыки коммуникации, внимание к деталям и способность следовать
указаниям как лидера, так и рядовых членов команды. У каждого персонажа впереди долгая жизнь
на протяжении всего производственного процесса, и поэтому понимание всех процедур, через
который должна пройти сборка, очень важно. Вы быстро окажетесь в центре производства и
должны будете работать с отделами моделирования, анимации, освещения. Чем лучше вы будете
понимать процесс производства в целом, тем больше это поможет вам в планировании наперед,
чтобы свести будущие технические проблемы к минимуму.
Будущие технические режиссеры сегодня
Так какие же требования к ТД по персонажам будут актуальны в будущем? Прежде всего,
ежедневно вы должны будете предлагать решения необычных для вашей производственной среды
проблем, таких как автоматизированное создание собственной сборки/скелета, создание кожи,
batch-экспорт анимации, или добавление одежды и оружия, или риггинг пропсов для серии
файлов.
Во-вторых, по мере того как 3D персонажи будут становиться все более реалистичными,
ожидания зрителей возрастут, поэтому будет необходимо более глубокое понимание анатомии и
биомеханических процессов. Вы должны будете подробно исследовать, как движения главных
видимых мышц влияют на сочленения и кожу вокруг них, когда они анимированы. Еще вам
придется быть четко осведомленным об истинных точках поворота каждого сочленения, а также
понимать и отчетливо представлять себе, как размещение сочленений влияет на деформации и
суммарное качество окончательного анимированного движения.
В-третьих, имитация будет также играть большую роль в жизни компьютерного персонажа,
изображают ли его взлетающим на воздух, с подстреленной рукой или просто в специальной
одежде, имеющей решатели ткани, выглядящих так, будто их можно сорвать с его тела, как в
«Халке» («The Hulk»). Специалисты по волосам, одежде, имитации трюковых киносъемок, съемке
движения и переориентации, моделированию выстрела и специалисты по лицам смогут в будущем
играть разные роли. Эта книга затронет каждую дисциплину, несмотря на то, что каждая из них
может занять на объяснения ещё одну такую же книгу.
Как бы техничны вы ни были, важны и ваша способность понимать художественную сторону
того, чем вы занимаетесь, и ваши человеческие качества, умение контактировать и с
темпераментными художниками, и с людьми глубоко технического склада.

Раздел 1
Основные элементы
Глава 1
Архитектура Maya
Для того чтобы эффективно заниматься персонажным риггингом, важно разбираться в
архитектуре программного обеспечения для трехмерной анимации. Чтобы быть хорошим
риггером, важно понимать, почему и как работает та или иная вещь. В этой главе мы рассмотрим
архитектуру Maya более внимательно.
Первые программы для работы с 3D были очень примитивными и позволяли совершать лишь
простые операции с 3D данными. Обычно эти данные имели вид вершин и плоскостей. По мере
развития программного обеспечения возникли новые парадигмы управления данными.
Архитектура Maya построена на системе узлов (nodes) и соединений (connections). Узел
polyCube1 (рис. 1.1) генерирует точки и полигоны, которые определяют форму куба. Эти данные
передаются в узел pCube1Shape. Затем эта информация передается для рендеринга в узел
initialShadingGroup. Соединение обозначается фиолетовой линией, соединяющей их. Треугольный
указатель посередине линии показывает направление потока данных. В редакторе Hypergraph
узлы отображаются так, что поток данных направлен слева направо. Окончательная конфигурация
сцены, вся ее геометрия, все шейдеры, освещение и эффекты – все это зависит от узлов и
соединений.

@Рис. 1.1. Узлы и соединения полигонального куба

Анатомия узла
Что такое, в точности, узел? По сути, это объект данных в Maya. Все, что вы можете выбрать в
Maya, выражено в виде узла. Полигональная геометрия, поверхности NURBS, частицы – все это
узлы. Есть два основных типа узлов: те, что представляют 3D объект и те, что этого не делают.
Все узлы, которые в Maya представляют 3D объекты, называются трансформами (transforms).
Узел трансформы содержит всю информацию, необходимую для размещения объекта в
трехмерном пространстве: атрибуты перемещения, вращения и масштабирования, несколько
матриц и информацию о габаритах объекта. Также узел содержит другие различные данные, такие
как, например, данные о прорисовке объекта, является ли он видимым или же шаблоном, нужно
ли прорисовывать гостинг. Трансформы встроены в иерархию для возможности осуществления
сложных действий, также они служат в качестве опоры для геометрии, подвергающейся
рендерингу. Все объекты, которыми можно манипулировать во вьюпорте Maya, за некоторым
исключением (таким как размещение проэкции текстуры и задний план), являются трансформами
Все содержащие геометрию трансформы, такие как полигональные объекты, кривые, NURBS и
иерархические поверхности, также содержат узлы форм (shape nodes). Узел форм – это узел, в
котором хранятся только данные о форме объекта. В случае с полигональными каркасами узел
формы содержит все точки, ребра и грани, которые составляют геометрию. Узлы форм должны
быть дочерними объектами трансформ - в рабочем пространстве Maya они никогда не существуют
отдельно. Чтобы увидеть, как функционирует shape-узел, откройте Outliner через меню Window
 Outliner (Окно  Схема сцены). Щелкните в пустом пространстве Outliner правой кнопкой
мыши и выберите в контекстном меню Show Shapes (Показать Формы). Вы увидите, что за всеми
узлами-трансформами теперь стоит [+]. Щелкните на [+], чтобы развернуть узел, и вы увидите
Узел формы. Подобные узлы обладают таким свойством, что если вы при выделении во вьюпорте
узла форм, Maya автоматически выберет родительскую этому узлу трансформу. Важно отметить,
что, хотя все shape-узлы подчинены трансформам, не каждая трансформа обязательно содержит
shape-узлы.
Узел форм – это пример узла содержащего данные, видимые во вьюпорте. В Maya есть много
других узлов содержащих данные, отображение которых отключено по умолчанию. Выражения
(expressions), группы выделений (selection sets), решатели Инверсной Кинематики (ИК) (IK solvers)
– все это и многое другое внутренне представляется в виде узлов. Чтобы понять архитектуру
узлов, откройте Outliner. Удерживайте правую кнопку мыши, чтобы активировать контекстное
меню, и выберите Show DAG Objects Only (Показать только DAG-объекты). В Outliner вы
увидите все используемые в Maya узлы, которые не являются трехмерными объектами. Однако
многие узлы в Maya не столько содержат данные, сколько оперируют ими. Деформирующий узел,
например, не содержит текущие координаты вершин, которые он деформирует. Вернее, при
рендеринге геометрии данные узла формы модели проходят через деформирующий узел, который
искривляет каркас модели до нужного состояния (рис. 1.2). Такой поток данных характерен для
всех пакетов трехмерной анимации, и он будет более подробно описан в следующем разделе.

@Рис. 1.2. Сгибающий деформатор

Утверждение о том, что деформирующий узел не содержит данных, не совсем верно. Для
увеличения скорости и интерактивности большинство узлов будут содержать локальную копию
обрабатываемых данных. Таким образом, если пользователь не укладывается в отведенное время,
Maya может сэкономить время, не пересчитывая все элементы трансформации. Если изменены
первоначальная модель или параметры узла-деформатора, то Maya рассчитывает и кэширует
заново. Все это сделано ради увеличения скорости, но с точки зрения производственного процесса
надежнее рассматривать деформирующие узлы не как хранилища данных, а как их обработчики.
И в итоге то, что большинство узлов, обрабатывающих данные, также содержат некоторые
данные не имеет значения, так как обычно они представлены в виде параметров, которые
определяют зону действия и суть операции. К примеру, деформирующий узел содержит
некоторые данные о искривлении, атрибутах верхней и нижней границ.
Shape-узлы
Из всех узлов Maya именно узлы форм имеют несколько интересных свойств. Представляют ли
они из себя кривые NURBS, полигональные фигуры, иерархические поверхности или любой из
других типов геометрии, которые поддерживает Maya, – они содержат используемую
трансформами геометрию. Одно из самых полезных свойств метода выделения узла: всякий раз,
когда вы щелкаете по геометрии во вьюпорте, выделяется ее узел-трансформа. Это позволяет
задавать установки, упрощающие процесс выделения узла.
Как раз для этого Maya предоставляет упрощенный инструмент выбора узла – управляющая
форма. Его недостаток в том, что значительное количество таких форм сбивает с толку.
Становится трудно определить, какая из них к какому узлу относится. Есть еще один недостаток
управляющих форм: в окне вьюпорта они отображаются поверх всего остального. Допустим,
плечи вашего персонажа выбраны с помощью форм. Если вы взглянете на персонажа в боковой
проекции, переключатели будут перекрывать друг друга. Слегка повернув изображение, вы
увидите два переключателя рядом, но изображенными так, как будто они находятся к камере
ближе, чем торс персонажа.
Следующий пример иллюстрирует создание органов управления для сочленений скелета
(joints). Этот метод может использоваться с любыми трансформами, но обычно его применяют к
сочленениям, потому что другие регулировки могут быть не входить в кривую или полигональные
узлы.
1. Скачайте файл controlCurveExample.ma для первой главы по адресу
http://www.courseptr.com/downloads.
2. Зайдите в опции через меню File  Import (Файл  Импорт). Убедитесь, что опции
Group (Группа) и Use Namespaces (Использовать разделение в именах) не включены.
Импортируйте файл scenes/capter01/nurbSplineCube.mb.
3. Выделите куб. Примените инструменты Move (Перемещение), Rotate (Вращение) и Scale
(Масштаб), чтобы разместить куб рядом с сочленением left_Lshoulder (рис. 1.3).
4. Выделив куб, выделите также с помощью клавиши Shift сочленение left_Lshoulder.
Нажмите клавишу p, чтобы привязать куб к сочленению.
5. Куб должен быть выделен. Оставьте его в этом состоянии и обнулите его перемещение и
вращение через меню Modify  Freeze Transformations (Модифицировать 
Заморозить Трансформации).
6. В командной строке введите: parent -r -s curveShape1 left_Lshoulder.
Теперь выделите куб. Активируйте инструмент вращения и поверните его. Вы должны
увидеть вращение сочленения.

@Рис. 1.3. Размещение кривой NURBS

Это пример заданной формы выделения (рис. 1.4). Когда бы вы ни щелкнули по кубу,
выделяется сочленение. Если вы откроете Outliner, то заметите, что следующая за сочленением
микро-иконка имеет форму кривой, но тем не менее это сочленение. В использовании кривой
NURBS нет необходимости: могут быть применены любые формы, от полигональных объектов до
NURB поверхностей. Какую бы форму вы не применили, она может быть отключена в меню View
(Вид) в окне вьюпорта. В этом примере, если вы отключите Show  NURBS Curves (Вид 
Кривые NURBS), форма выделения исчезнет. Формы выделения могут редактироваться так же,
как все другие формы.

@Рис. 1.4. Привязанная кривая

Несмотря на то, что формы выделения вещь полезная, манипуляции, которые нужно совершать,
несколько утомляют. Кроме того, нельзя использовать Outliner или стандартные команды Maya
для того, чтобы подчинить форму сочленению. В итоге мы создали MEL-скрипт parentShape.
Чтобы использовать его, выделите трансформу и затем, выделите с помощью клавиши Shift
объект который вы желаете привязать к ней. Выполните parentShape, и родительская связь готова.
Атрибуты и каналы
Все данные в Maya передаются через атрибуты (attributes). Существуют атрибуты различных
типов. Есть атрибуты со значениями типа float, string и так далее. Атрибуты могут быть
сгруппированы. Например, атрибуты перемещения (translate attributes) .tx, .ty и .tz – дочерние
объекты атрибута .translate.
Одна из важнейших характеристик атрибутов – обладание типом. То есть атрибут содержит
определенный тип информации. Большинство атрибутов имеют тип float (числа с плавающей
запятой). Это означает, что они содержат действительные числа, в том числе с несколькими
знаками после запятой. К этому типу относятся атрибуты перемещения, вращения и
масштабирования. Еще один тип – integer (целые числа). Он может содержать только целые числа.
Хороший пример этого типа – атрибут, контролирующий число делений при создании сферы или
куба. Тип boolean (логические значения) может содержать только 0 или 1, и никаких
промежуточных значений. Хороший пример логического атрибута – видимость.
Все рассмотренные выше типы атрибутов могут быть отредактированы, так же им могут быть
назначены ключевые кадры, но есть и такие типы, к которым это не относится. Атрибутам типа
string не могут быть назначены ключевые кадры или соединения. Также и атрибутам типа message
не могут быть назначены ключевые кадры, но могут быть присвоены соединения. Такие атрибуты,
как атрибут inMesh полигонального объекта могут быть соединены, но не редактируемы. Тип –
важное свойство атрибута, потому что он гарантирует, что между узлами происходит обмен
нужной информацией.
В Maya почти все узлы имеют каналы (plugs). Каналы – это порты узла, через которые могут
проходить данные. Почти все узлы в Maya имеют каналы ввода или вывода. Приходить данные
могут через входящий канал (input plugs), и так же данные могут быть переданы другим узлам
через выходящие каналы (output plugs) (рис. 1.5).
Многие каналы в Maya соответствуют атрибутам объектов. Например, все трансформы имеют
атрибуты перемещения, вращения, масштабирования. Каждый из них имеет каналы ввода и
вывода. Эти атрибуты можно увидеть в Channel Box (Блок Каналов), также им могут быть
назначены ключевые кадры. Это также верно для многих (но не всех) атрибутов, которые
пользователь может присоединить к узлу.

@Рис. 1.5. Выходящие каналы узла

@Рис. 1.6. Соединение узлов в редакторе Hypergraph

Однако не все каналы имеют свои атрибуты. Геометрия узла формы, например, имеет
выходной канал. Он не привязан к атрибуту, но используется для передачи информации узлам
деформаторов. Также важно отметить, что не всем входным каналам сопутствуют выходные, и что
есть атрибуты без каналов вообще.
Соединения
Соединения в архитектуре Maya позволяют данным перетекать от узла к узлу. Они формируют
внутреннюю сеть – ядро всех операций в Maya. Соединение – это прямая ссылка с выходного
канала на входной (рис. 1.6). Существуют некоторые правила управления соединениями:
соединения могут быть направлены от выходного канала только к входному;
данные могут перемещаться через соединение только в одном направлении, от вывода к вводу.
Если вам нужно соединить translateX сферы с rotateY куба, вы не можете выделить куб,
ввести значение в Channel Box rotateY и осуществить перемещение сферы по оси X;
несмотря на то что соединений в выходном канале узла может быть несколько, входной канал
может участвовать лишь в одном соединении. Допустим, вы хотите вывести translateX куба
на translateY пяти сфер. Вы можете соединить выходной канал атрибута cube.tx с входным
каналом атрибутов сфер .ty. Но вы не можете вывести .ty нескольких сфер на cube.tx;
соединения можно устанавливать только между каналами схожего типа. Например, большое
количество каналов, таких как translateX, имеют числовой тип. Этот канал может быть
соединен только с другим каналом такого же типа. А если бы вы попытались соединить его
с каналом, скажем, матричного типа, вы бы потерпели неудачу.
Соединения – это клей, который скрепляет сцены в Maya. Когда Вы открываете сцену, Maya
создает все узлы, устанавливает все атрибуты, а затем создает соединения. Важно представлять
себе, как все это работает, когда дело дойдет до отладки риггинга. Достаточно часто придется
вносить изменения в исходный файл непосредственно во время рабочего процесса. Когда это
случается, техническому директору приходится отслеживать изменения и решать, влияет ли это на
рабочий процесс в целом.
Поток данных
Поток данных – один из важнейших аспектов соединений. По мере того как Вы создаете более
сложный риггинг с сетями деформаторов, поток данных приобретает очень большое значение. Как
уже говорилось выше, данные передаются по сети узлов только в одну сторону, и называется это
поток (downsteam). Данные берут начало в созданном узле и текут по направлению потока.
Последний узел в цепочке представляет то, что будет видно в окне вьюпорта. Каждый раз, когда
Maya обновляет данные, например, когда задействована временная линия, вся цепочка полностью
вычисляется заново.
В истоке сети – узел, который и хранит данные, и генерирует их. Например, если вы выберете
Create  Polygon Primitives  Cube (Создать  Полигональные Примитивы  Куб), то Maya
создаст куб. Если вы его выделите, откроете Hypergraph (Гиперграф) и выберете Graph  Input
and Output Connections (Схема  Входящие и Исходящие Соединения), то увидите, что
появились несколько узлов. Первый узел – pCube1. Это узел-трансформы, и он предоставляет
Maya информацию, необходимую для размещения геометрии. Ему подчиняется сеть узлов,
составляющих фактическую геометрию. Узел polyCube1 выступает в качестве генератора: он
создает геометрию куба. Затем эта геометрия поставляется в узел pCubeShape1. Вы заметите, что в
Hypergraph узел pCubeShape1 не отображается как дочерний узла pCube1. Хотя их отношение
ясно показано в Outliner, вы должны обращать внимание на правила присваивания имен в
Hypergraph, чтобы было ясно, где какой узел. Hypergraph постарается отображать эти узлы
вместе.
Работа с узлами и соединениями
Существует несколько способов манипулирования узлами и соединениями в Maya. Один из самых
мощнейших редакторов это - Hypergraph. Исходя из этого, в нем можно совершать 90% действий
с узлами и соединениями, с некоторой поддержкой редакторов Connection Editor (Редактор
Соединений) и Hypershade.
Hypergraph – один и самых полезных для риггера редакторов. По существу, он дает карту
узлов и их соединений всей сцены. Это важный инструмент диагностики, так как позволяет
увидеть все входящие и исходящие соединения узла. В этой книге будет дана небольшая справка
по Hypergraph, так что затратить некоторое время на знакомство с ним было бы хорошей идеей.
Этот раздел раскроет не все возможности Hypergraph, а только часто используемые инструменты.
В книге «Inspired 3D Characters Setup» мы рассматриваем Hypergraph из-за его возможности
отображения соединений. Сейчас мы выйдем за эту границу и используем другое его свойство –
способность создавать соединения. В открытом редакторе Hypergraph, вы можете пробежать
курсором мыши по любому узлу - когда курсор находится над правой стороной узла, он меняет
форму. Если вы нажмете и удержите правую кнопку мыши, появится контекстное меню с
большинством выходных каналов узла. Выбрав из списка один из них, вы можете перетащить
линию соединения к другому узлу. Нажатие и удерживание правой кнопки мыши над правой
стороной любого другого узла вызовет список наиболее часто используемых входных каналов
узла. Выбор из меню одного из них создаст соединение.
Создайте в Maya полигональный куб (polyCube) и NURB-сферу (nurbSphere).
С помощью меню Window  Hypergraph откройте окно Hypergraph.
Выделите два узла и активируйте пункт Input and Output Connections. Вы увидите два
узла в Hypergraph.
Поместите курсор мыши на правую сторону узла pCube1. Вы увидите выделение узла
цветом, и курсор изменится на указатель потокового соединения (рис. 1.7).
Нажмите и удерживайте правую кнопку мыши, и в появившемся списке исходящих
соединений выберите из группы перемещений параметр translateX.
Если отпустить клавишу, то появится инструмент соединения. Переместите указатель
мыши на правую сторону узла nurbsSphere1.
Когда курсор изменится, нажмите и удерживайте правую кнопку. Возникнет контекстное
меню входящих каналов. Из группы вращений выберите атрибут rotateX.
Вы должны будете увидеть в Hypergraph появившееся соединение. Если вы выделите узел
pCube1 и переместите его по оси X, объект nurbsSphere1 будет вращаться.

@Рис. 1.7. Курсор готов создать соединение

Точно также в Hypergraph можно быстро разбить соединение. Когда вы ведете мышью по
линии соединения, она подсвечивается, и отображаются каналы соединения. Вы можете выделить
соединение, щелкнув по нему левой кнопкой мыши. В этот момент его, как и любой другой
объект, можно удалить, нажав клавишу Backspace или Delete.
Необходимо дать некоторые пояснения к работе с Hypergraph. Когда вы корпите над узлами и
соединениями в Maya, временами узел, используемый для рендеринга, соединяется с
трансформом. Когда это происходит, Maya использует соединение unitConversion. При создании
этих соединений в Hypergraph вьюпорт может не обновляться должным образом. Чтобы увидеть
соединение, надо заново выбрать узел и отобразить его схему, при этом соединение станет
видимым. Если вы попытаетесь разбить соединения, Maya не сможет это сделать. Для этого нужно
использовать Connection Editor.
В этой книге мы будем достаточно часто использовать Hypershade. Хотя большая часть работы
делается в Hypergraph, в Hypershade так же есть несколько инструментов, полезных для
создания узлов. Открыв Hypershade, вы увидите Create Bar (Панель создания). Эта панель в
левой части окна содержит список всех рендер-узлов (render nodes), которые могут быть созданы в
Maya. В отношении способа оперирования узлами и соединениями Hypershade очень похож на
Hypergraph: в обоих редакторах для соединения узлов используется правая кнопка мыши.

Нестандартное соединение атрибутов


Подавляющее большинство типов соединений – числовые: float, integer или boolean. Атрибут
boolean либо включен, либо выключен, что в Maya рассматривается как 0 или 1. Integer – это
любое целое число: 1, 2, 3, 4, 5 и так далее, включая отрицательные числа -1, -2, -3 и так далее. К
float относится любое действительное число и его остаток, например: 1,76, 3,45, -92,45. Числовое
соединение может быть соединено с любым другим, так как соединение может переводить данные
из одного типа в другой, например, данные типа float могут быть переведены в integer, integer в
boolean и так далее.
Существует целая группа типов соединений, которые не являются числовыми и не
взаимозаменяемы. Такие соединения переносят от узла к узлу особые данные. Следующий пример
иллюстрирует работу нечисловых соединений:
1. Начните с новой сцены.
2. Создайте полигональный куб.
3. Создайте полигональный конус.
4. Выделите и куб, и конус и откройте Hypergraph. Отобразите входящие и исходящие
соединения узлов. Вы должны увидеть узлы-трансформы, shape-узлы и узлы создания
(creation nodes) каждого объекта. Узлы создания называются polyCone1 и polyCube1.
Эти узлы генерируют точки и полигональные объекты для узлов форм. Когда вы
выделяете конус или куб, вы можете редактировать параметры создания в Channel Box.
5. Откройте Connection Editor. Выделите узел pCube1Shape и загрузите его на левую
панель. Выделите узел polyCone1 и загрузите его на правую панель.
6. Соедините атрибут Output узла polyCube1 с атрибутом inMesh узла pConeShape1 (рис.
1.8).

@Рис. 1.8. Соединение генератора формы и узла формы

Вы увидите, как конус становится кубом. Узлы создания генерируют данные, используемые
для создания формы, в данном случае, вершины и поверхности, составляющие полигональный
куб. Когда вы направляете те данные вывода в атрибут inMesh shape-узла, текущая форма
заменяется новыми введенными данными. Такие же процессы могут быть применены и к
обычным узлам формам:

Врезка. Некоторые из атрибутов объектов могут быть соединены только


через Connection Editor. В Hypergraph между числовыми атрибутами почти
любое соединение можно установить с помощью мыши. Другие атрибуты, как
правило, должны соединяться в Connection Editor.

Начните с новой сцены.


Скачайте с Web-сайта http://www.courseptr.com/downloads файл arrow.obj. С помощью команды
меню File  Import переместите файл в трехмерное рабочее пространство.
Создайте полигональный куб.
Выделите узел arrow и отобразите в Hypergraph его входящие и исходящие соединения.
Выделите узел arrowShape. Откройте Connecion Editor и загрузите выбранную форму на левую
понель.
Выделите узел pCubeShape1 и загрузите его на правую панель.
Соедините атрибут outMesh левой панели с атрибутом inMesh правой панели (рис. 1.9).
Вы увидите, что shape-узел куба теперь является дубликатом стрелы. Если вы выделите узел
arrowShape, перейдете в режим редактирования компонентов (component mode) и начнете
редактировать форму, то вы увидите, что форма дубликата меняется в полном соответствии с
внесенными Вами изменениями. Если вы выделите соединение между arrowShape и pCubeShape1,
отношение исчезнет, но геометрия останется такой, как задано shape-узлом polyCube.
@Рис. 1.9. Соединение shape-узлов

Врезка. В этом примере иллюстрируется способность создания иллюзорной


копии в Maya, но важно отметить, что дублирование с включенной опцией
иллюзорной копии создает различные отношения между копией и исходным
объектами.

Кривые анимации
Один из наиболее широко используемых узлов – узел animCurve. При анимации объекта данные
об анимации хранятся в кривых анимации (animation curves). Кривая анимации – это непрерывная
сплайновая кривая, содержащая пары параметр/значение, а также «переключатели», управляющие
интерполяцией значений. Всякий раз, когда Maya вводит значение параметра (обычно время),
кривая анимации вычисляется в данной точке, и возвращается соответствующее значение. Самая
интересная особенность кривой анимации состоит в том, что параметр ввода функционально
обуславливается управляемым ключом (set driven key).
Входной параметр управляемого ключа кривой определяется атрибутом, с которым он
соединен. Вводимые данные передаются от управляющего атрибута к узлу animCurve, который
производит значение управляемого атрибута. Это один из самых полезных инструментов
настройки и анимации персонажей, и поэтому было бы неплохо разобраться с управлением узлами
кривых анимации. Следующий пример показывает, как решить проблему, с которой многие
сталкиваются во время риггинга: изменение управляющего атрибута управляемого ключа:

1. Скачайте с Web-сайта http://courseptr.com/downloads файл sdk_Connection_Start.mb.


Откройте его в Maya. Вы должны увидеть простые установки руки (рис. 1.10).

@Рис. 1.10. Простые установки руки

2. Выделите узел запястья (wrist). В Channel Box вы увидите атрибуты FingerA, FingerB и
FingerC. Подведя курсор к атрибуту FingerC и перетащив его средней кнопкой мыши,
вы увидите, как искривляется цепь сочленений FingerC.
3. Откройте Hypergraph. Отобразите входящие и исходящие соединения сустава запястья.
Вы увидите, как соединение идет от узла wrist к анимационным кривым setDrivenKeys и
от них к самим сочленениям.
4. В окне моделирования выделите сустав запястья и суставы, образующие средний палец:
fingerB1, fingerB2 и fingerB3.
5. В окне Hypergraph отобразите входящие и исходящие соединения. Вы должны увидеть
кривые анимации и суставы fingerB.
6. Выделите узлы fingerC1_rotateZ, fingerC2_rotateZ и fingerC3_rotateZ. Нажмите Ctrl+D,
чтобы дублировать их. Перетащите новые узлы левой кнопкой мыши так, чтобы они
расположились ближе к узлу wrist, для удобства.
7. Щелкните на узле fingerC1_rotateZ1, чтобы выделить его. В Channel Box переименуйте
его в узел fingerB1_rotateZ. Переименуйте fingerC2_rotateZ1 в fingerB2_rotateZ, а
fingerC3_rotateZ1 в fingerB3_rotateZ.
8. В Hypergraph перемещайте указатель мыши по правой стороне узла fingerB1_rotateZ до
тех пор, пока курсор не поменяется на указатель соединения. Щелкните правой кнопкой
мыши и выберите output в контекстном меню. Перетащите соедининие к суставу
fingerB1 и с помощью контекстного меню присоедините его к атрибуту rotateZ сустава
(рис. 1.11).
9. Соедините атрибут fingerB2.output с атирибутом fingerB2.rotateZ, а fingerB3.output – с
fingerB3.rotateZ.
10. Следующий шаг должен быть совершен в Connection Editor. Откройте его с помощью
меню Window  General Editors (Окно  Общие Редакторы). Выделите сустав
запястья и загрузите его на левую панель. Выделите все три кривые анимации fingerB и
загрузите их на правую панель. Убедитесь, что индикатор соединения установлен на
from→to.
11. Соедините атрибут fingerB с атрибутом input каждой кривой анимации.
12. Во вьюпорте выделите сустав запястья. В Channel Box подведите курсор к каналу
fingerB и удерживайте среднюю кнопку мыши. Вы должны увидеть палец
изгибающимся, как и другие.
Механизм Set Driven Key – это просто отображение управляющего атрибута на кривой,
определяющей значение управляемого атрибута. Эти кривые могут быть дублированы, они могут
принимать любые числовые данные в качестве параметров, и их исходящие данные могут
участвовать в соединении при условии принятия числовых параметров другой стороной.
Автоматизация сложных действий
Один из недостатков интерфейса этого редактора обнаруживается при поточной работе. Чтобы
установить управляемый ключ при сложной операции, нужно много раз выделять объекты и
отменять выделение и, прежде чем нажимать в окне редактора на кнопку Ключ (Key), проверять,
что бы каналы были выбраны верно.
Следующий пример объяснит организацию такого поточного действия, которое облегчит
преобразование сложных действий в управляемые ключи. Оно использует свойство соединений
применять анимационные кривые для управляемых ключей.
Скачайте с Web-сайта http://courseptr.com/downloads файл первой главы
sdk_ComplexAnimStart.ma.
Начнем построение сценария с установки ключевых кадров для объектов. Выделите узел
door1. Убедитесь, что временной ползунок (time slider) находится в позиции нулевого
кадра и установите ключевой кадр для параметра rotateX $$ Ключевые кадры для
отдельных параметров устанавливаются в редакторе Channel Box путем удерживания
на нужном параметре правой кнопки мыши и выборе параметра key selected – прим
ред. $$. Так же поступите и с объектом door2.
Переместите слайдер времени на 27-й кадр. Поверните объект door1 на -130º по оси X и
установите ключевой кадр. Выделите объект door2, поверните его на 130º по оси X и
установите ключевой кадр.
Выделите joint1, joint2, joint3, joint4 и joint5. Передвиньте временной ползунок на 15-й кадр
и установите ключ.
Выделив эти сочленения, передвиньте временной ползунок на 20-й кадр. В Channel Box
введите значение вращения по X, равное 70, и установите ключевой кадр.
Выделите узел joint1 и поверните его обратно по оси X, так чтобы цепь узлов была
направлена вертикально. Установите ключевой кадр.
С помощью меню Edit  Delete By Type  Static Channels (Редактировать  Удалить По
Типу  Статические Каналы) удалите плоские анимационные кривые: они только
прибавят ненужной работы. Оставьте только кривые rotateZ (рис. 1.12).
Передвиньте слайдер времени на 0 и нажмите на кнопку Playback (Воспроизведение). Вы
увидите, как двери открываются, а сочленения разлетаются подобно бьющему роднику.
Выделите все сочленения, и с помощью клавиши Shift выделите узлы door1 и door2.
Откройте Hypergraph и отобразите входящие и исходящие соединения. Вы должны
увидеть все анимированные узлы и связанные с ними анимационные кривые (см. рис.
1.12). На каждый анимированный объект должна приходиться одна кривая.

@Рис. 1.12. Анимация сочленений

Создайте локатор. Он должен появиться в Hypergraph.


Выделите локатор и откройте окно Connection Editor. Загрузите локатор на левую панель.
Убедитесь, что кнопка Map (Отобразить) установлена на from→to.
Выделите в Hypergraph один из узлов animCurve. С помощью меню Show  Show Selected
Type(s) (Вид  Показать Выделенный Тип) отобразите только соединения кривых
анимации с объектами. Выделите все узлы анимации и загрузите их на правую панель
окна Connection Editor.

Врезка. Так как это единственный анимируемый объект сцены, вы можете


выделить все узлы animCurve, введя в командную строку следующую
команду: select -r `ls -type animCurve`;
На левой панели откройте группу локатора Rotate (Вращение) и выделите RotateX. На
правой панели укажите курсором на атрибут Input первого узла animCurve. Прокрутите
список вниз и укажите курсором на все атрибуты Input, соединяя их с RotateX $$ При
отключенной в Connection Editor опции Auto-Connect Вы можете выделять нужные
каналы и создавать связи нажатием на кнопку Make – прим ред. $$ (рис. 1.13).
Выделите локатор во вьюпорте. Поверните его по оси X, и вы увидите воспроизведение
анимации.

@Рис. 1.13. Переназначение кривых, допускающее вращение локатора для сокращения


времени просчета сцены

Данный пример демонстрирует Вам, как легко редактировать анимацию объектов до


перестраивания их под управляемые ключи. На этой стадии анимацию еще можно редактировать:
сохранение ключевых кадров в анимированных каналах изменит образ действий. Это происходит
потому, что управляющие образом действий анимационные кривые не являются управляемыми
ключами, и Maya обращается с ними в точности как со стандартными кривыми анимации. Когда
выделен объект с такими кривыми, на линейке времени появляются отметки, и кривые можно
редактировать, как обычно. Единственное различие состоит в том, что в них вводятся не
временные данные, а параметр вращения локатора по Х.

Врезка. Создав нужный алгоритм действий, следует заблокировать (lock)


каналы, управляемые кривыми анимации. Этот метод работы гибок, но
также и уязвим, так как может быть искажен командой setKeyFrame ,
примененной не вовремя. Блокирование каналов предотвратит случайное
изменение кривых.

Utility-узлы
Архитектура Maya основана на узлах, связываемых с помощью соединений. Эта информация
необходима каждому бесстрашному человеку, отважившемуся нырнуть в глубины программного
пакета для работы с трехмерной графикой. Но сверх того надо сказать, что есть много новых
техник, связанных с применением узлов. В этом разделе мы рассмотрим utility-узлы и их
использование.
Что такое utility-узлы?
Utility-узлы (utility nodes) – это узлы, которые выполняют над вводимыми данными
математические функции. Первоначально они были разработаны для оперирования данными сетей
рендеринга. В результате многие каналы ввода и вывода узлов обозначены R, G, и B
противоположность X, Y и Z. Когда атрибут XYZ соединяется с utility-узлом, Maya для обработки
данных часто генерирует узел unitConversion. Соединения узла unitConversion показаны в
Hypergraph серыми пунктирными линиями.
Если в откроете окно Hypershade, перейдете на вкладку Create Maya Nodes (Создать узлы
Maya) и прокрутите немного вниз, вы увидите раздел General Utilities (Главные утилиты). В этой
группе вы обнаружите utility-узлы. Они выполняют некоторые простые функции, которые можно
применить для создания сложных взаимодействий объектов в Maya.
Зачем использовать utility-узлы?
Польза utility-узлов очевидна, но зачем претерпевать все трудности их настройки и соединения,
если можно просто написать выражение?
Узлы по сравнению с выражениями обладают большими преимуществами, в том числе
следующими:
1. Узлы формируются в программном интерфейсе Maya (application programming interface –
API) и компилируются в приложение. Вследствие этого они производят вычисления
очень быстро;
2. Выражения должны интерпретироваться «на лету», что замедляет обновление сцены;
3. В некоторых случаях выражения могут обновляться не полностью или неправильно если
были произведены изменения во временной линии или изменения управляющих
атрибутов. Состояние же узлов всегда соответствует текущему моменту времени, и при
изменении управляющего атрибута они полностью пересчитываются;
4. Узлы управляют атрибутами через соединения. Это стабильно и безопасно. Выражения
должны опираться на заданные имена, и если объекты, с которыми они соединены, при
импортировании в новую сцену переименовываются, то может произойти сбой.
Последний пункт – один из самых важных. На протяжении всей книги периодически
поднимается тема упрощения технологии риггинга. Один из способов – создать библиотеку
компонентов, которые вы сможете импортировать в рабочую сцену. По мере увеличения работы с
узлами, Вы начнете понимать, как много сил тем самым можно сберечь.
Некоторые полезые схемы узлов
Реверсный узел
Реверсный узел (reverse node) – один из самых полезных для риггера utility-узлов, так как он
позволяет эффективно сочетать два атрибута со значениями от 0 до 1. Это отличный способ
сочетать атрибуты веса (weight attributes) в составных ограничителях (multi-part constraints). Этот
пример покажет, как использовать реверсные узлы для переключения ограничителей веса
объекта:
1. Создайте локатор и назовите его locatorA.
2. Создайте еще один локатор и назовите его locatorB.
3. Создайте полигональный куб.
4. Добавьте узлу pCube1 атрибут AtoB со значениями от 0 до 1.
5. Выделите locatorA, locatorB и куб и создайте точечный ограничитель (point constraint) и
ограничитель направления (orient-constraint).
6. Соедините атрибут pCube1.AtoB с pCube1_pointConstraint.locatorA W0 и с
pCube1_orientConstraint.locatorA W0.
7. Создайте реверсный узел в окне Hypershade.
8. Соедините атрибут pCube1_pointConstraint.locatorA W0 с атрибутом reverse.inputX.
9. Соедините атрибут pCube1_orientConstraint.locatorA W0 с атрибутом reverse.inputY.
10. Соедините атрибут reverse.inputX с атрибутом pCube1_pointConstraint.locatorB W1.
11. Соедините атрибут reverse.inputY с атрибутом pCube1_orientConstraint.locatorB W1.
12. Подрегулируйте атрибут AtoB, чтобы увидеть, как меняются веса.
При изменении атрибутов веса автоматически нормализуются. Эта система хорошо работает в
ситуациях, когда нужно ограничить два объекта, но для ограничителей, применяющихся более чем
к двум целям, она не подходит.
Узел с условием
Узел с условием (condition node) позволяет создавать простые условия, обычно требующие
написания MEL-скриптов. В этом примере вы примените узел с условием и дистанционный узел
(distance node), чтобы управлять объектом:
1. Создайте локатор и назовите его floor.
2. Создайте еще один локатор и назовите его control.
3. Создайте полигональный куб. Он будет представлять конечную цель ИК эффектора
(effector).
4. Откройте Hypershade. В разделе utility-узлов создайте узел с условием (condition node).
5. В Hypergraph соедините атрибут control.ty с атрибутом condition1.firstTerm.
6. Соедините атрибут floor.ty с атрибутом condition1.secondTerm.
7. Откройте узел condition1 в Attribute Editor. Установите Operation (Операция) на Less
Than (Меньше Чем).
8. Соедините floor.translate с каналом condition1.colorIfTrue.
9. Соедините control.translate с каналом condition1.colorIfFalse.
10. Соедините conditional.outColor с pCube1.translate.
11. Выделите управляющий локатор. С помощью инструмента Move передвигайте его
вверх и вниз по оси X. Вы заметите, что когда узел достигает значения локатора floor по
оси Y, куб останавливается у floor. Если вы сдвинете контроллеры X или Z вдоль оси Y,
то увидите, что куб перескакивает к месту локатора floor.
12. Соедините атрибуты control.tx и floor.tx, control.tz и floor.tz.
Теперь всякий раз при перемещении объекта control объект floor будет двигаться вместе с ним.
Чтобы упростить, например, шагание персонажа, атрибуту translateY объекта floor теперь можно
назначить ключевой кадр.
Узел с условием предоставляет почти безграничные возможности создания схем решений,
предназначенных для управления многими аспектами риггинга персонажа. Например, в простом
риггинге можно с помощью параметра ikBlend выбирать между прямой кинематикой (ПК) и
инверсной кинематикой (ИК). Когда задействована ИК, для размещения руки используется
контроллер. Но когда аниматор переключается на ПК, узел с условием может сделать органы
управления сочленениями видимыми.
1. Скачайте с Web-сайта файл первой главы conditionNode_start.ma.
2. В Hypershade создайте узел с условием.
3. Вставьте параметр ikBlend в первый элемент узла с условием.
4. Установите Operation на Less Than. Установите colorIfTrueR на 1,0. Установите
colorIfFalse на 0. Установите второй элемент на 1,0.
5. Соедините атрибут outputColorR узла с условием и атрибуты сочленений .displayHandle.

Врезка. Иногда при соединении с атрибутом displayHandle в Maya вначале


возникают проблемы с обновлением среды.

Теперь узел с условием отображает органы управления, если значение IKBlend меньше 1, что
верно для всех случаев, когда cочленения ПК влияют на объект. Узел с условием лучше, чем
прямое соединение реверсного узла, потому что параметр видимости может принимать только
значения 0 или 1. Все числа меньше единицы, например 0,83, не будут восприняты как
положительное значение видимости, потому что видимость – это атрибут логического типа. Эту
простую технику можно применить к любому атрибуту, имеющему варианты значений 0 и 1.
Узел и основанная на соединениях структура – одна из самых сильных сторон Maya.
Вооружившись знаниями о принципах работы этих систем, можно приспособить их для
различных нужд.

Глава 2
ИК-решатели и их применение
Несмотря на то, что создание фото-реалистичной анимации действительно стало вехой в
компьютерной анимации, многие другие продукты созданы с использованием наследия двумерной
мультипликации для создания более причудливых существ. Одна из самых ценных идей
традиционной двумерной анимации – сжатие (squash) и растяжение (stretch). Идея состоит в
том, что по мере деформации персонажа его объем не меняется. Если нога персонажа
растягивается, то она становится тоньше. Чтобы воссоздать в 3D стиль 2D анимации, важно
наделить 3D персонажа этим качеством.

Построение узлов растяжения и сжатия


Для начала организуем простое управление сжатием и растяжением. Эту управляющую систему
можно применить ко всем узлам мультипликационного персонажа. Она дает аниматору
возможность пропорционально изменять объем персонажа.
Самый распространенный способ растяжения в компьютерной анимации – оперирование
неоднородным масштабом (non-uniform scale) сочленений или объектов в сборке персонажа. В
Maya это особенно просто, потому что независимое масштабирование узлов сочленений
устанавливается автоматически. Это позволяет аниматору осуществлять локальное управление
масштабом объекта, не деформируя другие части иерархии (рис. 2.1).
@Рис. 2.1. Эффекты компенсации масштаба. В иерархии слева компенсация отключена. В
иерархии справа компенсация масштаба не допускает влияния масштаба одного из сочленений на
подчиненные ему сочленения

Традиция использования неравномерного масштаба вполне логична и естественна. Однако


движки некоторых игр могут не поддерживать неравномерный масштаб. В этих обстоятельствах
можно подогнать его с помощью управления перемещением и равномерным масштабом нужных
узлов.
Применяя неравномерный масштаб, нужно помнить об отношениях этих узлов. Для
достижения наилучшего результата один из множителей размера должен равняться длине кости.
При применении инструмента Joint (Сочленение) сочленения автоматически выравниваются так,
что главная ось направлена от родительского сустава к дочернему. К узлам с несколькими
дочерними элементами, как, например, суставам запястья или лодыжки, сжатие и растяжение
нужно применять с осторожностью.
В этом примере мы собираемся использовать стандартный иструмент Maya joint-orient
(ориентация суставов), который предполагает, что параметр scaleX управляет уменьшением
масштаба величины сочленения. Чтобы соотнести эти атрибуты, мы адаптируем формулу объема
к атрибутам масштаба. Объем определяется по следующей формуле:
a * b * c = Объем,
где a, b и c – длина, ширина и высота соответственно. Мы заинтересованы не в самом объеме, а в
том, как изменение одного из множителей размера объекта должно быть компенсировано другими
множителями, чтобы объем остался неизменным. Так как другие атрибуты будут равны, мы
можем упростить формулу следующим образом:
a * b * b = Объем
a * b2 = Объем
Мы будем управлять a (параметр scaleY), так что нам нужно определить значение других двух
атрибутов. В этом примере объем равен единице. Для каждого значения мы получим следующее:
b = sqrt(1/x)
Эта формула не показывает фактический объем объекта, это зависит от его геометрии. С ее
помощью мы пытаемся оперировать постоянным множителем размера. Если мы представим
объект как куб, длины сторон которого равны 1, то в результате этих операций получим объем,
равный 1.
Следующие упражнения иллюстрируют, как использовать эти формулы и utility-узлы для
добавления сочленению свойства сжатия/растяжения:
1. На боковом виде изобразите ногу с сочленениями. Не беспокойтесь насчет применения
ИК на этом этапе: мы перейдем к ней позже, в этой главе. Назовите сочленения LHip,
LKnee, LAnkle, Lball и LToe соответственно. Нога должна быть похожа на ту, что на
рисунке (рис. 2.2).
2. Выделите сочленение LHip. В Attribute Editor (Редактор атрибутов) выберите пункт
меню Attributes  Add Attribute (Атрибуты  Добавить атрибут).
3. В окне Add Attribute введите stretch в поле Attribute Name (Имя Атрибута) Убедитесь,
что Data Type (Тип данных) установлен на float. В поле Minimum (Минимум) введите
значение 0.1, а в поле Default (По умолчанию) – значение 1. Важно понимать, что
управление растяжением – это множитель размера, на который потом будут делиться
другие значения узла. В Maya жесткая система узлов, так что во избежание ошибок
старайтесь не допускать ситуаций, когда придется делить на ноль.

@Рис. 2.2. Иерархия сочленений ноги

4. Выделите узел LHip. Используйте меню Display  Component Display  Local


Rotation Axis (Показать  Показать элементы  Локальные оси вращения), чтобы
отобразить ориентацию сочленения. Чтобы обеспечить управление растяжением, вы
должны будете определить, какой множитель уменьшает длину сочленения. Если вы
применяете установки по умолчанию инструмента Joint, то сочленение должно
сориентироваться так, чтобы ось Х была направлена вниз по длине кости.
Врезка. В Maya функция ориентации сочленения направляет его на первое
дочернее ему сочленение. В таких ситуациях, как с запястьем, ось может
не ровняться основной массе руки. В этом случае редактируйте Local
Rotation Axis, чтобы привести ось в нужное положение.

5. В Hypershade создайте узел multiplyDivide. Назовите его LHipInverse.


6. В Hypergraph соедините атрибут scaleX сочленения LHip с атрибутом inputX2 узла
LHipInverse (рис. 2.3).
7. Отройте узел multiplyDivide в Attribute Editor и установите Operation на divide
(деление). В первом поле Input1 введите значение 1.0. Щелкните на поле правой
кнопкой мыши и выберите в контекстном меню пункт Lock Attribute (Заблокировать
атрибут).
8. В Hypershade создайте еще один узел multiplyDivide. Назовите его LHipSquareRoot.
Соедините атрибут outputX узла LHipInverse с атрибутом input1X узла LHipSquareRoot.
Откройте Attribute Editor и установите Operation на power (степень). В первом поле
Input2 введите 0.5. Щелкните на поле правой кнопкой мыши и выберите в контекстном
меню пункт Lock Attribute.
9. Соедините outputX этого узла с параметрами scaleY и scaleZ сочленения LHip.
10. Наконец, откройте Connection Editor. Выделите LHip и нажмите на клавиши Reload
Left (Перезагрузить левый) и Reload Right (Перезагрузить правый). Соедините
атрибуты растяжения этого сочленения с атрибутом scaleX. Закончив, Вы увидите
похожую на изображенную здесь схему узлов (рис.2.4).

@Рис. 2.3. Атрибут scaleX соединен с узлом multiplyDivide

Теперь, когда вы управляете параметром растяжения, два других множителя размера


компенсируются, чтобы сохранить объем сочленения (рис. 2.5). Если вы повторите этот процесс
для всех сочленений, то увидите скелет с полностью исполненными сжатиями и растяжениями на
каждом сочленении. Однако повторять это скучно, так что мы сделали MEL-сценарий,
позволяющий вам делать это повторно.

@Рис. 2.4. Законченная сеть узлов растяжения

@Рис. 2.5. Атрибут растяжения сочленения LHip

Чтобы применить скрипт, скачайте его с Web-сайта http://courseptr.com/downloads. Теперь


выделите узел или группу узлов. Убедитесь, что у всех узлов одна и та же ось растяжения. В
командной строке введите команду makeSandS, а за ней в кавычках ось растяжения. В этом
примере, когда растяжение направлено по осиX, команда выглядит вот так:
makeSandS(“X”);
Выделив один из узлов, с которыми вы запустили этот сценарий, вы заметите, что теперь у него
есть атрибут stretch. Отрегулируйте его значение, чтобы увидеть сжатие и растяжение узла. Вы
также заметите, что атрибутам масштаба не могут быть назначены ключевые кадры . Эта
небольшая часть сценария, создана с целью лучшей организации сцены. Так как атрибуты
масштаба теперь не могут редактироваться непосредственно пользователем, хорошо бы убрать их
из Channel Box.
Нужно также держать в уме, что в этом примере за минимальное значение растяжения было
принято число .1. Это значение абсолютно произвольно, но вы наверняка обнаружите, что если
выставить коэффициент растяжения меньше .1, то модель искажается слишком сильно, учитывая
постоянность объема. Вы вольны установить минимум, исходя из нужд вашего проэкта.

Встраивание растяжения в систему ИК


Теперь, когда мы применили сжатие и растяжение в системе прямой кинематики – ПК (Forward
Kinematics – FK), пора обратиться к ИК (Inversive Kinematics – IK). «Растягивающаяся ИК»
(«stretchy IK») – термин, часто используемый для описания такой системы, в которой сочленения,
управляемые контроллером ИК, растягиваются вместе с перемещением контроллера за пределы
уже установленной длины сочленения.
Одно из свойств хорошей анимации – пространственные отношения между последовательными
кадрами анимации. В традиционной анимации нога персонажа, совершающего прыжок, может
растянуться перед приземлением. Такое чрезмерное растяжение создает визуальную
продолжительность. В 3D размытие в движении зависит от его пространственной организации, но
прелесть традиционной мультипликации – в умении преувеличивать.
Чтобы создать управляемую инверсной кинематикой систему растяжения, припишите
сочленению Lknee параметр растяжения с помощью вышеписанных процедур или MEL-сценария
makeSandS, или откройте файл sampleLeg.ma. Вы можете найти этот файл на сайте
http://courseptr.com/downloads. Всем сочленениям системы ИК нужно добавить атрибут
растяжения, как в следующем упражнении.
1. При помощи инструмента IKHandle перетащите ИК-манипулятор от сочленения LHip
до LAnkle.
2. Создайте NURBS-окружность. Она будет служить контроллером сочленения. Используя
точечную привязку (point snapping), разместите окружность на лодыжке.
3. Выделите ИК-манипулятор и прикрепите его к окружности.
Переключитесь на боковой вид. Создайте узел дистанции (distance node) с помощью меню
Create  Measure Tools  Distance Node (Создать  Инструменты меры  Узел
дистанции). Он должен называться distanceDimension1. Переименуйте его в
LLegDistance. Узел дистанции берет данные о положении двух локаторов и вычисляет
расстояние между ними. Локатор дистанции понадобится вам, чтобы управлять
сжатием растяжением в системе ИК.
Выделите узел LHip и затем помощью клавиши Shift выделите первый локатор. Создайте
точечный ограничитель (рис. 2.6).
Выделите контроллер ноги; затем помощью клавиши Shift выделите другой узел и создайте
еще один точечный ограничитель.
Откройте редактор Hypershade и создайте узел multiplyDivide. Переименуйте его в
LengthRatio.
Соедините атрибут distance узла LLegDistance с атрибутом inputX узла LengthRatio (рис.
2.7).

@Рис. 2.6. Создание узлов дистанции в системе ИК

Врезка. Важно, чтобы контроллер был объектом точечного ограничителя.


Вы можете обнаружить, что ограничение ИК-манипулятора даст тот же
результат. ИК-манипулятор немного непредсказуем, так как если его
двигать за пределы сочленения, он попытается вернуться к конечному
эффектору.

В окне моделирования создайте еще один инструмент измерения дистанции. Он не будет


ничем управлять, а будет использоваться для измерения длины ног. Удерживая
клавишу v и тем самым используя точечную привязку разместите локаторы на
сочленениях LHip и LKnee, соответственно. Запишите результат измерения расстояния.
Расместите локаторы на сочленениях LKnee и LAnkle. Запишите этот результат. Вы можете
удалить систему измерения (локаторы и их узлы дистанции), когда закончите.
Сложите результаты двух измерений и введите сумму в поле input2X узла LengthRatio (рис.
2.8). Заблокируйте это поле с помощью контекстного меню. Установите |Operation на
divide.

Врезка. Очень важно, чтобы при вводе длины ноги в узел LengthRatio
единицы измерения были согласованы. Если вы не гонитесь за точными
размерами, то можете не использовать точное соблюдение величин.

@Рис. 2.7. Соединение узла дистанции и атрибута LegthRatio multiplyDivide-узла

Откройте окно Hypershade. Создайте узел с условием и назовите его LlegStretchCondition.


Соедините атрибут output1X узла LengthRatio с атрибутом firstTerm узла
LlegStretchCondition. Установите secondTerm узла с условием на 1. Заблокируйте этот
атрибут с помощью контекстного меню. Установите атрибут Operation на greater than
(больше чем).
Соедините атрибут LLegStretchCondition.output1X и атрибут stretch сочленений LHip и
LKnee.
На этой стадии мы настроили растягивающуюся ИК. При перемещении окружности вы
увидите, как ИК растягивается, стремясь к ней. Такая система – хорошее начало, и она вполне
может удовлетворить нужды небольшого производства. Но у нее есть и недостатки.
Во-первых, нет функции отключения растягивающейся ИК. Один из ключевых аспектов
риггинга персонажа – знание того, что, какие бы настройки вы не сделали, кто-нибудь захочет
избавиться от них. Хорошо бы по возможности наделить систему такой гибкостью, так что
давайте рассмотрим растяжение ИК ноги как отдельную опцию.

@Рис. 2.8. Добавление длины костей в систему растяжения ИК ноги.

Отключение
Первый пункт повестки дня – отключение растяжения ИК-манипулятора. Давайте предположим,
что некто анимирует шаги персонажа и хочет для управления ногой по своему усмотрению
включать или выключать растяжение ИК.
1. Выделите окружность Control.
2. В Attribute Editor добавьте атрибут ikStretch. Установите минимальное значение 0,
максимальное 1, значение по умолчанию 1.

Врезка. В этом случае растяжение ИК-манипулятора будет включено по


умолчанию. В зависимости от нужд вашего производства или предпочтений
аниматоров вы можете выставить значение по умолчанию на 0 или на
“off”.

3. В Hypershade создайте узел blendColors. Переименуйте его в LStretchyIKBlend.


4. Выделите узел LStretchyIKBlend и узел LLegStretchCondition и отобразите их в
Hypergraph. Соедините атрибут outColorR узла LLegStretchCondition и атрибут color1R
узла LStretchyIKBlend.
5. Выделите узел LStretchyIKBlend. В Channel Box установите атрибут color1R на 1.
Заблокируйте его через контекстное меню.
6. Соедините атрибут ikStretch объекта control и атрибут blender узла LStretchyIKBlend.
Теперь, если вы выделите окружность и переместите ее, нога растянется. Но если вы измените
атрибут ikStretch, то нога примет положение между нормальной и растянутой. Это не только дает
аниматору контроль над активностью растяжения, но также позволяет анимировать плавный
переход от растянутого состояния к нерастянутому.
Это хороший уровень гибкости, но все же когда-нибудь аниматоры точно захотят окончательно
отключить систему ИК и анимировать непосредственно сочленения. Так же они, несомненно,
захотят контролировать параметры растяжения. Отключить ИК легко, для этого в Maya у всех ИК-
манипуляторов есть параметр ikBlend. Мы бы хотели сделать следующее: отключить ИК,
растяжение ИК-манипуляторов, создать смешивание растяжений с ПК сочленениями.
Это потребует некоторой переработки уже сделанного. Создав растяжение на ИК-
манипуляторе, мы прицепили к нему параметр растяжения всех затронутых сочленений. Чтобы в
дальнейшем контролировать сочленения с Прямой Кинематикой, нам понадобится другая система.
Вспомните, когда создавалось управление растяжением каждого сустава, оно соединялось
непосредственно с параметром scaleX сочленения. Это тот scaleX, который управляет действиями
сжатия и растяжения. Чтобы создать смешивание, узел blendColors должен скользить между
атрибутом stretch и параметром scaleX.
1. Выделите узел control и откройте Attribute Editor. Создайте новый атрибут под
названием ikBlend с минимальным значением 0, максимальным 1, по умолчанию 1.
2. В Hypershade создайте узел blendColors. Переименуйте его в LHipFKBlend.
3. Соедините атрибут outputR узла LStretchyIKBlend с атрибутом color1R узла
LHipFKBlend.
4. Соедините атрибут stretch узла LHip с атрибутом color1R узла LHipFKBlend.
5. Выделите сочленение LHip. В Channel Box разбейте соединение, идущее к атрибуту
stretch. Соедините атрибут stretch с атибутом color2R узла LHipFKBlend.
6. Соедините outputR узла LHipFKBlend и scaleX сочленения LHip.
7. Проделайте эти операции с сочленением LKnee.
Теперь, когда аниматор управляет атрибутом ikBlend, Maya может не только переключать
ориентацию сочленений между ИК и ПК, но и смешивать растяжение уже созданных сочленений
с любым анимированным ПК сочленением обладающим растяжением.

Сжатие и растяжение сплайновой ИК


Идею управления растяжением ИК-манипуляторов можно применить и для управления сжатием и
растяжением системы сплайновой ИК. ИК-манипулятор с растягиванием сравнивает линейную
протяженность до объекта ИК с длиной костей, составляющих ногу. Результирующее число
используется как фактор масштабирования, входящий в атрибут растяжения соответствующего
сочленения. Этот метод можно применять и к сплайновой ИК. Все, что нужно, – это способ
измерения длины сплайна в его исходном и деформированном положениях. В Maya информация о
линейной протяженности кривой NURBs хранится в узле curveInfo. С его помощью можно создать
новый коэффициент растяжения сочленений в сплайновой ИК.
В следующем упражнении длина кривой будет использована для управления растяжением в
системе сплайновой ИК.
1. Начните с новой сцены.
2. Протяните ряд сочленений так, чтобы они образовали позвоночник.
3. С помощью инструмента splineIK создайте сплайновый ИК-манипулятор (spline IK
handle) от основания joint1 до вершины позвоночника.
4. Теперь к каждому сочленению добавьте параметр растяжения. Если вы пользовались
стандартным Maya инструментом Draw Joints (Тянуть Сочленения), то они должны
растягиваться вдоль оси X. Если нет, то через меню Display  Component Display 
Local Rotation Axis (Показать  Показать компонент  Локальная ось вращения)
определите, вдоль какой оси должно тянуться сочленение. Чтобы создать растяжение
для каждого сустава, примените сценарий makeSandS.mel.

Врезка. Чтобы выделить все сочленения в ряду, вы можете использовать


команду Select со следующими параметрами: Select -r -hi {название
сочленения}

5. Выделите NURBS-кривую, которая управляет splineIK. В командной строке введите


следующую команду:
arclen -ch 1;
6. Эта команда создает узел curveInfo и соединяет его с кривой.
7. Откройте Hypergraph пока выделена кривая, и отобразите входящие и исходящие
соединения. Вы должны увидеть, соединение узла curveInfo с кривой.
8. Выделите узел curveInfo и отройте Attribute Editor. Там есть поле под названием Arc
Length (Длина дуги). Скопируйте оттуда число: это длина кривой, и она понадобится,
чтобы создать коэффициент длины для управления растяжением.
9. Откройте редактор Hypershade. Создайте multiplyDivide-узел и назовите его
curveLengthRatio. В поле input2X введите исходный параметр Arc Length, о котором
говорилось в предыдущем пункте. Заблокируйте его через контекстное меню.
10. Выделите узел curveLengthRatio и узел curveInfo, удерживая клавишу Shift. Отобразите
их в Hypergraph. Соедините атрибут arcLength с атрибутом input2X узла
curveLengthRatio.
11. Выделите все узлы в системе ИК. Удерживая клавишу Shift, выделите NURBS-кривую,
которая управляет системой, и отобразите их в Hypergraph. Соедините outputX узла
curveLengthRatio с атрибутом растяжения каждого узла.
Выделите NURBS-кривую, которая управляет системой. Нажмите F8, чтобы войти в режим
редактирования компонентов. Выделяйте каждую из управляющих точек и при помощи команды
Deform  Create Cluster (Деформировать  Создать rластер) создайте кластер для каждой
управляющей точки на кривой.
Выделив и переместив какой-нибудь из кластеров, вы увидите, что длина сочленений меняется,
приходя в соответствие с длиной кривой. Эти кластеры могут быть интегрированы в
управляющую структуру позвоночника.
И снова, важно предоставить аниматору максимальный контроль. Несмотря на то, что
способность позвоночника сжиматься и растягиваться очень эффективна, все-таки неплохо уметь
отключать ее. Следующие шаги создадут систему выключения растяжения в сплайновой ИК.
1. В Hypershade создайте узел blendColors. Переименуйте его в ikStretchScale.
2. Выделите узел ikStretchScale и, удерживая клавишу Shift, узел curveLengthRatio.
Отобазите входящие и исходящие соединения в Hypergraph.
3. В Hypergraph соедините outputX curveLengthRatio и атрибут input1R узла
ikStretchScale.
4. Выделите узел ikStretchScale и откройте Attribute Editor. Установите атрибут color2R
на 1. Заблокируйте его через контекстное меню.
5. Соедините outputR узла ikStretchScale с атрибутом stretch каждого из сочленений.

Врезка. Если вы потеряли узел curveLengthRatio, его всегда можно


добавить в список выделения MEL-командой «выделенный объект -add
curveLengthRatio». Другой способ найти узел – выделить кривую, которая
управляет системой ИК, и отобразить входящие и исходящие соединения в
Hypergraph. Вы сможете найти узел curveLengthRatio, проследив
соединения.

На этом этапе атрибут смешивания узла ikStretchScale управляет растяжением сочленений в


системе ИК. Установка смешивания на 0 при установленном на 1 растяжении ИК-сочленений
отключает растяжение. Установка же смешивания на 1 включает растяжение.

Глава 3
Матричная математика
Вся 3D анимация создана в среде, являющейся математической моделью реальности. Эта модель
не очень точна, но, как и Матрица, она подчиняется правилам. И хотя их нельзя обойти или
нарушить, из них точно можно извлечь выгоду.
Этот раздел – не букварь по 3D. Подразумевается, что читатель уже имеет некоторое
знакомство с трехмерными системами координат и размещением точек в трехмерном
пространстве. В этой главе мы собираемся рассмотреть некоторые математические основы,
которые управляют 3D анимацией и и ведут к созданию Компьютерной Мультпликации (Computer
Graphics Imaging – CGI).

Точки и векторы
Точки и вершины похожи, но все же очень отличаются. Все они представлены в трехмерном
пространстве тремя числами. С точками все довольно просто: они показывают положение в
пространсве. Примеры точек – контрольные вершины и вершины полигональных плоскостей.
Вектор – это совсем другой зверь. Хотя он тоже представлен тремя числами, это не положение
в пространстве, а направление и расстояние. Каждое из трех чисел означает сдвиг по трем
главным осям. Векторы часто изображаются исходящими из некоторой точки, но у них нет начала.
Вектор можно сравнить с удаленным светом в компьютерной графике: его лучи характеризуются
только направлением и яркостью.
В Maya векторы используются в нескольких областях. Нормали поверхности – являются
векторами, и ограничители нормалей используют их для орентации объекта. С этой же целью
векторы используются с целевым ограничителем для вычисления ориентации объекта (UpVector).
В Инверсной Кинематике в Maya для управления поведением ИК-манипуляторов применяются
полярные векторы (pole vectors).
Некоторые векторные операции
Векторы обладают несколькими интересными свойствами, которые можно использовать в
некоторых специфических операциях. Одна из них – скалярное произведение. Оно очень полезно
для определения направления двух векторов. Скалярное произведение двух векторов
положительно, если они сонаправлены, отрицательно, если они направлены противоположно друг
другу, и равно нулю, если они перпендикулярны.
1. Откройте файл dotProduct.ma с Web-сайта http://www.courseptr.com/downloads. Вы
должны увидеть куб и две сплайновые кривые образующие стрелки.
2. Выделите vector2 и поверните его по оси Y (рис. 3.1). Вы заметите, что размер куба
меняется. Скалярное произведение этих двух векторов определяет размер куба.
3. Установите атрибут rotate второго вектора на 90. Куб исчезнет. Когда два вектора
перпендикулярны, их скалярное произведение равно нулю.
4. Установите атрибут rotate на 180. Куб появится вновь. Но если вы выделите куб и
проверите его масштаб, вы увидите, что он равен -1. Когда два вектора направлены в
противоположные стороны, их скалярное произведение отрцательно.
5. Вы можете свободно вращать векторы и изучать их влияние на куб.

@Рис. 3.1. Изменение направления векторов определяет размер куба через скалярное
произведение

В этой сцене для получения скалярного произведения используется узел vectorProduct . Открыв
Outliner, вы увидите два локатора, один из которых приходится дочерним другому. Если вы
откроете окно Hypergraph и отобразите входящие и исходящие соединения, то увидите, как
создана сеть. Параметр локаторов WorldPosition (глобальная позиция) выведен в промежуточный
узел plusMinusAverage. Вычитание одного локатора из другого создает вектор. Результат
вычитания передается в узел vectorProduct. Учитывая сущность векторов, помните, что
перемещение векторов не имеет значения, важно лишь их направление.
Векторное произведение – еще одна операция над векторами – базирующаяся на полярном
векторе и up-векторе целевого ограничителя. Векторное произведение двух векторов дает вектор,
перпендикулярный исходным. Чтобы увидеть пример векторного произведения, откройте файл
chapter03/crossProduct.ma. Вы увидите три стрелки. Повернув любую из двух, вы увидите, что
стрела в центре переворачивается, по мере изменения двух других векторов. Центральная стрелка
прикреплена целевым ограничителем к узлу, атрибуты перемещения которого соединены с узлом
vectorProduct, установленным на векторное произведение. В следующем упражнении исследуются
свойства полярного вектора.
1. Откройте файл crossProduct.ma с Web-сайта http://www.courseptr.com/downloads. Вы
увидите три стрелки.
2. Выберите кривую vector2 под узлом crossProduct. Поверните ее по оси Y. Вы должны
увидеть как стрела в центре перескакивает с направления вверх на направление вниз.
Эта стрела соединена целевым ограничителем с локатором, который преобразует
векторное произведение.
3. Установите атрибут rotateY кривой «vector2» на 60,0. Вы должны увидеть, что
указатель центральной стрелки направлен точно вверх.
4. Выделите узел crossProduct и перемещайте его как угодно. Вы должны увидеть, что
центральная стрелка всегда указывает в направлении, перпендикулярном другим двум
стрелкам (рис. 3.2)

@Рис. 3.2. Векторное произведение направляет средний вектор перпендикулярно двум другим.

Векторное произведение имеет исключительное свойство: оно всегда имеет значение


перпендикулярное двум другим векторам. В этом примере вектор векторного произведения
мечется между двумя направлениями, но оба они перпендикулярны исходным векторам. Однако
если два вектора постоянны, относительное положение векторного произведения не изменяется.
Матрицы
Вы не можете изучать основы 3D достаточно долго, не затрагивая матрицы. Матрица – это
математическая основа, которая делает 3D возможным вообще. Она управляет размещением всех
объектов в трехмерной сцене для анимации и рендеринга. Хотя непосредственно в Maya матрицы
не редактируются, умение их использовать весьма полезно для понимания того, как Maya
оперирует трехмерными объектами.
Матрица – это фабрика 3D. Это то, что обеспечивает точкам расположение, необходимое для
рендеринга. Каждая геометрическая вершина в Maya перед рендерингом обрабатывается
матрицей. Создание компьютерной анимации заключается в манипуляциях с матрицей для
создания движения. Когда объекты размещены в иерархиях, именно матрицы делают возможным
предсказуемое манипулирование ими. На самом деле, матрицы делают возможным существование
иерархий.
Матрицы составлены из 16 чисел, расставленных в четыре ряда и 4 столбца. Эти числа несут
всю информацию, которая необходима Maya для перемещения, вращения, масштабирования
трансформы. Для этого Maya берет данные входных атрибутов объектов из редактора каналов и
создает ряд матриц. Одну, например, для описания перемещения объекта, другую – для описания
вращения. Любая информация об объекте представлена в виде матрицы, а затем они сводятся
вместе. В результате получается матрица объекта. В то время как у трансформы объекта
появляется shape-узел, все вершины геометрии сводятся в матрице объекта, чтобы занять свою
конечную позицию во вьюпорте. Существует множество меньших матриц, вовлеченных в этот
процесс, но окончательный результат – это один набор из 16 чисел.
Рассмотреть матрицы с другой стороны можно с помощью системы координат. Всякий раз,
когда объект группируется с трансформой другого объекта родительскими отношениями, он
размещается в системе координат родительского объекта, поэтому при построении иерархий вы
создаете множественные системы координат.
Следующее упражнение предназначено для точной иллюстрации влияния матрицы на точки в
трехмерном пространстве.
1. Начните новую сцену.
2. Создайте пустую группу. Назовите ее “matrixGroup”.
3. Создайте локатор и переименуйте его в “testPoint”.
4. Выделив локатор, отройте Attribute Editor и создайте три атрибута типа float:
“offsetX”, “offsetY” и “offsetZ”.
5. Откройте Hypershade. В разделе Utility-node создайте узел vectorProduct.
Переименуйте его в matrixVP.
6. Соединяя информацию матрицы, проще устанавливать соединения через Connection
Editor. Выходные каналы матрицы не отображаются в Hypershade и Hypergraph.
Откройте Connection Editor и загрузите matrixGroup на левую панель, а matrixVP – на
правую. Убедитесь, что способ соединения установлен на from→to.
7. Соедините атрибут matrix узла matrixGroup с атрибутом matrix узла matrixVP.
8. Установите атрибут operation узла matrixVP на Point Matrix Product (Точечное
матричное произведение).
9. Выделите локатор testPoint и загрузите его на левую панель. Соедините атрибут offsetX
с атрибутом input1X узла matrixVP. То же самое проделайте с атрибутами offsetY и
input1Y, offsetZ и input1Z. Установите значение атрибута offsetZ на 5.
10. Нажмите на кнопку Mapping (Отображение) и переключите ее на tofrom (кот).
Соедините атрибут output узла matrixVP с атрибутом translate локатора testPoint.
11. Установите параметр offsetZ локатора testPoint на 2,5.
12. Выделите узел matrixGroup. Вращайте его как угодно. Обратите внимание, как локатор
поддерживает постоянный сдвиг от узла (рис. 3.3). Вы можете свободно
поэкспериментировать со значениями параметров “offsetX”, “offsetY”, и “offsetZ”.

@Рис. 3.2. Отображение результата размножения матриц на перемещение локатора

С помощью атрибутов offset вы можете перемещать локатор. Если вы выделите узел


matrixGroup и станете вращать его, то положение локатора будет меняться, оставаясь в
соответствии с пространственным положением узла matrixGroup. Именно так матрицы
используются для управления точками. Вы заметите, что локатор не вращается и не
масштабирутся относительно узла matrixGroup. Так и должно быть, потому что вершины или
управляющие точки, составляющие геометрию, не имеют ни направления, ни размера. Все
манипуляции с трехмерными объектами осуществляются через изменение их пространственного
положения с помощью матриц.

Объекты в пространстве
Чтобы показать возможности матриц, используем их в следующем упражнении для создания
собственного инструмента привязки. Хорошая привязка объекта – один из самых необходимых
компонентов инструментария риггера. Довольно часто Вам понадобится выровнять (align) два
объекта в рабочем пространстве. Инструмент выравнивания (Align tool) в Maya не берет в расчет
вращение и размер. Один из способов обойти это ограничение создание временной точки и
направленных ограничителей.
Чтобы получить доступ к матричной информации, можно воспользоваться командой xform.
1. Начните с новой сцены.
2. Откройте Script Editor (Редактор сценариев).
3. Введите следующие команды. При этом не нажимайте клавишу Enter на цифровой
клавиатуре, а вводите их как единый кусок кода.
global proc snap()
{
string $sel[] = ` ls -sl`;
float $t[] = `xform -q -t $sel[0]`;
xform -ws -t $t[0] $t[1] $t[2] $sel[1];
float $rl[] = `xform -q -ro $sel[0]`;
xform -ro $rl[0] $rl[1] $rl[2] $sel[1];
}
4. Введя скрипт, с помощью команды File  Save Selected (Файл  Сохранить
выделенное) сохраните его как snap.mel.
5. Создайте во вьюпорте локатор. Перемещайте и вращайте его так, чтобы он оказался в
положении, далеком от первоначального.
6. Создайте примитив – полигональный куб.
7. Выделите локатор и затем с помощью клавиши Shift выделите куб.
8. В командной строке введите команду snap и нажмите Enter (рис. 3.4).

@Рис. 3.4. Выполнение команды привязки

Вы увидите, что куб размещается в соответствии с расположением и ориентацией локатора.


Параметры куба не ограничены, как если бы его атрибуты были вручную привязаны к атрибутам
локатора. В сценарии вы заметите, что команда xform требует 16 аргументов из массива $sM float.
Это и есть числа, составляющие матрицу.
Команда xform – лучший друг сборщика персонажей. Атрибуты объекта – не очень точный
способ размещения его в пространстве. Команда же xform даст вам предельно точную
информацию о перемещении объекта, потому что она непосредственно обращается к матричной
информации. Учтите, что если локатор является дочерним объектом другого узла, то атрибуты его
перемещения могут быть равны нулю, в то время как его родительский узел как угодно
перемещается в среде. В результате куб может переместиться на 0 0 0, хотя реальное положение
локатора в пространстве будет другим.
Центры объекта
При построении матрицы перемещений Maya перемножает числа других матриц. Среди них –
матрицы центра вращения (rotate pivot) и центра масштабирования объекта (scale pivot). Они
позволяют пользователю контролировать и анимировать центральные точки атрибутов вращения
и масштабирования узла. Когда вы позиционируете объект в Maya, то центр перемещения объекта
также является его центром вращения. Центр масштабирования – отдельный центр, являющийся
главным элементом операции изменения масштаба объекта. Это позволяет создавать сложное
поведение узла. При использовании инструмента Move пользователь может нажать на клавишу
Insert, чтобы войти в режим редактирования центра, в таком случае будет перемещаться именно
центр вращения.
Центр вращения также регулируется всякий раз, когда объект перемещается из
первоначального положения, и применяется инструмент Freeze Transforms (Заморозить
перемещения). Атрибуты перемещения объекта обнуляются, но объект все еще может вращаться
вокруг своего первоначального центра. Это из-за сдвига центра.
Центры вращения, в своей сущности, значительно влияют на сценарий привязки. Если вы
попытаетесь привязать два объекта с разными точками вращения, то увидите, что они
выравниваются именно по точкам вращения. Применив точечный ограничитель, вы получили бы
другой результат. Рассмотрим обновление сценария привязки под вычисление различных точек
вращения.
1. Первое, что нужно добавить в старый сценарий привязки – получение данных о центрах
вращения обоих объектов. Команда xform имеет метку -rp, которая может быть
использована для получения данных о центрах вращения.
float $rp1[] = `xform –q –rp $sel[0]`;
float $rp2[] = `xform –q –rp $sel[1]`;
2. Нужно будет определить центры вращения обоих узлов. Центр вращения первого
объекта прибавится к его перемещению, а второй будет вычтен. Эти модификации
проявятся в команде, устанавливающей перемещение второго узла.
xform –ws –t ($t[0]+$rp1[0]-$rp2[0]) ($t[1]+$rp1[1]-$rp2[1]) ($t[2]+
$rp1[2]-$rp2[2]) $sel[1];
3. Чтобы увидеть работу нового сценария, откройте файл snap3.mb с Web-сайта
http://www.courseptr.com/downloads. В сцене два куба. Выделив их, вы заметите, что
перемещение обоих равно нулю, но они находятся в различных местах. Выделив их и
создав точечный ограничитель, вы увидите, что два куба теперь будут привязаны к
одной локации. Если вы запустите сценарий snap.mel, то никаких изменений не
произойдет: ни один куб не сдвинется.
4. Выделите кубы и запустите новый сценарий. Вы увидите, что оба куба выровнялись
так, как надо.
Эта новая привязка уже больше похожа на то, чего вы хотите добиться. Также она не опирается
на какие-либо соединения, поэтому она может быть использована для размещения узлов с
входящими соединениями от анимационной кривой.

Локатор
Всестороннее обсуждение использования матриц в Maya должно высветить некоторые
уникальные свойства локатора. Локатор – это трансформа с shape-узлом, которая создает
маленький крестик. Большинство shape-узлов в Maya перенимают пространственную ориентацию
от матрицы своей трансформы: вы можете запросить расположение вершины с помощью команды
xform, но это не управляемый соединением метод реального времени. Однако, локатор, имеет
живое соединение с действительным пространственным расположением своего shape-узла – точки
в пространстве, где пересекаются три линии, составляющие его изображение.
Это очень полезное свойство локатора, потому что позволяет создавать такие системы
риггинга, где вы всегда можете напрямую получать доступ к пространственному расположению
локатора, не создавая вторичный узел для его точечного ограничения. Это может сэкономить силы
при построении системы, использующей пространственное расположение локатора для
вычисления расстояния. В предыдущих примерах с операциями над векторами данные положения
локатора использовались для вычисления векторов. Собственно говоря, shape-узел
пространственного расположения локатора – это то, благодаря чему функционирует узел
измерения (dimension node), который измеряет расстояние между двумя точками пространства.

Узел dagPose
Одна из самых интересных и наименее известных функций в Maya – dagPose. DagPose – это узел,
записывающий матрицы узла или иерархию узлов и сохраняющий их для дальнейшего
использования. DagPose – это узел, который Maya использует для хранения позы первичной
привязки (bind pose) персонажа, когда кожа прикреплена. DagPose может быть действительно
полезным инструментом для определенных операций моделирования, но у него есть важные
ограничения:
dagPose не может восстанавливать матрицу объекта с входящими соединениями каналов
перемещения, вращения или масштабирования.
команда dagPose не хранит данные о видимости или других индивидуальных атрибутах. Она
хранит только матрицы объектов.
Эти ограничения кажутся весьма серьезными, но у dagPose есть и преимущества. Одно из них
заключается в быстроте и точности. Другое – в том, что dagPose записывается в файл, и не
нуждается в дополнительных внешних хранилищах или в написании посторонних скриптов . Узел
DagPose может быть особенно полезным для создания дополнительных поз скелетов с целью
улучшения отладки деформаций.
1. Откройте файл dagPose.ma. Вы можете найти его на http://www.courseptr.com/downloads.
Вы должны увидеть персонаж PigGoblin среднего разрешения.
2. Пара узлов dagPose уже сохранены для этого персонажа. В командной строке введите
следующее:
dagPose –restore stride;
3. Вы должны увидеть изменение позы персонажа. Чтобы увидеть другой dagPose, введите
следующее:
dagPose –restore spreadEagle;
Поза персонажа теперь должна повторять показанную на рисунке (рис. 3.5).
4. Теперь давайте восстановим первичную позу привязки персонажа. В меню Skin (Кожа)
выберите пункт Go to Bind Pose (Перейти к первичной позе привязки), чтобы вернуть
персонаж к его первичной позе привязки.
5. Затем мы сохраним dagPose. Выделите сочленения персонажа и разместите их в позу
прыжка (рис. 3.6).

@Рис. 3.5. DagPose восстановил позу spreadEagle

6. Когда поза Вас устроит, выделите узел pgDeform. В командной строке введите
следующее:
dagPose –s –n jumpPose;
Вы увидите, как фигура становится в позу, как на рисунке (рис. 3.6).
7. Чтобы проверить сохраненную позу, с помощью пункта меню Skin  Go to Bind Pose
верните персонажу первоначальную позу. Затем в командной строке введите
следующее:
dagPose –r jumpPose;
Вы должны увидеть, что персонаж вернулся в созданную вами позу.
Как упоминалось ранее, первичная поза привязки прошедшего скиннинг персонажа – это его
dagPose. Это полезно знать, потому что часто при работе с персонажем, к которому прикреплены
несколько кожных кластеров (skin cluster), первичная поза привязки может быть утерянна. Если
такое произошло, то команда Skin  Go to Bind Pose не вернет персонаж в первоначальную позу
скиннинга. В этом случае для восстановления скелета иногда можно применять команду dagPose.
Восстанавливая первичную позу привязки вручную с помощью команды dagPose, лучше
придерживаться следующего синтаксиса:
dagPose –restore –global -bindPose;

@Рис. 3.6. Поза прыжка

Нет необходимости что-то выделять, чтобы восстановить dagPose. Как вы могли заметить,
команды относящиеся к dagPose одновременно работают с целыми иерархиями. Вы можете
сохранить dagPose выделенных объектов, вставив метку -sl во время сохранения первичной позы
привязки.
Как видите, dagPose – очень полезный инструмент для настройки деформаций на простом
скелете. Он упрощает проверку деформаций и хранение на будущее данных о положении
объектов. Так как объекты dagPose являются узлами, то они для простоты доступа сохраняются в
сценах Maya.

Глава 4
Интервью с Майком Кометом
@Рис. 4.1. Майк Комет
Майк Комет – ведущий персонажный риггер в DNA Productions, работает над их вторым
художественным фильмом под названием «Муравей-задира» («Ant Bully»). Майк с его Web-
сайтом http://www.comet-cartoons.com и бесчисленными Web-форумами по анимации – клад
анимационных и технических ноу-хау. В его карьере было все: от игр и видеопроизводства до
анимационных художественных фильмов, созданных с помощью широкого диапазона программ,
включая Maya и 3DSMax. Майк – отличный пример сочетания художественных и технических
способностей, и мы очень счастливы, что в этом интервью он поделился с нами своими мыслями и
опытом в персонажном риггинге.
Майк, с чего ты начал изучение компьютерной графики?
В детстве я смотрел много мультфильмов, и от Warner Bros., и от Disney. Они мне всегда
нравились, но я никогда не думал, что действительно попаду в эту индустрию. Очень давно мой
отец принес домой старый компьютер Apple, а со временем появились PC. Это были старые
добрые дни зеленых монохромных экранов, 5,25-дюймовых дискет и одного лишь текста. Я кое-
как научился программировать в BASIC и начал делать текстовые игры и графические текстовые
игры, с текстовыми блоками вместо графики. Позже я устроился в комманду компьютерщиков, а
потом, когда появилась настоящая графика, стал заниматься ей.

@Рис. 4.2. Один из персонажей Майка

К средней школе я научился ассемблеру и C на 8086/80386. В подражание Deluxe Paint написал


простенькую программу для 2D рисования, потому что мне был нужен свой собственный формат
для игры, которую я хотел сделать, но так и не закончил. В старших классах я больше узнал об
анимации. Моя тетя раздобыла книгу Кита Лэйборна (Kit Laybourne), которая называлась «The
Animation Book». В ней было мало о принципах анимации, но зато рассказывалось об актуальных
типах анимации, вроде целлулоида, stop-motion, рисования по стеклу и так далее, и в ней
говорилось, камеру какого типа купить и как делать анимацию. Тогда я купил камеру Super8mm,
которая могла делать stop-motion, и начал дурачиться в подвале.
Тем временем на большом экране начали появляться вещи типа «Юный Шерлок Холмс». Еще я
смотрел некоторые из оригинальных роликов MindsEye о компьютерной графике, но никогда не
думал, что когда-нибудь смогу сделать такое. В них была показана рабочая станция Alias
размером со стиральную машину, а стоила она, наверное, как маленький дом. Примерно в 1989
или около того появился Video Toaster от New Tek. Мой папа интересовался видеографией, и
поэтому мы оказались в магазине Amiga. Я вошел внутрь, и сразу же был поражен
рэйтрейсинговой потоковой анимацией выполненной на Amiga. И вот оно. Меня зацепило сразу
же, как я осознал, что трехмерную графику действительно можно делать на PC. Я вышел с Amiga
3000 и Imagine 3D от Impulse и сам начал учиться компьютерной графике.
Я работал аниматором в Volition Inc., игровой компании в Шампани, Иллинойс (Champaign,
Illinois). Еще я анимировал, писал скрипты, занимался риггингом и другой работой в Big Idea в
Чикаго. В Blue Sky Studios в Нью-Йорке я занимался риггингом персонажей и моделей для
«Роботов» («Robots»), а также написанием сценариев и инструментов для них и для «Ледникового
Периода 2» («Ice Age 2»). Сейчас я ведущий сборщик персонажей в DNA Productions в Далласе,
Техас, с их вторым художественным фильмом.
Что привело тебя к сборке персонажей?
Ну, сначала я был самоучкой в том, что относится к компьютерной графике. Это происходило
вполне естественно, учитывая опыт программирования и некоторые знания в компьютерной
науке. Вообщето, сначала я увлекался моделированием и текстурированием, это что-то вроде того,
с чего вам приходится начинать в работе над собственным проектом. Когда я добрался до
анимации, я решил заняться ей и уделять этой области больше времени. Вообщето работать я
начал как аниматор. Но по мере того, как я больше узнавал о риггинге и написании скриптов, я
уделял этому всё больше времени, так как обнаружил, что это мне нравится больше.
На самом деле, вначале я беспокоился, что вообще не буду анимировать. В Big Idea многие
друзья советовали мне уйти в риггинг, что, я думаю, имело смысл, потому что мои сильные
стороны относились как раз к этой области. В конце концов, я думаю, это был великий шаг.
Конечно я не хочу сказать, что я совсем ушел из анимации. В какой то степени это забавно - не
слушать постоянно распоряжения режиссера и не иметь дело с чем-то субъективным. Риггинг –
вещь довольно определенная, целенаправленная, тут вы точно знаете, что вам нужно делать, и у
вас есть некоторые идеи, как этого достичь.
Ты можешь рассказать о том, как опыт аниматора влияет на риггинг персонажа, и
наоборот?

@Рис. 4.3. Другие персонажи Майка

Возможно, это самая важная вещь, которая дала мне понимание того, что я должен и чего я не
должен делать во время риггинга, и почему важно помогать аниматорам делать то, что они хотят.
Каждый этап производства направлен на облегчение работы кому либо ещё. Моделирование
работает на риггинг, риггинг – на анимацию, анимация – на освещение, все работают на зрителей,
и так далее. Вы можете делать довольно сложный и классный риггинг , но если аниматоры не
собираются использовать его, или он им не нравятся, то это абсолютная потеря сил. Я помню
вывеску, которую однажды прочитал на дальней стенке магазина. Там было два правила. Правило
1: клиент всегда прав. Правило 2: Если клиент неправ (а это бывает часто), смотри правило 1. Я
подумал, что это относится и к риггингу. В конце концов, он должен работать на анимацию, как и
на другие отделы, которые работают со сборкой.
Что это был за переход – из такого места как Big Idea в Blue Sky, в отношении работы
техническим директором по персонажам?
Лично для меня самым большим изменением стал уход от работы мастера на все руки к
концентрации на чем-то одном. Это дало мне время на то, чтобы вернуться к программистским
корням и снова взяться за C++ после восьмилетнего перерыва. Я помню, как первую неделю или
около того я постоянно напоминал себе, что это не сон и что я действительно работаю там.
Поначалу это действовало на нервы, осознание того, каким талантом и опытом ты окружен, но это
был огромный опыт, и я многому от всех там научился.
Какими были первые задания для «Роботов»?
Я присоединился к производству после того, как они уже много поработали над
функционированием персонажей. Первой сборкой персонажа, которую я сделал, был этот
маленький похожий на куклу «охранник». У него была юбка из колец, и изначально по сценарию
персонаж должен был не только действовать, но и быть способным, скажем, лечь с этой юбкой на
землю. Я положился на то, что уже изучил технологию сплайновой инверсной кинематики в Maya,
к тому же я предложил аниматорам несколько творческих способов управления ей. Также
изначально мимика главного персонажа была жестче, потому что они хотели, чтобы он был
больше похож на робота, но я помог разработать систему, которая позволяла формировать более
естественные выражения лица, и они ее приняли. Возможно, самым большим мучением были
руки-кабели. Несколько персонажей обладали риггингом с подобного рода руками. К счастью,
большая работа была уже проделана другими людьми, хотя кое-что я обновил и применил заново
к многим из таких персонажей.
Можешь ли ты рассказать о том, как настраивал управление юбкой или руками-кабелями?
Например, нашел ли ты какие-либо ограничения в сплайновой ИК, которые приходилось обходить
или ещё что-нибудь в этом роде?
По большей части, сборка сплайновой ИК охранника была очень скоротечной. Он был в
большей степени основан на стандартных настройках сплайновой ИК. Главная хитрость была в
том, чтобы обеспечить правильную точку вращения в нужном месте без пересечения. Это главным
образом включало работу с моделированием и проверкой правильности центральных точек. Для
продольных скручиваний нужно было всего лишь установить несколько локаторов с правильными
дочерними отношениями и с правильным порядком осей, чтобы скручивание не затрагивало
главный сустав. Я думаю, важно понимать, координатное пространство и порядок вращения, и как
все это соотносится к созданию подобных вещей. Чтобы дать аниматорам желаемый ПК контроль,
, но с ИК-риггингом, в сборке персонажа были созданы необычные верхний, нижний и средний
управляющие элементы, которые были соединены в манере ПК. Аниматоры могли перемещать
или вращать нижние элементы, но также могли произвольно располагать нижние конечности. Не
революционная идея, но потребовалось немного работы, чтобы убедиться, что это работало
правильно с собственными разработками Blue Sky. Окончательная иерархия ПК для юбки была
затем привязана к управлению телом, так что когда верхний отдел позвоночника двигался, это
было более или менее похоже на стандартную ИК бедер, но, согласно пожеланию использовались
органы управления ПК. Кроме того, выражения для чтения длины сплайновой кривой позволяли
оперировать авто-расширением и сокращением длины сочленений, чтобы обеспечить каскадное
сокращение или расширение колец. В конце персонаж проводит больше времени на задних
планах, так что учитывая изменения в сценарии я не уверен, что юбку видно больше, чем
первоначально планировалось. Это был тот случай, когда я взял мои базовые знания о риггинге
сплайновой ИК, распространил их отдельно на расширение и сокращение, как следует изучил
атрибуты скручивания по моему собственному методу, и связал все это вместе, чтобы дать
аниматорам такое управление, какое они хотели. Я думаю, стоит учится у других людей следуя
моему примеру, затем брать всё это и придумывать творческие решения текущих вопросов
риггинга.
Как ты подошел к исследованию и разработке персонажей (данные аниматоров, связь с
кино)?
Роботы по дизайну фантазийны и довольно сильно стилизованы. Когда я пришел, основная
работа над риггингом уже была завершена, но всегда были изменения и требования, исходившие
от аниматоров. Для «Ледникового периода» я мог сделать больше фундаментальной работы,
помогая стандартизировать сценарии автоматического риггинга. Я думаю, что благодаря
сценарному подходу достигается более быстрый оборот времени на риггинг, как и на
слаженность, что важно, если вам нужно исправить сборку, сделанную кем-то другим. Во многих
случаях исследование и разработка были либо основаны на некоторых очевидных проблемах,
требовавших решения, либо через разговоры с аниматорами об улучшениях или об их идеях о том
как достичь желаемого.
Мы обращались к справочным книгам по анатомии за помощью в размещении сочленений и
для того чтобы понять, как все эти вещи должны работать. Но многое лежит на поверхности.
Помимо этого, так как действие становилось более мультяшным, стремление строго следовать
анатомии не было строгим требованием.
Каковы проблемы риггинга роботов относительно риггинга реалистичных персонажей?
Во многих отношениях роботы проще, потому что вы видите иерархию такой, какой вы её
сделали. В то же время, нужно немного схитрить, как например с поршнями, которые
выдвигаются дальше, чем могут втянуться в свой корпус, или работа с такими вещами, как
шпунтовые сочленения, и так далее. Я думаю, это здорово, потому что дает шанс приблизиться к
уникальным и твердым идеям корневой структуры работы риггинга. Вы можете взять это и
применить те же идеи к реалистичным моделям.
Как ты приступаешь к сборке? Какие приемы ты используешь во время риггинга: хитрости,
которым ты научился, или просто лучшие маневры, которых нужно придерживаться?
Ну, во-первых – я всегда проверяю модель. Базовые вещи типа типологии и правильных
деталей в первую очередь. Я всегда начинаю с рассмотрения иерархии сочленений и
расположения точек опоры объектов. По большей части, в начале реального производства, я
пытаюсь понять, какое управление хочет получить аниматор. Так что к тому времени, когда мне
нужно действительно приступать к сборке персонажа, все это уже известно. В сущности, это
запуск нужного сценария ноги или руки и так далее, и сведение всего этого вместе. Но вначале
процесса всегда много суеты, необходимой для того чтобы понять, какие органы управления
аниматора устраивают или не устраивают, достаточно ли их или недостаточно. Основанная вещь,
которой нужно придерживаться – достаточный, но не чрезмерный контроль. Вам не нужен
смехотворно перегруженная сборка, но вы также не хотите, чтобы аниматоры приходили к вам
каждый день и просили расширить контроль. Так-же важно иметь достаточно времени в
предпроизводстве, чтобы оценить и протестировать модели.
Я стараюсь предложить такие сценарии сборок, которые можно использовать вновь, и
применять в различных сферах. Например, базовый сценарий риггинга позвоночника можно
применять не только в ПК, но и в ИК или сплайновой ИК, и так далее. К тому же скрипт может
иметь опции для конкретного программного обеспечения, которое захочет установить риггер.
Такой подход означает, что вы можете легко и быстро перенастроить персонаж. Одна из вещей,
которые мне нравится делать – назначать родительские связи сочленениям подвергшимся
скинингу на уже собранном персонаже. Тогда, если вам нужно совершить сборку заново, быстрым
способом будет просто разбить родительскую связь, переназначить её, избавиться от старых
компонентов сборки и переустановить всё заново.
Каким образом ты согласовываешь разные требования аниматоров и конкретных эпизодов в
отдельной сборке (например, все в одной сборке или сборка на эпизод)?
Я думаю, что сборку персонажа надо совершенствовать во всем, что требовалось от базовой
сборки. Обычно есть определенные вещи, которые могут потребоваться для одного особенного
эпизода, но как правило базовая сборка должна справляться с большинством этих требований. Из
моего опыта, когда аниматоры что-нибудь требовали, это «что-нибудь» обычно можно было как-
нибудь использовать потом.
Какими бы разными небыли аниматоры, в конце концов, директор по анимации или
руководство действительно должны решить, что в сборке остается, а что убирается. Вы можете
добиться желаемого, пытаясь впихнуть в сборку все, что хочет каждый из них, но в таком случае
она становится грязной и медленной. Кроме того, часто возникают противоположные точки
зрения на то, как это нужно делать. Лучший способ справиться с этим – сделать несколько
тестовых вариантов и дать приоритетному в анимации человеку решить, какой всё же вариант
будет рабочим .
Какой тип интерфейса, по-вашему, нравится большинству аниматоров: окно ГИП
(графического интерфейса пользователя) (graphical user interface – GUI), управляющие органы на
экране и так далее? Когда дело доходит до сборки, каких изменений или усовершенствований
чаще всего требуют аниматоры, с которыми ты работаешь?
Я думаю, люди которые пользуются графическими органами – предпочитают их. Хорошо все
маленькое и компактное, и в тоже время гибкое. Марк Бем (Mark Behm), аниматор, помог
разработать некоторые действительно классные штуки и в Big Idea, и в Blue Sky. Я перенял многое
из этого и помог доработать и сохранить некоторые из его оригинальных работ. В последней
версии (ИП) $$ Под ИП подразумевается «Интерфейс Пользователя» - прим ред. $$ есть несколько
довольно классных функций, как, например, поддержка drag-and-drop и настраиваемые фоновые
изображения, у которых теперь появилась возможность выступать вперед или оставаться сзади,
так что теперь все будут счастливы.
Обычно, некоторые из распространенных просьб и изменений – незначительные вещи, которые
или были упущены, или из-за нехватки времени на полное тестирование не вошли в сборку для
анимации. Blue Sky была хороша в исправления ошибок, а иметь всего лишь час или около того
времени для осуществления требований к анимационной сборке персонажа было довольно
обычным.
У тебя есть какие-нибудь подсказки или решения для работы над риггингом в процессе
производства? Как ты поступаешь с изменениями или исправлениями персонажей, такими как
обновление текстуры или изменения модели, без добавления всей её истории?
Я всегда проверяю, чтобы история геометрии модели была очищена и готова к риггингу. Я
фанат обращения к модели во время риггинга, и потом, до экспорта сборки для анимации,
импортирования модели. Так файл модели можно быстро и легко обновлять и держать чистым, и
файл со сборкой персонажа при загрузке будет получать обновление геометрии. Также важно
иметь хорошие инструменты для сохранения весов любой деформации, которую вы сделали,
чтобы Вам не пришлось переделывать весь риггинг. Особенно в начале производства, когда
компоненты сборки могут часто меняться, важно уметь за малое время откатить сборку персонажа
или сделать ее заново. Обладание инструментами для поддержки всего, над чем бы Вы не
работали, – решающий фактор.

@Рис. 4.4. Интерфейс скриптованного персонажа в 3DSMax. Этот сценарий можно найти на
Web-странице Майка http://www.comet-cartoons.com. Сценарий сбора атрибутов в Maya Bonus
Tools очень хорошо совмещается с пользовательским интерфейсом

Риггинг персонажей заканчивается вручную, или есть какая-то автоматизация процесса,


которая помогает настраивать персонаж и привязывать кожу как в случае с фильмом
«Роботы»?
Как уже упоминалось, многие вещи автоматизируются. На самом деле, «Роботы» – не совсем
тот случай, но поскольку у нас было время, чтобы сделать это, мы написали себе в помощь
скрипты. В «Ледниковом периоде 2» множество людей могли тратить время на настройку
риггинга и скриптов, так что производство было очень неплохо автоматизировано. Я также
проделал кое-какую работу для погружения в интерфейс Maya с целью улучшения раскраски
весов и добавил некоторые функции, которые, как я думали, должны были там быть, чтобы
помочь ускорить скиннинг, но их не было.
В чем ты до сих пор видишь основные сложности с трехмерными персонажами и риггингом?
Это недостатки программного обеспечения или людей?
Я думаю, в общем, риггинг и скиннинг делаются многими способами, и все же очень близки к
тому, как они делались несколько лет назад. Будет интересно посмотреть, как по мере улучшения
технологии меняются вещи типа деформации кожи и имитации динамики. Вещи типа волос и
одежды, которые лично я всегда ассоциировал, во многом, с эффектами, все еще должны
управляться анимацией и иметь управление, которое может использовать аниматор.
Усовершенствование этих типов сложных систем и ускорение обратной связи, я думаю, еще
какое-то время это будет оставаться проблемой. Так же кажется, попытки создать реалистичных
людей – все еще целое испытание. У вещей есть тенденция выглядеть почти настоящими, но не до
конца, и в результате образ становится еще более странным. Лично я предпочитаю более
мультяшную работу, так что я не повернут на решении таких вопросов.
В сущности, вещи типа сжатия и растяжения могут тоже быть важным вопросом и требовать
большой работы. Большая ее часть может быть выполнена, но нужно долго копаться, чтобы 3 D
приложение выдало такой же результат, как при рисовании персонажа от руки. Обычно
останавливаются на чем-то средним между двумя вариантами.
Как ты помогаешь себе оставаться в курсе новых инструментов и решений риггинга?
Я думаю, большая часть членов любой хорошей команды риггеров учится в команде друг у
друга. Когда люди приходят и предлагают решения, им нужно сначала очень много узнать о том,
как все это делается. Также хорошо бы попытаться понять и держаться на уровне того, что делают
другие студии и что они говорят о своем подходе.
Я знаю, что ты много занимался риггингом и написанием сценариев и в Maya, и в Max. Ты
можешь рассказать о различиях в твоем подходе к риггингу в обоих программных пакетах?
На самом деле, многие работы очень похожи. С большинством базовых инструментов, таких
как ИК, ограничители и так далее, можно обращаться одинаково в обоих пакетах. Наверное,
главная причина, по которой я сейчас больше использую Maya, в том, что у нее более быстрая
архитектура для работы с вещами типа выражений и соединений, и она позволяет делать те же
самые вещи проще и быстрее.
Как ты думаешь, в таких программах, как Maya, есть инструменты, которые используются
мало, когда дело доходит до риггинга?
Я не знаю, есть ли в Maya части, используемые не на полную мощность. Обычно мне удобно
пополнять программу моими собственными инструментами и использовать технику
предпочитаемую мной. То, что я порекомендовал бы каждому риггеру, – попытаться понять
базовую матричную и векторную математику, и научиться использовать данные dgNode в Maya.
Информация о том, какие атрибуты могут иметь узлы в Maya, может очень помочь и на самом
деле позволить вам делать вещи, о которых вы могли не знать.
Ты упомянул изучение использования данных dgNode. Можно поподробнее об этом? И раз уж
мы заговорили о математике, у тебя есть пример, когда и как понимание математики матриц и
векторов помогло тебе в риггинге или помогло решить главную проблемму? Я знаю, что есть
много людей, которые хотели бы узнать об этом, но не знают, с чего начать.
Данные dgNode полезны для того, чтобы взглянуть на то, что происходит внутри Maya. Это
может быть полезным как для понимания того, как свести ваши собственные скрипты и плагины
вместе, так и для того, как может быть выполнена та или иная вещь. Например, если вы кое-что
знаете о математике, стоящей за алгоритмами скиннинга, то вы можете понять, что основная идея
– это просто «матрица», представляющая текущую трансформацию сочленений в пространстве
(например, положение, вращение, масштабирование), умноженную «обратной матрицей»
положения покоя (rest pose). Основная идея в том, что вы получаете «изменение» или «дельту»,
произошедшие таким образом. Простой способ представить это взять в пример перемещение. Если
перемещение сочленения по X=5, когда вы привязываете его коже, то изменение фактического
каркаса кожи происходит только тогда, когда оно уходит от первоначального X=5. Если вы
двигаете сочленения на X=7, то кожа реагирует перемещением на +2 по X, если она привязана к
этому сочленению. Так что в сущности X=5 – положения покоя сочленения кожи. Другими
словами, X=5 – это «начало», с которого начинаются изменения. Простой способ сделать это –
взять текущее положение, скажем, 7, и вычесть 5. Это похоже на то, как если взять текущую
матрицу и обратную матрицу и перемножить их. Вы практически уравновешиваете положения
покоя из «начала отсчета» и теперь значения, которые вы получили, похожи на «начало
положения покоя».
Так или иначе, в Maya каждый узел трансформации имеет «матрицу» и «глобальную матрицу»
(«worldMatrix»), также и наоборот. Если вы откроете Connection Editor трансформы и
пролистаете атрибуты для который нельзя установить ключевую позицию, то увидите их наверху.
Теперь, если зная это, Вы откроете Hypergraph в Maya и посмотрите на сочленение и на то, как
оно соединено с кластером кожи, вы заметите, что каждое сочленение кожи имеет атрибут
worldMatrix, соединенный с массивом matrix кластера кожи.
Со всеми этими знаниями вы можете спросить, если сочленение задает «текущее» значение
matrix, как skinCluster узнает о положении покоя или worldInverseMatrix. Ответ можно найти,
прочитав о skinCluster в файле помощи данных dgNode. Заглянув в файл помощи, вы увидите, что
массив matrix является «множеством управляющих трансформ». Технически, вы можете
подключить сюда не только сочленение, но и все, что вы хотите задействовать как кость. Но
настоящий секрет открывается, когда вы читаете о массиве атрибутов bindPreMatrix. Там
указывается об «обращение матрицы ведущей трансформы во время привязки». Другими словами,
это обращение матрицы сочленения в положении покоя, или значение атрибута
worldInverseMatrix, когда сочленение в первоначальном положении.

@Рис. 4.5. Вот пример кожных и мышечных плагинов Майка с раскрашенными весами –
продвинутые математические концепции в действии.

На этом этапе вы можете использовать эту информацию, чтобы легко сбросить положение
сочленения подвергшегося скиннингу без необходимости отсоединять, а затем переделывать
скиннинг. Пока worldMatrix и worldInverseMatrix соединены с матрицей skinCluster и
bindPreMatrix, желательно с объектами находящимися в одной локации, сочленение не
подействует. Вы можете вручную взять сочленение и соединить его worldInverseMatrix с нужным
bindPreMatrix (убедившись, что соединили с одним и тем же элементом массива), и тогда вы
сможете передвигать сочленение без всякого воздействия на скиннинг. Затем вы можете разбить
это соединение и вместо этого скопировать значения с помощью getAttr и setAttr, так что Maya
будет помнить прошлые значения , и теперь скиннинг снова работает.
Если хотите, вы можете даже сделать второе сочленение, переименовать его во что-нибудь
осмысленное типа jointBASE и соединить его обратную матрицу с массивом bindPreMatrix
кластера кожи. Теперь у вас есть «базовый» узел, во многом похожий на базу у деформирующей
сетки (Lattice). Если вы сдвинете их оба вместе, ничего не произойдет - вы просто регулируете
начало проскиненного сочленения. Если вы сдвинете только оригинальное сочленение, то
получите деформацию.
Так же всегда хорошо иметь понимание основ того, как трансформы, порядок вращения и
координатные системы работают вместе. К примеру если у Вас есть объект, и он стал дочерним
другому, то значения дочернего объекта становятся «родственными предку». Другими словами,
они находятся пространстве родительского объекта. Используя это Вы можете делать такие вещи,
как группировка объектов для отмены управления или придумывать способы чтения вращения и
расположения одного объекта относительно другого. Если бы дочерний объект был ограничен
чем-нибудь еще, точечным ограничителем или ограничителем ориентации, то его значения были
бы равны вращению и перемещению объекта ограничителя, но соотносились бы с родительским.
То есть значения будут в пространстве родительского объекта. Это может быть полезно при
попытке автоматизированный риггинг таких вещей, как ключицы или вращение сустава запястья,
и так далее.
Для кого-то, у кого нет базовых знаний в математике или компьютерных науках, сейчас
доступно бесчисленное количество книг, рассказывающих о математике в компьютерной графике
и объясняющих все эти вещи. Хороший пример – «Mathematics for 3D Game Programming and
Computer Graphics» («Математика для программирования 3D игр и компьютерной графики»)
Эрика Лэнгиеля (Eric Langyel) (ISBN: 1584502770). Она начинает с хороших основ и все время
продвигается к более сложным темам. Даже первые несколько глав о векторах и матрицах могут
помочь интересующимся риггингом людям и дать понимание того, что действительно происходит
за кулисами коммерческого программного пакета.
Ждешь ли ты каких-нибудь крупных достижений в риггинге компьютерных персонажей в
ближайшем будущем?
Я полагаю, люди будут тяжело работать, пытаясь достичь все более и более фотореалистичного
результата. Возможно множество вещей, как мышечные системы, волосы и одежда, будут
улучшены и станут более пригодны для коммерческого программного обеспечения.
И последние хитрость или совет, который ты можешь дать читателям, желающим
улучшить свои навыки.
Главное, что я бы сказал – учитесь математике и программированию сколько сможете. Эта база
может сильно помочь в риггинге. Еще хорошо хотя бы чуть-чуть покопаться в анимации, чтобы
понять, что и почему нужно делать.
Спасибо тебе за твое время и за замечательное объяснение dgNode и матричной
математики, это великая вещь.

Раздел 2
Риггинг
Глава 5
Планирование и организация риггинга
Когда Вы получили материал для риггинга, вы должны удостовериться что материал готов к
использованию, перед тем как приступать к риггингу. Давайте представим: Вы можете сломя
голову приступить к риггингу, так как впереди маячит срок сдачи проэкта . Но это худшее, что Вы
можете сделать, потому что все может пойти неправильно даже на этой стадии и привести к тому,
что потом Вам придется переделать много тяжелой работы. Когда Вы спешите что-то сделать, Вы
можете пропустить даже элементарные вещи, такие как неправильно настроенный масштаб
модели для работы или не замороженные трансформации, приводящие к проблемам при
скиннинге и рендеринге. Настройка материала и уверенность в том, что Вы организованны и
понимаете требования к сборке, так же важны, как и сам процесс риггинга. Эта стадия настройки –
решающая: она не только сохранит ваше время в будущем, потому что вам не придется
переделывать работу, но потом еще и сэкономит время всей производственной команде. В целом
результат подготовки материала это – проверка того, что у вас есть файл, который можно
настроить и передать команде, не беспокоясь о том, что у членов команды возникнут проблемы
из-за его неполадок или необходимости переделывать работу.

Вычисление геометрии и начало с чистого листа


Рабочий процесс вашей студии диктует, как подготавливать материал. Например, вы можете
получить файл модели в любом формате и с любым типом геометрии, построенный в студии или
приобретенный у другой производящей компании. Кроме того, модель может быть уже
затекстурирована или передана одновременно вам и художнику по текстурам. Тогда изменение
модели на этом этапе может быть осложнено, потому что это повлияет на два отдела, а не на один.
Но если вы понимаете рабочий процесс и необходимость в материале, то при возникновении
проблем с материалом вы все равно должны ими заняться. Необходима незамедлительная и четкая
коммуникация при возникновении проблемы, когда большие группы специалистов работают
вместе. В такой среде большой студии производственный процесс очень обширен, одновременно
выполняются множество задач. А это означает, что вы зависите от нескольких людей, и другие
люди зависят от вас.
Если вы занимаетесь всеми частями производства самостоятельно, процесс, вероятно, будет
более линейным, но вам все-таки придется разделить его на отдельные части. Вы можете сделать
это, храня отдельно файлы с разными производственными задачами, работая с каждым как
специальный отдел. Обнаружив проблему, вы можете сказать себе, что нужно изменить каркас и
прекратить текстурирование. Организация процесса по заданиям позволяет обновлять один
компонент, не нарушая другие. Это поможет вам потом, если вы будете работать в большой
студии или удаленно для компании только в рамках своей специализации.
В совершенном мире все программное обеспечение могло бы распространять обновления по
всей студии, чтобы каждый мог изменить файл на любом этапе производственного процесса. В
реальности такого нет даже в лучших 3Dпакетах, поэтому вы должны убедиться, что вы делаете
все возможное для того, чтобы предотвратить проблемы с материалом до того, как он глубоко
внедрится в процесс. Помните, что чем дольше материал находится в производстве, тем больше от
него зависит, и тем дороже обходятся неполадки.
Один из способов оградить производство от возможных проблем – это быть вовлеченным в
работу с материалом ещё на стадии создания концепта. Чем раньше вы изучите дизайн модели и,
если это возможно, исправите ошибки до того, как дизайнер закончит с ней работать, тем
свободнее вы будете работать с трехмерной версией. Дешевле и быстрее сделать исправления еще
на бумаге, чем ждать сборки.
Вовлечение Вас как технического директора по персонажам на ранней стадии производства не
всегда практично, но вы по крайней мере можете побеседовать с моделерами, сразу же, когда они
приступят к работе над каркасом. Такие вещи, как число граней или вершин в деформируемых
областях, или удаление детали, или открепление и прикрепление частей модели, – это ваша
возможность предотвратить изменение топологии модели тогда, когда она попадет к Вам. Это
лишь часть производственного процесса, в котором вы участвуете как технический директор по
персонажам. Другая основная задача – ведение персонажа на протяжении всего проекта.
Взглянув на несколько замечательных примеров высококачественного моделирования и
контроля замыкания граней от Рамахана Фолка, вы можете почерпать хорошие идеи о том как
должна выглядеть готовая к риггингу модель. Правильное расположение ребер каркаса модели
непосредственно влияет на то, как выглядит модель во время деформации. Ребра полигонов
должны обтекать природные линии мускулатуры персонажа и давать детализацию, достаточную
для полного спектра движений (как, скажем, в плечах). Если у вас слишком мало вершин, то
анимированная модель не будет держать объем; точно так же слишком большое количество
вершин будет замедлять привязку во время скиннинга и усложнять работу, вместе с общим
замедлением файла (рис.5.1 – 5.3).

@Рис. 5.1. Вот отличный пример хорошо структурированных граней и смешения анатомии
существа. Любезно предоставлено Рамаханом Фолком, fx3dartist@msn.com

@Рис. 5.2. Эта модель – замечательный пример, показывающий, какой детализации вы можете
добиться, сохранив легкость модели. Любезно предоставлено Рамаханом Фолком

@Рис. 5.3. Это изображение лица показывает иерархические поверхности в Maya с очень
хорошими гранями, повторяющими подлинную структуру мускулов лица. Ассиметричные
каркасы, подобно этому, более реалистичны, но сложнее поддаются риггингу. Любезно
предоставлено Рамаханом Фолком

Начальные вычисления: размер и масштаб


Когда модель попадает под ваше управление, вы должны помнить о двух вещах: размере и
масштабе. Опытные моделеры сделают большинство проверок за вас, особенно если Вы уже
работали с ними раньше, но так происходит не всегда. Иногда люди делают ошибки или что-то
пропускают, и вы должны поддержать их и исправить то, что они упустили.
Первое, что нужно проверить – правильность размера и масштаба модели. Нет ничего хуже,
чем сделать риггинг персонажа и обнаружить, что размер был не тот или что вы работали в
метрической системе, а надо было в дюймах. В большинстве 3D пакетов есть инструменты для
измерения объектов. Используйте эти инструменты, чтобы замерить Вашего персонажа (рис. 5.4).
У вас должна где-то быть документация, которая дает Вам знать, какие единицы измерения
используются в производстве, а также листок для персонажа с данными о его правильной высоте в
метрах или футах. Еще один способ проверить соответствие размера персонажа – сделать быстрый
общий набросок человека в масштабе данного проекта и добавить любые другие заметки о
размере персонажа и рекомендации, относящиеся к каждому персонажу. Это визуально покажет
вам, насколько большим должен быть персонаж, в дополнение к применению инструмента
Расстояние (Distance tool).
Потратьте время на двойную проверку, потому что если вы захотите экспортировать ваш
персонаж в другую программу с другими единицами измерения, в процессе экспорта масштаб
персонажа может измениться, что вызовет еще большие проблемы при выявлении общих
неисправностей производства. Довольно легко пропустить возникновение отрицательного
масштаба у модели, которая была отражена. Это может случиться даже с главным каркасом, в
зависимости от того, как вы прикрепляете два объекта друг к другу. Можно быстро проверить
файл со сложной геометрией, сделав быстрый экспорт в формате .FBX, и тогда будут показаны
объекты с отрицательным масштабом (рис. 5.5). Также вы можете импортировать файл обратно в
Maya или загрузить экспортированный файл в плеер QuickTime Movie с .FBX для QuickTime,
чтобы визуально проверить файл на неполадки, возникшие при экспорте.

Врезка. Плагин .FBX для Maya от Alias|Kaydara и QuickTime можно найти


среди других инструментов на http://www.alias.com

@Рис. 5.4. Чтобы проверить размер персонажа, пользуйтесь инструментом Расстояние в Maya
или Измерение (Measure tool) в Max

@Рис. 5.5. Ищите ошибки в размере с помощью экспортера .FBX

Когда вы проверили правильность размера модели, убедитесь, что все трансформации


заморожены, а точки опоры модели расположены так, как вам нужно. Перед тем как заморозить
трансформации, разорвите связи предков-потомков (unparent) всей геометрии, чтобы все узлы
находились на верхнем уровне. Потом вы заново установите связи, но сейчас это поможет вам
держать в порядке узлы, которые могут быть заморожены некорректно или просто занять лишнее
место.
Все это делается сначала, потому что делается это довольно быстро и к этому не придется
возвращаться потом. Если вы обнаружите проблемы или если потребуются дополнительные
изменения, то вы можете вернуть новый исправленный каркас обратно моделеру. Он получит
обновленный файл, так что если он передаст модель персонажа кому-то еще, то она будет
правильного размера и без ошибок в трансформации. После того, как рабочий размер персонажа
проверен и зафиксирован, проверить остальные аспекты модели, например, топологию и
пропорции каркаса, очень просто благодаря их наглядности.

Заданные позы и свободное положение


Может ли быть у персонажа более одной позы? Первоначальные позы персонажей – часть
построения файла модели. Эти положения или позы могут различаться в каждой модели, и на
самом деле это индивидуальный выбор технического директора по персонажам и моделера, каким
образом они бы хотели настроить позы персонажа для риггинга.
Когда вы настраиваете персонаж для анимации, вы должны знать требования к анимации
персонажа, включая диапазон движений и некоторые особые эпизоды, требующие
дополнительного сложного риггинга. Если эти детали вам известны, то вы можете построить или
изминить свободную позу модели для основного диапазона движений персонажа. Например, при
использовании игровых существ, которых нужно оптимизировать, первоначальное состояние
модели может быть построено в соответствии с позой, в которой персонаж будет находиться 90
процентов времени. Если вы подумаете о свободной позе своего тела и попытаетесь отчетливо
представить себе различие в сокращении мускулов и вовлечении определенных частей вашего
тела, вы начнете понимать, что такое свободная поза.
Поза да Винчи
Главный пример дискуссий, который Вы можете обнаружить на многих Web-форумах это –
правильное позиционирование плечей и рук и тут широко применяется термин «поза да Винчи»,
но большинство людей имеют в виду позу, в которой руки держатся прямо, а ноги широко
расставлены. Эта поза подходит для моделирования персонажа и для упрощения текстурирования,
но когда дело доходит до деформаций, лучше снять напряжение и давление с большинства частей
модели. Это значит, что вы должны поставить плечи в расслабленное положение, а руки должны
быть подняты по бокам под углом 45 градусов (рис. 5.6. и 5.7). Просто поднимите руки по бокам
так высоко, как только можете, но чтобы ключицы и плечи не поднимались. Затем, если нужно, вы
можете перевести руки в этом положении дальше вперед и отвести назад к бокам, руки при этом
слегка согнуты, чтобы трицепсы и бицепсы были расслаблены, и ни один из этих мускулов не был
напряжен больше, чем другой. По этому поводу на Web-форумах ведутся длинные дискуссии.
Одно из лучших обсуждений появилось на форуме скульптуры Spiraloid Digital под заголовком
«Да Винчи или не да Винчи?»
Врезка. Вот прямая ссылка на тему «Да Винчи или не да Винчи?» форума
Бэя Рэйта (Bay Raitt):
http://cube.phlatt.net/forums/spiraloid/viewtopic.php?TopicID=195

Ноги лучше работают, когда они расставлены на ширину плеч и прямо под телом персонажа, со
слегка согнутыми коленями, если нужно; с твердо стоящими на земле стопами, направленными
строго вперед. Ноги, по сравнению с областью плеч, имеют не такой широкий диапазон движений,
и к их положению можно быть менее требовательным. Скручивания и вращения ноги очень
ограничены, и в них, для дополнительных движений, вовлечены бедра и нижний отдел
позвоночника. И так как большую часть времени мы стоим на ногах, то сохранение стоячего
положения требует небольших усилий, и поэтому построить детальную модель несложно.
Небольшой сгиб ноги в колене сильно поможет деформации. Если нужно, вы можете сделать сгиб
сильнее, но не забудьте о движении надколенной чашечки.

@Рис. 5.6. Вот поднятая рука. Как видите, плечо напряжено, но движение ключицы не
учитывается при моделировании

@Рис. 5.7. По сравнению с рис. 5.6, эта рука более расслаблена; например, расслаблены
ключица и плечо

Сложные позы
В любом случае лучше всего создавать модель в наиболее быстрой для моделинга позе. Таким
образом моделер сможет перемещать модель в наиболее открытую для создания развертки и
текстуры позу. С таким исходным моделированием и технический директор, и моделер могут
вновь отрегулировать позу, учитывая будущий риггинг и скиннинг. Таким образом, в итоге
получим три положения: позу моделирования (model pose), позу для текстурирования (texture
pose) и для риггинга (rig pose). Это могут быть разные файлы или один - с тремя целями морфинга,
установленными, чтобы придать модели нужную позу.
Поза, удобная для скиннинга и деформации, не обязательно хороша в качестве начального
положения для риггинга; контроль анимации может выйти за пределы осей и заставить
аниматоров проделать дополнительную работу по управлению ключевыми кадрами. Учитывая
это, после скиннинга может потребоваться четвертое состояние для облегчения риггинга (рис.
5.8). Сочленения можно вращать назад, строже выравнивая по свободному пространству, а ноги
ставить ровнее вдоль линии тела. Раз установив положение, можно сделать весь риггинг. Также
эта поза подойдет, если вы собираетесь использовать данные motion capture в операции
переориентации в Maya с помощью редакторов Trax или Motionbuilder. Можно несколькими
способами добиться того, чтобы при изменении модели обновлялись все позы. Что касается
каркаса, то можно просто создать ряд целей морфинга в главном файле, который содержит все
позы. Затем Вы можете создать отдельные файлы каркаса в этих позах вручную или
автоматически. В условиях большой команды вы, скорее всего, захотите автоматизировать эту
систему создания поз для отдела моделирования.

@Рис. 5.8. Взгляните на разницу между позой для скиннинга и полностью выровненной позой
для риггинга

Поза для риггинга


Для управления скелетом и всей сборкой проще хранить разные позы отдельно и обращаться к
ним по мере необходимости. Допустим, что у вас есть модель в позе для скиннинга и что она
соединена со скелетом. В Maya есть опция первичной позы привязки (bind pose), чтобы вернуть
скелет в состояние скиннинга, но это не работает после завершения настройки персонажа. И так
как состояние скиннинга это не та же самая поза, которую вы хотите создать для управления
риггингом, то вы придадите скелету такое положение, которое удобнее для аниматора и для
риггинга. После создания управления сборкой вы захотите сохранить эту позу, но также и в случае
необходимости вернуться к позе первичной привязки.
Используя несколько различных методов, вы можете сохранить эти позы отдельно для риггинга
и для скелета. Один из способов – установить ключевой кадр для ваших управляющих точек и
сохранить эту анимацию с помощью плагина animImportExport. Используя узлы персонажей,
сохраняйте различные позы в Trax Editor или используйте один из бесплатных MEL-сценариев,
которые позволяют вам сохранять и применять позы к вашему персонажу. Также Вы можете
попробовать отключить ограничители и ИК контроллеры, чтобы скелет вернулся в позу
первичной привязки. Если это не действует, то в данном случае можно взять копию скелета
находящегося в нужной позе первичной привязки и привести регулировки риггинга в соответствие
с позой скелета, затем сохранить эту позу одним из описанных выше методов.
Другой способ решения проблемы разделения позы риггинга и позы первичной привязки –
сделать скелет первичной привязки (bind skeleton) и скелет риггинга (rig skeleton). Через
соединения и ограничители скелет первичной привязки управляется настраиваемым скелетом
риггинга, и в любой момент вы можете разъединить их, чтобы персонаж вернулся к позе
первичной привязки. Вы должны знать об этих опциях из инструментария технического
директора. Это дает основание тому, почему двухскелетная система может быть хорошим
подходом, что показано в главе 13.
Хитрость этих методов заключается в том, что файл позы и файл риггинга не разделены,
потому что без поз, вы можете не суметь вернуть персонаж к положениям, нужным для скиннинга
или экспорта в игры, где особенно важно убедиться в том, что поза, на которой основана вся
анимация, не потеряна. Если она потеряна, то всю анимацию нужно делать заново. По этой
причине вы, возможно, захотите запомнить несколько способов сохранять эти позы риггинга или
скелета в файле. Клипы Trax Editor’а отлично выполняют эту функцию, т.к. могут быть сохранены
с файлом или узлом персонажа или экспортированы во внешний файл. Это дает вам некоторую
избыточную информацию. Вы также можете сохранить позы в файл со script-узлом, управляющим
заданным атрибутом, чтобы загрузить позу и вернуть персонаж в нужное состояние, позу
скиннинга или риггинга.
Плохая геометрия и другие скрытые опасности
Теперь мы может взглянуть на визуальные проблемы и проверить модель на источники
неполадок, возникновение которых возможно после скиннинга и анимации. Вы можете
пользоваться следующим списком как отправной точкой для настройки модели:
 соответствует ли геометрия надлежащим типам: NURBS, полигоны или иерархические
поверхности?
 имеет ли поверхность достаточную детализацию в областях, которые будут подвергнуты
деформации?
 если модель создана для игры, произведена ли триангуляция поверхности?
 есть ли отдельные или несоединенные вершины, или имеют ли вершины данные xform?
 правильны ли нормали (имеется в виду, что они вывернуты наружу и не инвертированы)?
Заморозка трансформаций выявит плохие нормали, если вы не рассматриваете двусторонние
поверхности. По умолчанию в Maya включен атрибут “opposite”, чтобы поверхности
отображались корректно в окнах вьюпорта и при рендеринге, но нормали всё равно будут
инвертированы, а это нужно исправить. (Напомню, вот почему вы должны в первую очередь
решать проблемы с трансформацией.)
 Сделана ли уже развертка модели и правильно ли выставлены координаты UV-маппинга, или
перенесете ли Вы окончательные UV-координаты в файл риггинга позже? Хорошо бы
проследить, какие обновления нужно будет сделать позже. Это может быть сделано прямо в
файле, во внешней базе данных или в системе управления проектами. Если вы храните данные
об обновлениях в файле, добавьте запись в раздел заметок об объекте, или сделайте текстовый
узел “I” $$ Автор очевидно ставит букву I в качестве сокращения слова Information. – прим ред.
$$ (к примеру) для хранения всех заметок по сцене.
 также проверьте именование и группирование. Объекты должны быть названы осмысленно, а
не просто по геометрическим именам, как, например, sphere234 или cube01. И узел
трансформаций, и shape-узел должны быть названы надлежащим образом, исходя из стандартов
производства. Хороший пример – название частей модели с префиксом Character_GEO_имя
или MESH_Character_имя. Подойдет любое слово, которое даст вам понять, каков тип
конкретного объекта. Имя персонажа помогает выйти на другой уровень фильтрования
выделения в файле с большим числом персонажей.
После того как вы закончили работу с моделью и изменения, которые считали необходимыми,
сделаны, вам нужно будет создать чистый файл. Есть множество способов удалить историю и
привести в порядок файл в Maya, но Вы можете легко пропустить какой-нибудь дополнительный
узел или разбить соединение, о влиянии которого на модель вы не знали. Один из самых быстрых
путей создания чистого каркаса модели без истории – экспортировать его из Maya в файл .FBX
или .OBJ. Мы используем формат .FBX для экспорта во что-то вроде OBJ из-за его проверенной
совместимости. Файловый формат .FBX стал стандартом обмена данными в программном
обеспечении для 3D, включая моделинг, анимацию, скелеты, материалы и так далее. Поэтому
удобно сначала экспортировать в .FBX, не только чтобы создать чистый файл, но и чтобы
ухватить все то, что потом может экспортироваться с ошибками. И снова, лучше найти ошибку
сейчас, чем тогда, когда вы уже закончите работу с проектом и отправите его в другую студию,
или когда вы попытаетесь отправить персонаж в Motionbuilder $$ Продвинутый анимационный
пакет от компании Alias. Узнать подробнее вы сможете заглянув в Интернет по адресу:
http://www.autodesk.com/ - прим ред. $$, чтобы воспользоваться технологией motion capture.

Врезка. Этот процесс очистки точно так же работает в 3DSMax.


Плагин .FBX совмещается со всеми новыми версиями Max. В Max вам нужно
будет совершить все те же шаги. Приведите геометрию вашей модели к
окончательному виду используя каркасное или полигональное
моделирование, проименуйте объекты, убедитесь, что все трансформации
сброшены, и затем экспортируйте модель и импортируйте обратно в чистый
файл. Чтобы использовать в Max формат .obj, нужно скачать бесплатные
плагины с http://www.habware.at.

Экспортировав модель и импортировав её обратно в Maya, вы захотите перепроверить, что


масштаб модели всё тот же и что в результате импорта не появились дополнительные узлы.
Отображение узла в окне Hypergraph позволит вам увидеть все соединения и убедиться, что Вы
имеете чистую модель с узлом трансформаций и узлом формы, соединенным с материалами.
Перепроверка узлов позволит Вам удостовериться, что экспортер не переименовал их, и тогда вы
можете перейти к очистке иерархии файла.
Следующий важный шаг – группировка геометрии. В самом конце все модели, соединенные
вместе, должны быть подчинены узлу группы (group node). Это позволяет вам сохранять ясную
картину сцены в окнах редакторов Outliner, и Hypergraph. Потом вы можете разбить иерархию
на деформирующиеся и недеформирующиеся группы. Чем чище файл, тем быстрее вы и аниматор
сможете найти части, которые нужно подвергнуть скиннингу, риггингу или анимации.
Применение групп выделения (selection sets) – другой способ сохранять связь файлов геометрии,
не группируя их, если есть ограничение на использование групп из-за особенностей экспорта в
игру или других внутренних или внешних особенностей.

Врезка. Группировка в Max отличается от Maya. Если вам нужно, чтобы и


там, и там узлы сохраняли организацию, то, аналогично созданию группы
в Maya, в Max можно создать вспомогательную точку (point helper) и
сделать модель потомком точки, что будет эквивалентно операции
группировки в Maya. Команда группирования в Max создает дополнительный
узел, но по умолчанию не допускает выделения или редактирования
младшего, и добавляет работы по управлению без какой-либо реальной
выгоды над обычным подчинением.

Подготовка персонажа из книги к риггингу


В этом примере мы получили окончательную модель, но из-за ограничений по времени моделер
оставил ее незаконченной. Большая часть геометрии была отражена и приведена в качестве
иллюзорных дубликатов, так что нам придется приводить этого персонажа в порядок шаг за
шагом. На этом этапе модели базовая поза персонажа должна быть уже согласована и проверена
техническим директором по персонажам, требования анимации выполнены, или не выполнены,
точно так же как могут быть готовы или не готовы текстурирование и развертка.
1. Отобразите в файле все, что было скрыто. Как видите в нашем файле 133 объекта и
множество пустых узлов, история многих объектов. Геометрия проименована по
умолчанию (рис. 5.9).
2. Быстрый способ взяться за дело – экспортировать файл как .obj. Это обратит всю
иллюзорную геометрию в реальную, лишит объекты истории и быстро покажет вам,
нормали каких объектов должны быть переведены из отрицательного масштаба.
3. Теперь, после импортирования файла .obj, вы получили один объединенный
полигональный объект, множество групп всех других частей и черные из-за
неправильных нормалей поверхности, приведение которых в порядок – ваш следующий
шаг (рис. 5.10).

@Рис. 5.9. Исходный файл

@Рис. 5.10. Очищенный файл с неправильными нормалями.

4. Чтобы избавиться от групп, выделите их в Outliner и удалите.


5. Теперь вы можете исправить нормали. Экспортирование в формат .obj имеет побочный
эффект: после импорта Maya блокирует все нормали, изначально не допуская
воздействия на них, например, реверса.
6. С помощью инструмента Set Vertex Normal включите опцию Unlock Normals
(Разблокировать Нормали) и примените ее. Вы можете быть введены в заблуждение
тем, что поверхность теперь выглядит так, как будто все нормали верны. Но Вам все
еще нужно перевернуть их. Это происходит из-за того, что объект двусторонний, и если
эту опцию отключить, то вы увидите, что части каркаса все еще неверно инвертированы
(рис. 5.11 – 5.12). Теперь просто переверните нормали там, где это необходимо. В этой
сцене все еще есть объекты, вершины которых нужно соединить или объединить, а
затем скомпоновать в меньшие группы, чтобы привести сцену в порядок.

@Рис. 5.11. Разблокировка нормалей инструментом Set Vertex Normal

@Рис. 5.12. Отключение опции двухстороннего отображения модели

7. Мы начали разделять объекты на более удобные группы (рис. 5.13). В этом случае они
группируются и называются по имени персонажа, а тело персонажа отделяется от
доспехов и оружия. Есть много способов подготовить модель и сгруппировать объекты,
сохраняя сцену чистой, так что дело за вами.
Работая с игровыми моделями или моделями для кино, всегда проверяйте, чтобы cloth-объекты
$$ cloth-объект, это объект относящийся к встроенному в Maya модулю имитации поведения
тканей – прим ред. $$или объекты симуляции были разделены. Если cloth-объект вшит в главный
каркас, имитация может попытаться обработать всю модель, а не только одежду, в зависимости от
Вашего игрового движка. Удерживание cloth-объекта как отдельного объекта так же позволит Вам
оптимизировать cloth-объект и сделать ему привязку без воздействия на основной каркас. Игровые
экспортеры , в целом, должны позаботиться о комбинировании геометрии при экспорте, чтобы
файл оставался сгруппированным и в то же время доступным для художника. Если наложено
ограничение, например, необходимость присоединить или скомбинировать всю геометрию в один
объект для экспортера, то экспортер должен исправить ошибки, потому что это не должно быть
ограничением.
На рисунке (рис. 5.14) показан пример того, как разобраться с геометрией и скомпоновать
группы объектов, чтобы упростить их работу и уменьшить число узлов в процессе скиннинга и
риггинга.

@Рис. 5.13. Новая чистая группировка частей модели

@Рис. 5.14. Группировка ремня с его заклепками


Вот окончательная версия какаса со всеми разделенными для дальнейшей привязки объектами,
которые нужно настроить. Имеет смысл отделить детали оружия этого персонажа, и таким
образом сделать их свободными, чтобы подвергнуть анимации или имитации (рис. 5.15).

@Рис. 5.15. Группы законченной модели

Врезка. В общем, вы хотите взглянуть на модель и рассчитать, какие ее


части можно анимировать в добавление к основному телу. Эти объекты
должны быть подходяще названы и настроены. Еще одна группа объектов,
требующая особого подхода, – объекты, которые нуждаются во вторичной
или третичной анимации, например, одежда, болтающиеся ремешки, волосы
и так далее. Это аксессуары персонажа.

На этом этапе вы также сделаете окончательную проверку и очистку истории файла.


1. Спросите себя сперва, хорошо ли сделан UV-маппинг текстуры, или его нужно сделать
потом? Если верно последнее, то вам придется обновить проскиненную модель новыми
текстурами и материалами.
2. Перепроверьте x-формы объекта и снова их заморозьте.
3. Удалите всю историю модели. (Проследите, есть ли уже в файле цели морфинга,
потому что вы можете удалить их, сами того не заметив.)
4. Проверьте редакторы Multilister или HyperShade и, если нужно, разберитесь с
шейдерами. Имеется в виду, что они могут быть некорректно названы, или в Maya 6
можно создавать организационные корзины (organizational bins) прямо в окне редактора
Hypershade как дополнительный способ их группировки. Создайте одну такую корзину
специально для этого персонажа и убедитесь, что узлы названы так, чтобы обозначить
их принадлежность персонажу. Подойдут первые два инициала имени персонажа. В
нашем случае это PigGoblin, так что шейдеры будут называться pg_НазваниеШейдера и
размещаться внутри pg_Bin (рис. 5.16).

@Рис. 5.16. Новая корзина применяется для приведения в порядок базовых шейдеров
персонажа

5. Дополнительный организационный совет – применять новые возможности Maya 6 для


выделения узлов цветом в редакторе Hypergraph. Это упрощает систематизацию и
организацию файла на уровне узлов, при рассмотрении комплексного отображения
сцены. Цель – получить очищенный Outliner и очищенный Hypergraph. Вы можете
сделать это вместо использования слоев для объектов, если вы хотите ограничить число
слоев в файле. Вы можете свободно брать такие цвета, какие захотите, хотя мы обычно
придерживаемся голубого цвета для самой модели и гораздо больше используем эту
возможность позднее, при управлении объектами (рис. 5.17).

@Рис. 5.17. Цветные узлы помогают разобраться со сложным устройством в HyperGraph

Врезка. Из файла справки Alias…


«В редакторе Attribute Editor этого узла перейдите в раздел Drawing
Overrides (настройки отображения). (Вам придется раскрыть вкладку
Object Display, чтобы увидеть этот раздел.) Включите Enable Overrides
и установите цвет с помощью цветового ползунка. Опция Node Display
Override Color (Заменить Цвет Отображения Узла) в окне Hypergraph
должна быть включена, чтобы отобразить изменения цвета. Изменение
цвета слоя заменяет настройки отображения этого узла.»
Так как мы хотим применить этот цвет для множества объектов сразу,
воспользуемся небольшим скриптом:
proc drawColor (int $colorID){
string $sel[] = `ls –sl`;
for ($obj in $sel) {
setAttr ($obj + “.overrideEnabled”) 1;
setAttr ($obj + “.overrideColor”) $colorID;
}
}

6. Переупорядочите Outliner так, чтобы порядок объектов в окне Outliner’a был таким
же, в каком появляются объекты на персонаже сверху вниз или просто в логическом
порядке сортировки.
7. Также добавьте в файл Установку Быстрого Выделения (Quick Selection Set). В том
случае, если Вам понадобится слить файл с другими, установка выделения останется в
файле, независимо от слоев.
8. Наконец, последняя проверка качества модели выполняется с помощью некоторых
инструментов настройки поверхности, которые не допустят возможность риггинга в
файле с какими-либо дефектами в геометрии. Примените инструмент Очистка
Полигона (Poligon Cleanup), установите его на Выделенную Геометрию,
предварительно включив в настройках инструмента Ребра с нулевой длиной (Edges with
zero length), Грани с нулевой областью геометрии (Faces with zero geometry area),
Тонкие Грани (Lamina Faces). Если после запуска этого инструмента вы нашли что-то,
что моделер пропустил, то по возможности отправьте модель обратно художнику,
написав для него список исправлений, или, если это входит в ваши обязанности,
исправьте недочёты самостоятельно (рис. 5.18).

@Рис. 5.18. Окончательная модель персонажа после всех проверок и очисток

Независимо от того, в какой программе вы работаете и насколько крупен проект, на


протяжении всего проекта вы будете извлекать выгоду, если начнете риггинг персонажей с
подготовленного основания. Коммуникация и документация – ключевые элементы проверки того,
что вы работаете с корректным файлом и в соответствии со стандартами производства.
Подготовленный фундамент также поможет другим отделам вносить дополнения в ваши файлы, а
вам это нужно, и вы сможете делать то же самое для них. Споры о наилучшей для скиннинга и
риггинга позе персонажа будут продолжаться, но важно не ограничивать себя всего лишь одной
позой и не думать, что какая-то поза лучше, чем другая. Модель должна принимать те позы,
которые лучше всего подходят для вас и для производственного процесса.

Глава 6
Применение исследования: заложение основ
вашего риггинга
Настраиваете ли вы рисованный персонаж или фотографически достоверный, человек это или
некое существо, – в проекте должно быть предусмотрено время на исследование и разработку .
Уровень ИР $$ Под ИР подразумевается «Исследования и Разработки» - прим ред. $$ проекта
зависит от сложности персонажа и производственных требований. Если уровень Вашего
персонажа достигает уровня Голума во «Властелине колец», то пре-производство и ИР могут
занять много месяцев или даже лет. Над созданием сборки могут работать несколько людей, в то
время как другие пишут специальные плагины для кожи и мышц. Другим же приходится думать
над созданием правдоподобной лицевой анимации. С другой стороны, если анимация
предназначена для игры или телевизионного проекта, то ИР могут заниматься всего 1 или 2
человека. Если повезет, то на нахождение лучших методов настройки персонажей и создание или
нахождение скриптов или инструментов, которые могут помочь в работе, у этой небольшой
команды может уйти всего несколько дней или недель. Более профессиональный риггинг требует
двух видов исследования: художественного и технического. Художественное исследование
включает в себя анатомию и размещение сочленений, движение сочленений, биомеханику.
Техническое исследование сосредоточено на анализе того, что необходимо для создания
персонажа, исходя из художественных требований проекта и аниматоров, и на нахождении других
областей, где требуются специальные инструменты и дополнительные плагины.
Художественное исследование: поиск анатомических
данных для реалистичных персонажей
В искусстве, если вы хотите добиться от людей реакции или отклика, значение имеет лишь
окончательное изображение, а не метод его создания. Также и с компьютерными трехмерными
персонажами и их анатомией. Метод важен в риггинге персонажей настолько, что хороший метод
гарантирует, что вы уложитесь в сроки и аниматоры не будут рвать на себе волосы. Но в конечном
счете, для зрителей больше всего важна правдоподобность персонажа. Если персонаж выглядит и
ведет себя так, как надо, то все в порядке.
Поскольку вы нацелены на правдоподобность деформации в движении, вам нужно совместить
знание анатомии и физиологии с нахождением методом проб и ошибок наилучшего положения
сочленений во время риггинга. Помните, что суставы и мышцы в каркасе могут не быть
абсолютно правильными с точки зрения анатомии. Но тем не менее они должны чувствовать,
двигаться, деформироваться и, наконец, выглядеть так, как будто они анатомически точны, чтобы
зрители поверили в образ. Люди подсознательно оценивают, что как должно двигаться.
Человеческий глаз обладает удивительной способностью схватывать самые незначительные
моменты и воспринимать движение как неверное. Как только они замечают что-то подобное, они
перестают верить, а это последнее чего хотят производители.
Важно найти как можно больше информации о внешности и скелете персонажа, которого вы
настраиваете, потому что это поможет создать компьютерный скелет, движения которого будут
казаться зрителям естественными. Полезно изучать справочные материалы в виде статических
изображений; хорошие изображения скелета, мышц, кожи послужат отличным фундаментом. Но
рисовать лучше, глядя на живой объект, а не на фотографию, поэтому обращение к реальным
прототипам может помочь понять строение тела как объемной массы, а изображение на это не
способно. Наблюдение за тем, как все слои работают вместе, понимание механики тела при
напряжении и расслаблении, толчке или тяге и так далее усовершенствуют умение технического
директора по персонажам создавать риги правдоподобных персонажей. Способность видеть
спектр движений и оценивать влияние мышц на поверхность кожи позволяют создавать
персонажные сборки, легко поддающиеся анимации и деформации. Далее в этой главе мы
рассмотрим применение этого справочного материала и покажем, как он применяется
непосредственно к персонажу.

Врезка. Поиск Google в картинках – удивительный ресурс, дополнение к


серьезным библиотекам книг по анатомии.
Поиск по текстам книг на Amazon.com позволяет, если это разрешено
издателем, взглянуть на все страницы книги, как в книжном магазине. Но
на Amazon книг больше, поэтому это изумительный ресурс как для
художников, так и для программистов.
Новейший и крупнейший ресурс изображений и информации с
перекрестными ссылками – http://www.bbcmotiongallery.com/, где
находятся «500 миллионов футов пленки и 400000 часов видео»,
оцифрованные BBC. В не имеющем аналогов архиве BBC содержится более
восьми миллионов тематических категорий, и он растет с каждой минутой.

Собрав все данные, вы можете пользоваться своей любимой программой для рисования или
загрузить их в программу для 3D и соответственно нарисовать некоторые сочленения прямо по
изображениию. Схематически изобразите принципы движения и обратите внимание на сложные
места; ищите возможность уменьшить количество сочленений, сохранив желаемую деформацию.
Также отметьте на своем наброске те области, где нужно больше сочленений или деформеров,
чтобы персонаж хорошо двигался, поддерживая объем кожи.
Также взгляните на контактные точки опоры на используемых вами справочных изображениях;
ноги – очевидный пример, потому что они касаются земли, и нужно найти способ вращать их
вокруг этой точки соприкосновения. Отметьте или быстро зарисуйте, где в этих местах нужны
сочленения, и помните, что они могут быть иными, чем сочленения для скиннинга. Сделайте о
справочных изображениях небольшие заметки, какие сможете, например, где на коже складки,
вращается ли часть тела или перемещаться.
Использование справочных материалов для создания существ и
стилизованных персонажей
Но как Вы будете исследовать нечто со странными пропорциями и формой, деформируемой
невообразимым образом на любом этапе анимации? Стилизованных и мультяшных персонажей
тоже нужно исследовать. К счастью, большинство персонажей мультфильмов, например, утки,
кролики, собаки, заимствованы из реальной жизни. К персонажу мультфильма вы можете
применить все те же справочные материалы и советы, что и к реалистичному персонажу. Разница
заключается в том, что у мультяшного персонажа так много различных стилизованных форм, что
размещение сочленений становится нелегким делом, если под рукой у вас только книги по
анатомии. Но анатомическая информация дает твердое основание для построения скелета, которое
вы затем можете усложнять, приспосабливая к персонажу. А иногда можно просто разместить
сочленения так, как это удобно для принятия требуемых в производстве поз.
Еще одним источником информации могут служить другие мультипликационные персонажи,
похожие на тех, которых вы пытаетесь подвергнуть риггингу. Если вам нужно сделать
трехмерную версию анимированного двумерного персонажа, то наблюдение за ним в движении
подскажет вам, как нужно разместить его сочленения и деформаторы, чтобы он работал в 3D. Это
нельзя сделать быстро, разве что, может быть, наскоро расставить сочленения и проверить все как
можно быстрее. Помните, что большая часть того, что составляет двумерный анимационный
персонаж, становится тем, что мы видим, благодаря способности аниматора управлять
внутренними линиями и силуэтом персонажа. Они также управляют объемом и силуэтом во время
движения персонажа.
Риггинг карикатурных персонажей тяготеет к наслоению деформаторов и организации
управления ими, чтобы дать аниматорам возможность взять персонаж вне правильной модели и
придать ему форму, которая не годится в качестве статической, но нужна аниматору, чтобы
добиться нужного ощущения от движения. Такие примеры можно увидеть в недавних фильмах
«Суперсемейка» («The Incredibles»), «Мадагаскар» («Madagascar») и «Цыпленок Цыпа» («Chicken
Little»). В каждом фильме есть такие сборки персонажей, которые позволяют аниматорам
искажать, растягивать, скручивать и деформировать персонаж вне правильной модели по своему
усмотрению, чтобы добиться нужного эффекта анимации, для комического эффекта или просто
из-за того, что они могут растягиваться исключительно сильно. Последние работы Джейсона
Осипы показывают удивительное управление деформацией персонажей с помощью базовых
инструментов Maya. Вы можете найти эти замечательные примеры на
www.jasonosipa.com/Downloads/Movies/. Поищите примеры изображающие сжатие. Также у него
есть отличная тема на форуме http://10secondclub.net/forum/index.php?showtopic=69&st=0. В ней
рассказывается о его техниках, и это очень вдохновляющая информация.
До сих пор мы говорили о поиске справочной информации о естественных, или живых,
персонажах и о необходимости правильного размещения сочленений для деформации. Мы не
обсудили тему настройки механики и незначительных различий, с которыми вы можете
столкнуться, планируя механического персонажа или персонажа-робота. Все это относится к
механическим сочленениям так же как к естественным. Однако у механических объектов есть
выстроенные системы, которые должны работать вместе, и мне кажется, что они существуют не
зря. Шестеренки, поршни, кабели должны нормально работать и управлять объектом, и их
расположение в роботе или транспортном средстве должно быть подчинено какой-то цели.
Разработка хорошо анимируемых механических систем – дело технического директора по
персонажам, но в то же время не давайте аниматорам вращать все механические части объектов и
вручную устанавливать для них ключевые кадры. Возьмите, например, костюм-робот для
переноски тяжелых предметов, как во многих научно-фантастических фильмах. Если вам нужно
настроить такое тяжелое оборудование, то вы можете воспользоваться данными о реально
существующем оборудовании, чтобы настроить вращение частей вашей модели, а также
плотность их прикрепления, их взаимодействие как часть целого. А строительное оборудование
можно найти довольно легко. В большом городе вы можете наблюдать за кранами или вилочными
погрузчиками. Даже за городом трактор послужит хорошим примером. Подойдет любая техника,
достаточно крупная для демонстрации работы и взаимодействия тяжелых движущихся частей.

Исследование движения и расположения суставов


Одна из самых распространенных ошибок в начале построения скелета – неправильная
расстановка сочленений. Это может происходить из-за недостатка времени, знаний или из-за
стремления поскорее приступить к риггингу. Часто люди просто «раскидывают» кости, особо над
этим не задумываясь. Но в среде производства неправильная расстановка сочленений может быть
очень опасна, потому что ее легко не заметить до стадии анимации, а если ошибку обнаружили
слишком поздно, то исправить ее становится очень сложно. Почти невозможно исправить скелет
уже настроенного персонажа, не нарушив анимацию или скиннинг.

Врезка. Когда вы расставляете сочленения, не забывайте о том, как


прошедшие скиннинг вершины будут вращаться вокруг них. Помня об этом,
вы можете с помощью одной хитрости сделать видимым вращение вершины:
применить манипулятор вращения с выделенным суставом. Манипуляторы
вращения показывают видимые окружности вокруг сочленения, так же
позволяя зуммировать изображение, чтобы увидеть ребро модели или
вершины, которые вы хотите отобразить на данной траектории.
Если вам необходимо более удобное отображение дуг костей, то можете
использовать сферу или круг для быстрого отображения траекторий
вершины. Так же мы применяем их для измерения таких вещей, как дуга
суставов руки, чтобы увидеть, правильной ли они длины в обычном
положении.

Изучение материалов и понимание анатомии станет для вас хорошим основанием, перед тем
как Вы начнете расставлять сочленения вашего персонажа. Кроме того, можно много узнать о
размещении и движении сочленений, присмотревшись к собственному телу и сделав несколько
тестов на область движения (range-of-motion - ROM). Разыгрывание движений может быть так же
полезно для технического директора, как разыгрывание сцены – для аниматора. Мы выстроим
внутреннюю картину того, что мы знаем о теле и положении костей, но нужно постоянно
совершенствовать этот образ, изучая справочные материалы и переоценивая движения
собственного тела. Изучение этих движений поможет построить скелет персонажа, вычислить
порядок вращения, оценить влияние движения на кожу и мышцы. Так что после изучения точной
анатомии выбирайтесь из кресла и понаблюдайте, как на самом деле работают некоторые из
следующих частей тела.
Ступня и лодыжка
Давайте начнем анализ движений с ноги. Например, понаблюдайте за тем, как ваша ступня
перекатывается по земле. Сейчас обратный риггинг стопы так же стандартен как и ИК-цепочки, но
если уж люди привыкли делать что-то, то навряд ли они примут новые наблюдения или
усовершенствования. Подумайте о движении стопы внутри ботинка: например, стопа вашего
персонажа будет двигаться по-разному в зависимости от типа обуви, которую он надевает, и
совсем по-другому, если он босой. Кости босой стопы будут разворачиваться и перекатываться в
передней части стопы или подъеме свода стопы, в зависимости от персонажа.
Стопа внутри ботинка будет взаимодействовать с землей по-другому: она находится на другой
высоте и в зависимости от того, насколько ботинок узкий, будет скользить в задней части ботинка,
слегка поднимаясь при ходьбе или беге. Положение точек опоры и расстояние до сгиба в ботинке
не такие, как у босой ноги, и когда вы расставляете сочленения, то должны учитывать это, так же
как и высоту лодыжки. Совсем недавний пример сложной настройки стопы/ноги/обуви –
персонаж Кот в сапогах из «Шрека 2» («Shrek 2»). Когда его лапы в сапогах, они больше похожи
на человеческие ноги, но он может вынуть лапу из сапога, и тогда она и пальцы на ней более
точно соответствуют кошачьей анатомии, с отдельными пальцами и лапами как у животного.
Такое сложное наслоение точек опор между ботинками с двумя типами управления и структур –
идеальный пример схватывания идеи риггинга вне базовой обратной сборки стопы. Это во многом
похоже на сборку в ИК/ПК, но нужно учитывать гораздо больше деталей.
Глядя на учебные изображения стопы, спросите себя, есть ли у персонажа плоскостопие? Если
да, то разворот стопы еще сильнее и приводит к тому, что внутренняя сторона лодыжки смещается
к внутренней стороне стопы. Это движение происходит и в обуви. Чем старее ботинок, тем
меньше он поддерживает свод, и тем больше смещается лодыжка, растягивая ботинок. Если у ноги
высокий подъем, то все наоборот. В движении стопа будет перекатываться по носку и боковому
краю, и это повлияет на то, как движение выглядит со стороны. При поднятой ноге, стопа
выглядит совсем как плоская. Все это может казаться излишним, но если вы когда-нибудь
обращали внимание на характер износа своих или чьих-нибудь еще ботинок, то видели, как тело
распределяет массу и энергию и какие части стопы больше всего соприкасаются с землей. Ваш
текстурщик может сыграть на этом: модели можно приспособить, аниматоры могут наладить
анимацию, чтобы подчеркнуть эту черту персонажа, но это должно быть запланировано с самого
начала и на всех этапах, от дизайна персонажа до окончательной анимации. Это такие детали,
которые позволяют вам создавать более правдоподобных персонажей.
Суставы стопы относительно сочленения сборки
В стопе 31 сустав, или 31 точка опоры. Непрактично анимировать все сочленения, которые нужны
для разнообразных движений стопы. В базовой сборке стопы есть сочленения лодыжки, средней
части стопы и пальца. Обычно этого набора достаточно для большинства персонажей, но он может
и должен быть дополнен для более сложных взаимодействий стопы.
Обычно при выборе наилучшего места для основных суставов стопы лучше поместить их внизу
каркаса стопы и ниже центра. Самого эффективного положения лодыжки можно достичь, пойдя на
компромисс между внутренним и внешним положениями сочленения и слегка сдвинув его вперед
от реального положения. Это поможет справиться со складками кожи спереди и сзади пятки.
Взгляните на палец: он размещен вдоль поверхности земли, вокруг центра и перед подъемом свода
стопы. Это дает немного нереалистичный изгиб стопы, так как суставы настоящей стопы на самом
деле проходят высоко через стопу, но это облегчает контакт с поверхностью, и, если правильно
распределить, вес, позволяет ноге хорошо опускаться в подъеме (рис. 6.1). Другое положение
главного сочленения пальца – чуть-чуть выше и ближе к центру подъема/месту прикрепления
большого пальца.
Помните о том, что вы все еще можете создать второй слой сочленений стопы, который будет
лучше копировать размещение настоящих суставов и управляться базовыми сочленениями сборки
ноги. Такая система дает точки контакта с поверхностью земли, необходимые для сборки. Вы
можете наслоить дополнительные сочленения кожи для управления отдельными пальцами. Нужно
внимательно следить за новыми сочленениями кожи: правильно ли они вращаются во время
движения стопы, чтобы пальцы не скользили. Однако при необходимости вы можете с помощью
управляемых ключей заставить новые сочленения реагировать и сдвигаться, (рис. 6.2). Ступни
Халка в «Халке» и Голума во «Властелине колец» - отличные примеры необутых, четко
двигающихся стоп.
Даже если мы показываем дополнительный слой или сочленение пальца, помните, что мы все-
таки говорим о расположении сочленений базового скелета. Пальцы можно действительно
включить во второй слой сочленений. К примеру, если вы хотите применить motion capture, то
проще управлять стандартной сборкой ноги из двух сочленений, который, в свою очередь,
управляет более сложным набором сочленений стопы, чем пытаться напрямую вместить в простой
mocap-скелет множество сочленений.

@Рис. 6.1. Начальное положение суставов ноги

@Рис. 6.2. Эти суставы настроены так, чтобы пальцы могли вращаться правильно, без
настройки управляемый ключей для сочленений пальцев

Врезка. Вот быстрый совет насчет деформации. В пятке, задней части


лодыжки и в икре размещены несколько дополнительных сочленений (рис.
6.3. – 6.5). Это те зоны, где во время мягкой привязки необходимо
дополнительное управление, где кожа создается очень быстро и при этом
выглядит хорошо. Сочленение влияет на кожу, исходя их своего положения
в иерархии. Так что не забывайте, о дочерних связях сочленений,
связанных с кожей, чтобы лучше сделать первый скиннинг. Иначе
сочленение для скиннинга в нужной области, но не на том же уровне в
иерархии, как другое, вызовет авто-скиннинг, полагаясь на настройки
инструмента. Вы можете менять опции сглаживания кожи для привязки там,
где сочленение прилегает к вершинам. Пальцы рук, ноги, пальцы ног,
например, плохо проходят скиннинг с этой опцией, но другие зоны модели
гораздо лучше. Работают оба способа, и вы должны постараться увидеть,
что больше приближает вас к желаемому результату. Эти дополнительные
сочленения потом могут быть использованы для псевдо-мышц и имитации
тряски кожи.

@Рис. 6.3. Дополнительное сглаживание сочленения кожи на месте

@Рис. 6.4. Сравнение компьютерных суставов с настоящим скелетом в движении

@Рис. 6.5. Продолжение сравнения скелета и компьютерных суставов. Обратите внимание, что
сочленение расположено между настоящими костями и слегка спереди, чтобы поддерживать
ощущение коленной чашечки под кожей.

Запястье и локоть
Все мы видели неправильные запястья у 3D персонажей, где кожа сдавливается или скручивается
на 180º, и вершины сходятся в одной точке (pinch into a point). Такжы вы могли заметить, что
движения запястья многих персонажей, выполненные с помощью технологии motion capture,
утрированы или преувеличены, и поэтому хорошее движение выглядит очень кукольным и
неестественным. Настоящее запястье не теряет объем при деформации и действительно
растягивается при сгибе вверх или вниз и растяжении сухожилий. Основное движения запястья
легко увидеть, согнув его вверх, вниз, из стороны в сторону или покрутив им, но во время
риггинга некоторые вещи могут сбивать с толку. Во-первых, скручивание запястья происходит
совсем не в запястье. Оно идет вдоль локтевого сустава. Когда вы хватаете что-то и пытаетесь
вращать рукой, то это выглядит так, как будто скручивание происходит в запястье, но на самом
деле все кости руки приходят в движение, и создается впечатление, что запястье скручивается
отдельно от руки (рис. 6.6).

@Рис. 6.6. Сгиб и растяжение запястья. Пожалуйста, посмотрите видеопример


WristHandFingers.MPG с Web-сайта книги. Он показывает руку и запястье в движении.

Для сравнения локализованного скручивания предплечья с общим скручиванием (включая


плечо) всей руки, нужно, во-первых, выпрямить руку, а затем вращать кистью так, как только
возможно, переходя от положения ладонью вниз к положению ладонью вверх. Обратите
внимание, что плечо при этом активно и производит большую часть скручивающего движения, в
добавление к скручивающей способности предплечья. Теперь согните руку и точно также
повращайте ей. Теперь вы локализовали скручивание в костях предплечья, но обратите внимание,
что бицепсы и трицепсы при этом активны. В большинстве сборок для скиннинга не учитывается,
что при скручивании запястья мышцы, производящие скручивание, находятся над сочленениями, а
не под ними, и поэтому бицепс и трицепс выглядят активными, когда совершается вращение
запястья и предплечья. Взгляните на любую персонажную сборку, и вы обнаружите одни и те же
общие настройки: управление плечом, кистью и отдельное управление рукой с помощью ИК для
ее размещения, а также управление локтем с помощью векторного ограничителя (pole vector
constraint). Возьмите для примера любой из этих контроллеров. Скорее всего, они влияют только
на часть руки, а не на всю связанную систему. Для анимации это подходит, но при деформации
нужно, чтобы кожа вела себя так, как будто она двигается целиком вокруг конкретных суставов.
Размещая сочленение запястья, как правило, Вы размещаете его в центре каркаса модели, но
если расположить его немного выше, то впечатление наличия костей под кожей усиливается.
Сочленение запястья можно поместить на линии локтевой кости или слегка позади ее конца,
чтобы вершины при деформации формировали арку, а не просто вращались сами по себе. Если вы
можете увеличить количество сочленений, то добавьте еще одно между сочленениями конца руки
и кисти. Это позволит сделать хорошую естественную деформацию этой зоны, имитирующую
множество костей этой части руки.
Продолжая рассматривать предплечье и расположение его сочленений, мы обнаружим
несколько моментов, с которыми непросто работать, создавая риггинг реалистичной руки. Во-
первых, взглянув на свою собственную руку или обратившись к справочнику по анатомии, вы
заметите, что рука от плеча до запястья идет не по прямой линии. В локтевой области лучевая и
локтевая кости выходят за плоскость плеча и локтя; когда вы переносите запястье ближе к плечу,
лучевая и локтевая кости выравниваются с этой плоскостью. Приходится немного менять
анатомию этой области, так как такие элементы ИК цепочки, как сочленения, должны находиться
в одной плоскости. Если вы просто нарисуете сочленения руки так, как они, по вашему мнению,
должны располагаться в каркасе, то может оказаться, что они не выровнены как следует. Если вы
сначала нарисуете их на прямой линии, затем повернете и переместите только по оси X на нужное
расстояние, то вы сможете разместить локоть и запястье в каркасе так как нужно, при этом
позволяя ИК-решателю работать должным образом.
Локтевой сустав обычно располагают близко к середине руки, или немного ближе к плечу, если
смотреть на фронтальный вид, что соответствует Вашему представлению о положении реального
локтя, в то время как на боковом виде локоть сдвинут немного назад. Это помогает создать
впечатление наличия костей под кожей во время её деформации.
На размещение сочленений в руке и плече во многом влияет способ моделирования руки и ее
поза. Помните, что ваша задача – сделать так, чтобы персонаж правильно выглядел во время
анимации и деформации, так что если вам нужно приспособить модель для своей работы, лучше
попросите об этом. Поговорите с моделером и поработайте над такими изменениями модели,
которые наилучшим образом подойдут для вашей расстановки сочленений и скиннинга, в то же
время пытаясь придерживаться правдоподобности дизайна модели персонажа.
Врезка. Мы считаем, что ваша задача будет во многом облегчена, если вы
сможете разместить сочленения в «черновой» модели или выстроить их по
отдельности, чтобы Вы могли быстро передать скелет моделеру. Это
поможет улучшить контакт технического директора по персонажам и
моделера, если они оба используют исправления друг друга. Так же и
проблемы в дизайне могут быть обнаружены на раннем этапе.
Посоветуйте моделеру создать шаблонный файл с отдельными частями
модели, из которых он начнет построение персонажа. Сохраните его в
директории модели.
Затем технический директор по персонажам может обратиться (xRef в
3dsMax) к нему в 3D пакете и создать шаблонный файл сочленений,
сохранив его в директории риггинга. На этом этапе моделер может
использовать ваш шаблонный файл сочленений в своей модели, чтобы
проверить размещение сочленений, сверяя с каркасом, и во время
окончательного моделирования использовать сочленения как ориентир.
Если случается так, что что-то размещено неправильно, то теперь уже
двое могут рассмотреть расположение сочленений, что способствует
разрешению возможных проблем. Так же моделер может еще и сделать
быстрый скиннинг сочленений, с целью проверки работы модели с костями
или в целях моделирования для поддержки деформации модели.

Голова и шея
Расстановка сочленений головы и шеи может быть очень скоротечной, и тут проблем может
возникнуть больше, чем принято думать. Основная проблема с сочленениями головы и шеи
заключается в том, что они чаще располагаются в центре каркаса, и их положение не
соответствует началу вращения настоящих сочленений. Другая распространенная проблема
возникает, когда базовое сочленение шеи расположено в модели слишком высоко или слишком
низко по вертикали. Также сочленение головы часто располагают в основании скулы персонажа,
там, где она соединяется с шеей. Или и того хуже, оно расположено между головой и телом, очень
усложняя деформацию и осуществление движения (рис. 6.7).

Врезка. Для тех, кто работает в Max и Character Studio $$Популярный


анимационный плагин для программы 3DS max – прим ред. $$, эта проблема
с размещением сочленений головы и шеи еще более очевидна из-за
установленного по умолчанию способа создания человеческих скелетов.
Посмотрите на красные точки (рис. 6.8) как примеры того, что
центральные точки сочленений человеческого скелета, не соответствуют
тому положению, в котором они должны находиться.
@Рис. 6.7. Плохая постановка шеи показывает и отцентрованный скелет, и сочленение головы,
расположенное посередине шеи, а не в точке опоры черепа

@Рис. 6.8. Постановка человеческого скелета по умолчанию порождает проблемы, исчезающие


после настройки.

Так как мы обращаем внимание на голову и лицо персонажа больше, чем на любую другую
часть тела, то нужно удостовериться, что расстановка сочленений позволяет голове персонажа
поворачиваться и двигаться естественно. Даже если место сочленения выбрано неправильно,
движение головы может в начале выглядеть нормально, в зависимости от наложенных на кость
движений.
Чтобы понять, как голова закрепляется на оси, можете попробовать этот пример. Удерживая
шею в одном положении, наклоняйте голову вверх и вниз. Вы почувствуете, где череп
соединяется с верхней частью шеи и поворачивается. Приложив пальцы к основанию шеи,
повторите это. Вы должны почувствовать вращение черепа, и в то же время усилие мускулов,
наклоняющих голову: напряженных, поверхностных и вертикально направленных. Теперь если вы
возьмете и повернете кость головы вашего персонажа, и она будет вращаться от середины шеи, то
значит, вы разместили сочленение неправильно. В сущности, если вы вращаете сочленение
головы, оно должно поворачиваться почти на месте, не двигаясь назад и вперед (рис. 6.9).

@Рис. 6.9. Правильное положение точки поворота головы в основании черепа

То же действия можно проделать с шеей, чтобы вы почувствовали, как сочленения влияют на


каждый наклон, поворот, скручивание. Попробуйте держать голову в покое вместе с шеей и затем
просто позвольте «выпасть» им вперед . Вы почувствуете растяжение в спине и лопатках. Ощупав
шею сзади, вы наткнетесь на выпуклость. Это позвонок, седьмой шейный позвонок. Это то место,
с которого шея начинает свое вращение (рис. 6.10).

Врезка. Рисуя сочленения шеи, вы можете нарушать порядок расстановки,


начиная с головы. Сочленения можно выкладывать в каком угодно порядке.
Мы обычно рисуем все сочленения от родительского сочленения до головы
за один проход, но мы нарушаем их порядок, чтобы убедиться, что в
первую очередь установили важные точки опоры, такие, как основание шеи
и основание черепа (рис. 6.11). Если с ними все в порядке, тогда мы
добавляем дополнительные сочленения или подгоняем другие уже
существующие сочленения шеи (рис. 6.12).

Чтобы обеспечить правильное расположение сочленений, можно поместить одно из


сочленений в основании шеи совсем неглубоко под поверхностью кожи, но все же следуя
анатомической информации. Собственно говоря, его можно разместить там, где вы почувствовали
седьмой шейный позвонок. В случае с более фантазийными персонажами или странными
существами вы все-таки должны относиться к этому внимательно и проверять, что голова и шея
трансформируются естественно. Но расположение в этом случае менее критично, если
деформация проходит хорошо и не вызывает проблем с анимацией.

@Рис. 6.10. Движение головы и шеи

@Рис. 6.11. Начальное положение основных сочленений головы и шеи

@Рис. 6.12. Шейная кость разделяется на части, и центральное сочленение шеи приводится в
правильное положение

@Рис. 6.13. Расстановка стилизованных сочленений нарушает наши правила надлежащей


расстановки. (Модель и сборка любезно предоставлены Стефом Гринбергом.)
В данном случае (рис. 6.13) расположение сочленений не соответствует человеческой
анатомии, но стиль модели преувеличенный, поэтому конструкция скелета приспособлена под
ограничения и требования как персонажа, так и анимации. Так вышло, что сочленение в
основании головы давало лучшую деформацию всей области головы и шеи.
Талия и нижняя часть спины
Бедра, таз, талия, родительское сочленение и центр тяжести – все это названия центра вашего
персонажа. Это силовой источник движения, реакций и первоначальных изменений всего тела, он
же получает их обратно от ног и позвоночника. Он перемещает, вращает, изгибает, переносит вес
с одной ноги на другую, определяет позы и позволяет нам шагать. Это якорь для многих
переплетающихся мышц, которые постоянно взаимодействуют с большой силой. Тазовый
треугольник – еще одна область, которую часто строят неправильно, что является причиной
плохой деформации и неестественных движений.
Существуют некоторые хитрости в установлении точек вращения этой части тела, потому что
качество движения таза и деформации определяется комбинацией трех сочленений. То место, где
вы размещаете верхние сочленения ног и сочленение основания позвоночника, делает таз вашего
персонажа независимым от настоящего родительского сочленения персонажа (рис. 6.14).
Иногда люди пытаются поместить основание позвоночника там же, где находятся вершины
ног, и таким образом сочленения позвоночника и ног оказываются в одном ряду. Сделать так –
значит расставить сочленения позвоночника и ног неправильно. Возможно, люди поступают так,
ради возможности зафиксировать ноги, с вращающимся вокруг них тазом, как когда вы садитесь
или наклоняетесь. Однако таким движением лучше управлять с помощью отдельных настроек таза
в сборке и сохранить анатомически правильную треугольную структуру.

@Рис. 6.14. Обратите внимание на пространство между верхними частями ног и основанием
позвоночника. Это правильная форма таза. Родительское сочленение – разделитель между
сочленениями бедер и позвоночника.

Верхняя часть спины, грудная клетка и плечи


Верхняя часть торса имеет очень широкий круг возможных движений, когда вы комбинируете их
с движениями плеч, лопаток, ключиц.
Давайте начнем с верхней части грудной клетки и пойдем от нее вниз. Большая часть движений
позвоночника ограничена его нижним отделом, но все же в верхнем отделе тоже совершаются
некоторые изгибы и скручивания. Ребра прикреплены в трех отделах. Начиная сверху вниз, первая
группа ребер соединена в грудине и у позвоночника, образуя полужесткую конструкцию. Эти
ребра также составляют главную устойчивую зону, по которой скользят и с которой
взаимодействуют лопатки. Также к ним прикреплено множество мышц. Следующий отдел ребер
меньше по размеру, он состоит из трех костей, которые более свободно соединены с грудиной и
поэтому гнутся и двигаются лучше, чем основные ребра грудной клетки. Последние два ребра –
плавающие, они присоединены только к суставам позвоночника. Для облегчения скиннинга
можно создать дополнительные сочленения грудной клетки, но необязательно. Помните, что
основной скелет должен быть настолько легким и быстрым, насколько это возможно. Потом вы
сможете добавить к окончательной сборке любые деформаторы.
На рисунке вы видите два скелета спины (рис. 6.15). В первом достаточное для риггинга спины
количество сочленений; каждое из них соответствует важной точке движения позвоночника.
Второй скелет – упрощенный вариант позвоночника, с минимальным количеством сочленений,
необходимых для движения верхнего или нижнего отдела спины. Он подходит для фоновых
персонажей игры (рис. 6.16).
Следом за ним вы увидите простой скелет спины, низкого разрешения. Такое крайне малое
число сочленений может использоваться для фонового персонажа, также хорошо работает для
игровых персонажей-противников. Сочленения этого скелета выстраиваются в соответствии с
положением главных сочленений скелета высокого разрешения, так что вы можете легко
отображать движения одного скелета на другом. Эта совместимость становиться более важной при
работе с motion capture и риггинге для игр.

@Рис. 6.15. Скелеты спины высокого и среднего разрешения


@Рис. 6.16. Позвоночник среднего разрешения, размещенный в модели

@Рис. 6.17. Правильное положение ключиц vs. центрированные, неверно расположенные


ключицы

Плечо – проклятие многих технических режиссеров – требует больших усилий для придания
ему правильного поведения во время анимации. Плечевая зона – один из наиболее сложных
наборов соединений во всем теле, благодаря широкому кругу совершаемых движений и числу
костей и мышц, производящих эти движения. Распределяя сочленения в этой части персонажа, как
всегда, сверяйтесь со справочниками по анатомии и с собственными ощущениями. Вы быстро
поймете, что ключица находится прямо под кожей. Вы заметите также, что она вращается вокруг
передней части грудной клетки, а не вокруг середины плеча и не вокруг позвоночника. И снова,
можно найти для примера персонажные сборки, в которых это сочленение помещено в центр тела.
Если сочленение ключицы находится в центре тела, то оно вращается оттуда. Вы получите
проваливающуюся внутрь тела грудную клетку и странные движения. Это также усложнит работу
аниматоров по приданию поз персонажу. Этот момент имеет большое влияние на то, как работает
плечо и как оно выглядит во время анимации (рис. 6.17).
Когда вы вытягиваете руку вперед, вся плечевая конструкция поворачивается и перемещается
вперед, придавая грудной клетке V-образную форму клина (рис. 6.18 – 6.20). Лопатки скользят по
ребрам, а мышцы и соединительная ткань держат плечо в его углублении, когда плечевая область
двигается вперед. Попробуйте достать до чего-нибудь так, чтобы ключицы не поворачивались, и
посмотрите, как они влияют на вашу способность дотягиваться до объекта. Очень сложно сделать
так, чтобы персонажи с двуручным оружием выглядели так, как нужно, если их плечи в сборке
работают неправильно.
Лопатка вращается вокруг своего верхнего угла, где она соединяется с ключицей. Ее сборка
может быть такой простой, как отдельное трансформирующееся сочленение, а может быть
объектом, который влияет на кожу и скользит по поверхности, имитируя движение кости над
грудной клеткой. Она может поворачиваться и двигаться независимо от ключицы и руки, потому
что это место прикрепления многих мускулов, идущих в разных направлениях. В зависимости от
движения руки лопатка может участвовать в самых разных автоматических движениях. Есть
несколько быстрых способов имитировать эти движения, и в зависимости от желаемой степени
детализации и точности используются две основные точки опоры. Первый вариант – поместить
осевую точку лопатки примерно там же, где сходятся плечевое углубление и ключица. Это даст
вам возможность быстро создать реалистичные и управляемые движения лопатки, а также
поможет в скиннинге. Это не совсем правильно, но работает достаточно хорошо.

@Рис. 6.18. Здесь показаны различия в движении при правильной и неправильной постановке
ключиц. Обратите внимание на разницу в расстоянии, на которое может вытянуться рука, а также
на то, где заканчивается кость модели: одна поворачивается вперед, в то время как другая
вращается внутри тела

@Рис. 6.19. Заметьте, та же проблема возникает и при подъеме руки вверх

@Рис. 6.20. И мы наблюдаем всё ту же проблемму и с поворотом руки назад. Здесь ясно видно,
как одно неправильно размещенное сочленение может потом привести к проблемам с
деформацией. При этом неважно, в каком направлении оно вращается

Более правильный вариант – поместить осевую точку ниже на поверхности лопатки. Это ближе
к точке, откуда кость по-настоящему поворачивается и скользит. Это требует больше настроек, но,
закончив скиннинг, вы добьетесь потрясающего ощущения скольжения кости под поверхностью
модели. Положение точки опоры, а также угол вращения кости показаны на рисунке (рис. 6.21).
Также взгляните на диапазон движений и на область скольжения лопатки (рис. 6.22).

@Рис. 6.21. Точка вращения лопатки

@Рис. 6.22. Общий диапазон движений лопатки


Давайте рассмотрим головку плечевой кости. С положением этого сочленения дело обстоит
немного сложней, чем обычно думают люди, взглянув на персонаж в первый раз. На первый
взгляд, когда вы поднимаете руку, она просто немного поворачивается, пока остальная часть плеча
не берет управление на себя и не завершает подъем руки. Это очень упрощенная схема движения
сочленения. В реальности же, во время движения большинства сочленений, в том числе и плеча,
центр вращения постоянно меняется, когда кости скользят друг по другу, и к повороту сочленения
добавляется перемещение. В современный 3D пакетах, применяя по умолчанию ИК решатели, не
удобно приспосабливаться к тому, что мы назовем сдвигом вращения (rotational offsetting). Лучше
всего найти наилучшее среднее положение центральной точки и затем с применением деформеров
вычислить влияние сдвига вращения на кожу. Это удобнее, чем пытаться написать новый
решатель.
Можно переместить сочленение плеча слегка вниз от края ключицы (рис. 6.23). Это дает
дополнительное преимущество при добавлении дополнительного слоя разделения во время
скиннинга, так что скручивание плеча ограничено плечевым углублением, и плечо не может
поворачиваться или скручиваться в грудной области меша. Если этот вариант вам не подходит из-
за motion capture или ограничений игровой платформы, то лучше поместить плечевое сочленение
повыше, чтобы избежать уплощения плеча модели при деформации и поддержать объем плечевой
зоны.

@Рис. 6.23. Сдвиг плеча от места прикрепления ключицы/лопатки

Когда ключица, плечо и лопатка находятся на своих местах, большая часть работы заключается
в управлении деформацией с помощью весов на коже и других деформеров. Это приводит к
пониманию, какова роль каждой кости во время движения, какие мышцы в это время работают и
как они влияют на поверхность кожи.
Кисти рук и пальцы
Кисти рук и пальцы также сложно конструировать, как любую другую часть тела. Это
сопоставимо с риггингом пяти маленьких рук. Каждое сочленение может сгибаться отдельно,
может сгибаться и назад, как при нажатии рукой на стол. В сборках пальцев большинства
персонажей на ладонь отводится одно сочленение, а пальцы представляют кулак. Это может
работать нормально, но является ограничением для аниматоров. (Да, это замечание часто
повторяется в этой главе.)
Пястные суставы каждого пальца начинаются сразу у запястья и позволяют кисти при
настроенных весах принимать чашевидную форму, изгибаться и расправляться. Чтобы дать
аниматорам дополнительное управление, нужно добавить в кисти вашего персонажа эти экстра
сочленения. Тогда руки смогут принять любую выразительную форму. Руки компьютерного
персонажа могут казаться негибкими и неестественными по одной причине: из-за недостатка
сочленений и чрезмерного упрощения этой зоны, наряду с плохой расстановкой сочленений.
Создав один набор сочленений и разместив их как следует, скопируйте эту цепочку и затем
подгоните ее под каждый палец. При этом удостоверьтесь, что меш руки и пальцы смоделированы
в форме дуги, потому что суставы пальцев не образуют прямую линию, и это не должно
происходить с моделью. Даже у нереалистичных созданий все сочленения не должны
выстраиваться в линию.
Чтобы пальцы и сочленения лучше работали во время скиннинга, поместите их чуть выше и
дальше видимых в модели сочленений. Это приводит к тому, что вершины кожи слегка выступают
на суставах пальцев и образуют складку на внутренней части пальца. В этом случае мы обратимся
к настоящей анатомии, затем подгоните положение опорных точек, пока не добъетесь нужного
эффекта деформируемой кожи. Помните, что в любом случае нужно сохранить объем и силуэт
модели, пока она не будет настроена для аниматоров (рис. 6.24).

@Рис. 6.24. Здесь показано влияние положения сочленений пальцев на скиннинг. Обратите
внимание на различия в костях: одна поворачивается вокруг кончика главной кости, а другая – на
прямо на кости.
Зависимости в производстве: исследования вне
анатомии
Вне анатомических исследований лежит еще целый вид исследований, которые должен выполнить
технический директор по персонажам. Этот вид относиться к области требований анимации,
пользовательского интерфейса и инструментов для риггинга. Такие вещи, как требования
внутреннего и внешнего производственного процесса, также должны быть перепроверены перед
тем, как начинать риггинг.
Аниматор: друг или враг?
Привлечение аниматоров на раннем этапе конструирования персонажной сборки – важный аспект
риггинга. Это значит, что вам нужно поговорить с аниматорами и узнать, как им нравится
работать. Если у вас есть время, хорошо бы посидеть с аниматорами наблюдая, как они работают,
потому что наблюдение за тем, как они применяют их текущую сборку, поможет вам быстро
понять, с чем им нравится работать. Есть и дополнительная польза от общения с людьми, для
которых вы будете создавать инструменты, которым вы будете помогать и с которыми будете
работать в течение всего производства. По ходу работы вы можете и должны обсуждать с
руководителями отдела анимации все эпизоды, которые требуют особых настроек и дополнений к
базовой сборке.

Врезка. На то, чтобы аниматоры приняли новую персонажную сборку,


отличающуюся от той, которую они использовали раньше может
потребоваться времени больше, чем изначально планировалось.
Технический директор по персонажам может облегчить эту задачу, если
сразу на ранней стадии вовлечет команду аниматоров в конструирование
сборки и позволит им вносить предложения в любое время. Создание Web-
сайта или просто наличие чистой доски для записей, где люди могли бы
оставлять свои предложения или просьбы, также помогает аниматорам
ощущать свою роль в проекте. Они будут более восприимчивы к новым
инструментам, персонажным сборкам или изменениям в рабочем потоке, в
которых они сами будут участвовать. Время на тренировку и вовремя
обновляемая документация на все инструменты с использованием коротких
тестовых роликов записанных с экрана также помогут подготовить
аниматоров перед тем, как они получат сборку.

Планирование и вопросы производственного процесса


Еще одна область, в которой технический директор должен быть осведомлен – это требования
производства к риггингу. Что может быть хуже, чем углубиться в производство и потом
обнаружить, что все нужно перенастроить, изменить или экспортировать в другую программу из-
за небольшой оплошности? Этого не всегда можно избежать, но все усилия должны быть
направлены на то, чтобы вы, технический директор по персонажам, знали все о производстве
персонажа. Вот некоторые указания для вашего текущего или нового производства:
 Создается ли персонаж лишь в одном программном пакете? Нужно ли экспортировать
его в другое приложение для 3D, и если да, то какая программа и какой формат будут
использованы для его перемещения? Что нужно переместить? Только анимацию, скелет
и кожу или весь риггинг? Готовые модели?
 Будет ли применяться к сборке техника motion capture или только ручная анимация?
Это может означать, что вам придется добавить в сборку дополнительные контроллеры,
чтобы обеспечить импорт и редактирование данных motion capture. Возможно, вам
придется экспортировать персонаж в Motionbuilder для редактирования motion capture;
 В каком формате будет motion capture при перенесении в Maya из другой программы?
Какое влияние это окажет на положение сочленений скелета, их количество и названия?
 Нужна ли одежда, и если да, нужно ли настраивать ее вручную или с помощью
имитации?
 Какова стандартная процедура обновления персонажа в производстве? Перенесения
анимации посредством редактора Trax Editor или специально написанного скрипта,
перемещения файлов, импорта кожной и соединения его с ригом для анимации?
 Как вы будете контролировать изменения и исправления сборки в файлах? Путем
добавления скрытых атрибутов в файл Maya, которые отслеживают даты изменения
риггинга и запущенные сценарии с номерами версий, кем и когда были прикреплены к
файлу все эти замечательные вещи. Для всех узлов в Maya предусмотрены заметки с
помощью которых можно обновлять информацию об этих узлах. В Max тоже есть
несколько возможностей хранения такой информации, на уровне сцены или в
пользовательских настройках объекта.
Чем лучше технический директор понимает весь путь создания персонажа, тем лучше он будет
работать.
Применение анатомии человека и животных для создания
фантазийных существ: Свинячий Гоблин
Чтобы начать риггинг персонажа из этой книги, вам нужно построить скелет, который мы будем
настраивать в седьмой главе. Вы можете начать с наброска или просто скачать файл модели
mesh_PigGoblin с Web-сайта (www.courseptr.com/downloads).
1. Чтобы начать риггинг этого персонажа, настройте файловую систему со ссылками,
чтобы можно было убедиться, что в файле персонажной сборки всегда самая свежая
модель. Это к тому же уменьшит размер файла персонажной сборки, так как мы не
будем сохранять новую копию модели в каждом файле. Создайте для этой системы
структуру файлов, исходя из типа библиотеки. В данном случае это библиотека
персонажей.
2. Создайте папку под названием «Персонажи» («Characters») $$Советуем вам создавать
имена используя латинские буквы. Если же вы не очень сильны в английском, то
можете использовать транслит. Пример – personazh – прим ред $$. В ней создайте папку
с инициалами имени персонажа, для PigGoblin’а это PG. В папке PG создайте папки для
модели и для персонажной сборки. Окончательную версию файла модели сохраняйте в
папке моделей под именем mesh_«имя». Потом на него будет ссылаться новый файл,
сохраненный в папке риггинга.
3. Создайте в Maya новый файл с ссылкой на файл mesh_PigGoblin, но используйте опции
пространства имен и тип «this string» в mdl (сокращение для «model») (рис. 6.25). Затем
выберите файл меша. Сохраните его в папке рига как template_PigGoblin. Это будет
рабочий образец, из которого будет строиться сборка.

Врезка. Окончательная структура директорий может быть изменена в


зависимости от Ваших предпочтений, или от текущих работ в вашей
компании. Это лишь один из способов. Другие вопросы производственного
процесса будут рассмотрены в следующих главах.

4. До начала расстановки сочленений персонажа создайте слой для модели персонажа и


установите на него атрибут, не позволяющий влиять на размещение сочленений. В
Maya 6 появилась возможность автоматически помещать выбранные объекты в слой,
посредством нескольких кликов. Это опять же экономит ваши силы. В меню Layers 
Create New Layer  Options (Слои  Создать новый слой  Опции) отметьте
галочкой опцию Selected and Children (Выделенные и дочерние) (рис. 6.26).

@Рис. 6.25. Установление ссылки на исходный файл, который будет использоваться для
построения скелета

@Рис. 6.26. Новые возможности слоев в Maya 6

Приблизительное размещение сочленений


Идея файла-образца позволяет быстро расставлять и тестировать сочленения персонажа. На этом
этапе вас не должны беспокоить углы сочленений, проверка обнуления вращения или
правильность направления сочленений. Все это технические вещи, и ими можно заняться позже. В
данный момент вам нужно лишь найти нужные позиции для сочленений и проверить наличие всех
сочленений базового скелета.
Тщательно осмотрев наш персонаж, мы сразу же можем сказать, что у него есть такие области,
строение которых мы должны изучить и понять. Так как наш персонаж – гибрид свиньи и двуного
существа, мы поищем элементы анатомии свиньи и сделаем несколько набросков сочленений и
тех зон, где будет нужен тщательный скиннинг. Эти наброски помогут техническому режиссеру
определить размещение сочленений без помощи программного обеспечения. На рисунке показан
эскиз ноги настоящей свиньи (рис. 6.27). Слева изображена такая схема сочленений, которая
способствует общей деформации и риггингу и учитывает скиннинг. Правая часть рисунка
показывает, как должны располагаться сочленения, чтобы скелет был правильно анимирован. Но
кожа здесь не принимается во внимание. Отметьте также, что точки опоры располагаются не в
пространстве между сочленениями, а перед следующим сочленением цепочки, благодаря чему
кость вращается вокруг сочленения, которому она подчинена, как настоящие кости. Посмотрите
на скриншот из Maya с нашим наброском схемы сочленений, необходимых деформаторов, в том
числе для одежды, и другими заметками относительно того, что необходимо для риггинга
персонажа (рис. 6.28). С подобных быстрых набросков и тщательного изучения справочных
материалов можно начать расстановку сочленений в 3D сцене.

@Рис. 6.27. Пример того, как различается положение сочленений в реалистичных скелетах
свиньи. Один предназначен для скиннинга, другой соответствует правильному движению костей

@Рис. 6.28. Набросок быстрой разметки сочленений нашего главного персонажа

Размещение сочленений
Теперь, когда папки и файлы настроены, можно начать расстановку сочленений персонажа.
1. Начните создание скелета с родительского сочленения и продвигайте сочленения
спины. Из нашего раннего рассказа Вы знаете, что реальный позвоночник разделен на
участки разной гибкости. Можно сделать ограниченное число сочленений, и все же
получить полный диапазон движений персонажа (рис. 6.29). Чем важнее нюансы и
тонкие движения, тем больше сочленений потребуется, чтобы расширить этот диапазон.
Однако чем больше сочленений вы добавляете, тем сложнее будет риггинг и скиннинг.
В большинстве случаев вы можете использовать меньшее количество сочленений.
Убедитесь, что сочленения спины находятся там, где нужно, так как они являются
основой для всех остальных. Этот персонаж покрыт доспехами и у него толстые пояса.
Поэтому нужно пробовать, насколько близко к центру персонажа можно разместить
кости позвоночника. Иногда незначительные корректировки могут оказывать большое
влияние на то, как действует модель, прошедшая скиннинг. Все-таки старайтесь, чтобы
сочленения были удалены от центра спины модели персонажа, потому что размещение
их в центре потребует дополнительной аниматорской работы, чтобы персонаж выглядел
более естественно.
2. Затем, создайте сочленения ног, размещая начальное сочленение в боковом виде
спереди и снизу от родительского сочленения, то есть места, где должно быть начало
бедра. Колено и то, что было бы лодыжкой этого персонажа, в целях правильной
деформации размещены слегка в стороне от положения настоящих костей. На виде
спереди вы можете увидеть, что мы сдвинули сочленения ног в сторону их внешних
частей, они находятся не точно в центре. Из-за широких бедер и толстых ног этого
персонажа такое расположение удобнее для деформации. На рисунке показана
окончательная схема сочленений ног персонажа.

@Рис. 6.29. Первоначальная схема сочленений главного персонажа


@Рис. 6.30. Окончательная расстановка сочленений ног персонажа. Сравните это с нашим
наброском ног свиньи и посмотрите, что мы использовали с того наброска, а что нет. Пальцы
немного отличаются, потому что некоторые из точек опоры будут взяты из сборки, а не скелета

3. Перед тем, как сделать ноги дочерними по отношению к родительскому сочленению,


можно несколькими способами подключить к основанию позвоночника персонажа ноги
и позвоночник. У каждого из них особые свойства, но в результате получается одно и то
же: отделение верхней части тела от нижней.
 Первый способ – просто напрямую подчинить основанию позвоночника ноги и
позвоночник. По умолчанию этот способ не позволяет Вам анимировать таз
отдельно от позвоночника; Вам придется анимировать позвоночник наоборот,
против его родительского сочленения, чтобы это сработало. Для игрового
персонажа с ограниченным количеством костей этот способ будет отлично
работать даже после разовой сборки.
 Второй способ – дублировать основание позвоночника, чтобы сочленение бедра
было дочерним ему, а бедрам, в свою очередь, были дочерними ноги. Это
позволяет поворачивать бедра, не затрагивая позвоночник, но родительское
сочленение все-таки влияет на общую позу персонажа и на его позвоночник.
 Третий способ (который мы использовали в этой книге) – добавить одно (или
больше) сочленение позвоночника, снова дублировать родительское сочленение
и подчинить позвоночнику эту новую точку. Возможно, это не необходимо, но
позволяет предотвратить контр-вращение сочленений и избежать блокирования
шарнирного вращения в узле родительского сочленения.
4. Могут возникнуть проблемы с размещением рук, но у нас есть на что опереться, и наш
первый набросок должен помочь. Глядя на рис. 6.31 вы можете увидеть, как позже Вам
нужно будет настроить вращение кости, чтобы добиться совпадения с положением
модели . Начните с ключицы, а затем перейдите к плечу. Сочленение плеча должно
быть расположено выше и вне области груди, так как рука должна сгибаясь вниз
свободно лежать на боку персонажа. Постарайтесь удостовериться в том, что при
повороте вниз это сочленение становится сбоку от ребер, а не внутри них. Это простой
и быстрый способ проверить, не поместили ли вы сочленение плеча слишком близко к
телу (рис. 6.32). В скелете для игры может не быть двойного плечевого сочленения, но в
данном случае мы собираемся сместить настоящее сочленение плеча вниз от ключицы.
Таким образом мы создадим дополнительный слой для отделения скиннинга в той
области, где скиннинг всегда сложен. Этот небольшой дополнительный сдвиг
сочленения дает вам хорошее управление скиннингом для большинства движений (рис.
6.33).

@Рис. 6.31. Плоскости, на которые ориентируется сочленение. Обратите внимание, что плечо и
предплечье не находятся в одной плоскости

@Рис. 6.32. Вот первоначальное размещение сочленений ключицы и руки

5. Что касается локтя, поставьте его прямо за точкой локтя персонажа. Такое положение
помогает сохранить ощущение костей под кожей, когда рука сгибается (рис. 6.34).
6. Положение сочленения запястья – над центром кисти и за стыком запястья и кисти.
Вместе со вторым сочленением, расположенным прямо рядом с главным, такое
положение удобно для сгиба кисти вверх и вниз (рис. 6.35).
7. Сделайте сочленение руки дочерним грудному сочленению spine06, а затем зеркально
отразите эту цепочку.

@Рис. 6.33. Второй вид сочленений ключицы и руки

@Рис. 6.34. Размещение сочленения локтя

@Рис. 6.35. Первая позиция сочленений запястья


Главный шаблон этого персонажа закончен. Это минимальное количество сочленений, при
котором персонаж годится для работы. Его модель может быть меньшего разрешения, и с ним
можно работать в различных программах, подобных Massive, или экспортировать его в игровой
движок. Такой тип легкого скелета также хорошо примет данные motion capture, так как это
действительно стандартный скелет двуногого существа. Теперь вы можете добавить еще
несколько сочленений, чтобы завершить детализацию, например, кистей и пальцев ног.
Продолжение стандартного размещения сочленений:
чрезвычайные меры
Пальцы рук и кисти, когда они под углом, часто бывает трудно строить. Поэтому мы построим
руку в свободном пространстве, а потом повернем ее и передвинем на место.
1. Начав в виде сверху, создайте цепочку из пяти сочленений (рис. 6.36).
2. Дважды дублируйте ее и поставьте получившиеся цепочки рядом с первой.
3. Временно сгруппируйте цепочки, чтобы их можно было повернуть все вместе и
переместить на нужное место. Установите точку опоры группы, как нужно (рис. 6.37).
4. Приладьте сочленения к пальцам, в том числе к большому пальцу. У этого персонажа
большие, похожие на копыта ногти на пальцах, поэтому мы использовали
дополнительное сочленение, чтобы эти ногти могли изгибаться и чтобы облегчить
позиционирование рук. Обратите внимание, что сочленения пальцев размещены в меше
высоко, ближе к поверхности, чем настоящие кости. Благодаря этому кости будто бы
видны под кожей (рис.6.38).
@Рис. 6.36. Привязка исходных сочленений пальцев

@Рис. 6.37. Сочленения пальцев выровненные с запястьем

5. Теперь выделите все начальные сочленения пальцев и сделайте их дочерними


сочленению запястья. Потом вы можете просто зеркально отразить сочленения кисти,
чтобы убедиться в том, что с другой стороны они выстроены правильно.
6. Заключительная часть создания этого персонажа – добавление дополнительного слоя
сочленений пальцев ног точно так же, как в случае с кистями. У этого персонажа
особенные ступни, и так как он босой, мы должны сделать все пальцы отдельно. В
боковом виде отобразите сочленения heelToe и сделайте их дочерними цепочке
сочленений ноги (рис. 6.39).
7. Сочленения пальцев ноги будут расположены над вершиной главной кости стопы, и мы
сможем анимировать каждый палец по отдельности. Изобразите их на боковом виде с
помощью инструмента Joint, а затем разместите внутри каркаса стопы и пальцев (рис.
6.40).

@Рис. 6.38. Подгонка сочленений пальцев в модели

@Рис. 6.39. Размещение сочленения heelToe

@Рис. 6.40. Дополнительные сочленения в местах сглаженной кожи

На этом этапе Вы совершили главную настройку скелета, но помните, что это всего лишь
шаблон. Ни одно из этих сочленений не будет использоваться в окончательном скелете или
сборке. Следующий шаг – создать правильно расположенные сочленения, которые можно будет
использовать в будущем. Пока можно сделать несколько быстрых тестов, чтобы проверить, как
работает схема сочленений и исправить ее, если нужно. Помните, что небольшие изменения могут
очень сильно влиять на деформации, так что попробуйте воплотить некоторые идеи перед тем, как
завершить присваивание имен, ориентировку, финальные настройки скелета (рис. 6.41). В
следующей главе будет рассмотрено начало риггинга: превращение временного скелета в
окончательный и создание персонажной сборки (рис. 6.42).
Все великое искусство опирается на тщательное изучение реальности. Потом реальность
переосмысляется в художественной интерпретации, и вы получаете окончательный результат с
опорой на реальность, что делает персонажей правдоподобными, являются ли они реальными,
изображенными на фотографии или абстрактными. Точно так же можно сделать хорошую сборку.
Технический директор по персонажам привлекает свое видение и понимание исследования для
того, чтобы создать устойчивый скелет и знает, когда и как можно нарушить правила и не
последовать собранной справочной информации, чтобы достичь цели.

@Рис. 6.41. Протестируйте кожу, чтобы увидеть, как исходные сочленения работают на модели

@Рис. 6.42. Окончательный скелет, готовый для следующего этапа производства

Глава 7
Надежные, удобные для пользователя, гибкие
персонажные сборки
Главная проблема персонажной сборки заключается в проверке того, сборка имеет все
необходимые аниматорам настройки и возможности и в то же время является удобной для
освоения и использования. Также она должна быть достаточно быстрой, чтобы позволять во
вьюпорте воспроизведение в реальном времени или приближенное к реальному времени,
насколько возможно. Есть много способов достичь этого – сделать сборку одновременно быстрой
и мощной, а также включая создание особых сборок для каждого уникального набора задач,
которые могут возникнуть в отдельном эпизоде, или построение уникальной сборки, которая
делает 100% того, что нужно аниматору, за 90% времени (а в остальное время сборку можно
дополнять и отлаживать). Скорость работы сборки даже более важна, если в каждой сцене у вас
несколько персонажей. Например, вы добавляете специальное выражение, полагая, что оно будет
быстрым, а оно обрабатывается всего несколько раз за кадр, благодаря чему аниматор хочет
оторвать вам руки за замедление файла. Другой аспект, влияющий на скорость работы сборки, –
это схема, организация управления персонажем и установление атрибутов управления. Мы
поговорим о стратегиях улучшения этих аспектов сборки.

Особенности сборки
В общем, окончательное управление и опции сборки будут созданы сообща техническим
директором по персонажам и ведущим аниматором. Вот несколько примерных требований Кейта
Ланго (Keith Lango) относительно того, что ему нравится, и что не нравится в персонажных
сборках:
 Скорость: пусть она будет высокой;
 Точность: для проверки поместите в сборку модель настолько высокого разрешения,
насколько это возможно, без замедления скорости;
 Опции: не вынуждайте нас решать проблему лишь одним способом;
 Очистите те ограничивающие родительские системы, которыми легче управлять
(больше инструментом, чем сборкой);
 Запястью, которое следует направлению руки, нужна прямая кинематика даже в режиме
инверсной и возможность переключать режимы. Так же создайте корректоры
шарнирного соединения (gimbal correctors), которые можно переключать в случае
необходимости;
 Манипуляторы силуэта, позволяющие совершать такие деформации модели как
растяжения. (для мультяшных персонажей);
 Настолько гибкое лицо, насколько возможно;
 Не бывает лишних ghost-ключей объектов. (Мы это часто видим на руках, когда в
управлении нижней частью руки есть ghost-ключи для связанных с ней управляющих
элементов, например, запястья, плеча и так далее);
 Ясный, гибкий, полный пользовательский интерфейс. Любая попытка убрать
беспорядок на экране будет большим благом;
 Новая технология: обнаружение столкновений поверхностей в реальном времени (не
кэшированная или построенная), отключаемое у каждого объекта. (Одна лишь эта
технология может сэкономить студиям десятки миллионов долларов на стандартном
высококлассном анимационном фильме, потому что она облегчит большую часть
работы отделов, занимающихся устранением пересечений, столкновений,
проникновений, плохого скиннинга и так далее.)
Это всего лишь простой пример того, чего хотят аниматоры. Некоторые из просьб бывает очень
сложно выполнить, но большинство требований аниматоров примерно одинаковы: сделать
быстрее, проще, как можно больше усилить управление и детализацию без снижения скорости и
управляемости. Последнее требование обнаружения столкновений в реальном времени довольно
разумно, потому что в «Суперсемейке» («The Incredibles») от Pixar скиннинг и настройка
мышечных систем для аниматоров проходили почти в режиме реального времени, в том моменте
где анимировался персонаж для финального рендеринга, а не персонаж низкого разрешения,
который должен был пройти через симуляцию.

Врезка. Если вы работаете с другими программами, такими как Max или


XSI, то вы должны по большей части уметь делать все то, о чем
говорится в этой главе. Знайте, что в этом пособии мы часто используем
группы, а они представляют собой лишь дополнительный узел-трансформы,
как локатор или point helper в других программах. Существуют сценарии
для Max, которые, например, имитируют групповую функцию Maya путем
создания point helper и подчинения ему выделенного объекта. Вам не
придется делать это вручную. На рисунке показан процесс риггинга в
Max, обладающий большинством свойств риггинга в Maya (рис. 7.1).

@Рис. 7.1. Риггинг персонажа в Max

В Pixar для анимации использовалось собственное программное обеспечение. В Maya мы пока


не можем получить мышечную систему в режиме реального времени, но такие программы, как
Alias Motionbuilder, – это программные пакеты для анимации в реальном времени. В Motionbuilder
еще нет мышечной имитации, но в нем можно проигрывать анимацию прошедшей скиннинг и
анимированной модели так, как она будет выглядеть после рендеринга, без создания
предварительного просмотра анимации, ради проверки тайминга. Поэтому Motionbuilder отлично
экономит время.

Ускорение Вашей сборки


Помимо объективных факторов, которые могут замедлить сборку, таких как множество
выражений или деформируемая кожа в файле, существуют и другие факторы, о которых нужно
помнить во время создания персонажной сборки и проверки её скорости. Иногда документация и
тренировочный материал для традиционных инструментов и сборок остаются без внимания. Если
вы как технический директор работаете в одиночку, то вы должны убедиться, что у вас есть
документация на сборки. Потому что когда вам понадобится потренироваться или выявить
неисправности во время обычной работы, это может застопорить производство.
Изготовление коротких подробных учебных видеороликов – быстрый способ создать
тренировочные материалы для ваших инструментов, по которым многие люди смогут учиться, и
Вам не придется стоять рядом с ними и показывать, как работать со сборкой. Это преимущество:
вы вводите людей в курс насчет инструментов быстрее, чем они бы прочитали документ, и никому
не приходится показывать им, как все работает.
Обновление роликов о новейших инструментах также может занимать много времени. Хорошо,
если у вас есть несколько роликов для сложных инструментов и есть небольшие, в которые удобно
вносить некоторые изменения, например, запись обновлений, рассылаемая аниматорам по
электронной почте. Часть вашей работы – исправление и обновление инструментов в течение
всего производства, и поэтому нужен центр для предложений, ответов и исправления ошибок. Вы
можете просто взять что-нибудь вроде общей крупноформатной таблицы Excel, которую просто и
быстро сделать, или вы можете использовать готовую базу данных для отслеживания ошибок
(bug-tracking database), например bugzilla с http://www.bugzilla.org, которая позволяет вести работу
с большой группой аниматоров и удаленных рабочих. Другой способ создать живой документ по
риггингу – сделать сервер WIKI, чтобы люди могли редактировать и обновлять информацию по
мере необходимости, при этом без участия автора загружающего обновления контента. Зайдите на
http://www.openwiki.com/ за более подробной информацией.
Другое, часто упускаемое из вида, требование к сборке это возможность контроля
экспорта\импорта анимационных данных, так же как и любой другой внешней информации
помещенной в сборку, в которой ещё не проставлены ключевые кадры. И здесь большинство
анимационных систем терпят крушение, но поскольку мы используем двух скелетную систему,
мы в любой момент можем переназначить скелет скиннига, анимированному скелету без
совершения комплексных перемещений анимационных данных. Другой способ перемещения
анимации включает в себя использование редактора Trax, с целью перемещения анимации между
файлами сборок; или же использование собственных скриптов, сохраняющих и загружающих
анимацию. Несмотря на то, что всё это больше относиться к области производства, чем к области
риггинга, об этом должны позаботиться на ранних стадиях процесса.

Врезка. И в XSI, и в Maya имеются очень хорошие опциии


экспорта\импорта анимации. В Max (без использования Character studio)
есть только один инструмент для загрузки анимации – сценарий Merge
Animation. Некоторые проблемы возникают и здесь, если ваши файлы не
совсем совместимы; к счастью, это сценарий, который можно
редактировать, подстраивая под нужды Вашего производства.

От предварительного скелета к сборке


Теперь, когда предварительный скелет персонажа из главы 6 построен, мы займемся следующей
частью сборки. Это настоящий скелет, который вы будете использовать для создания скиннига
модели. Этот скелет – основа всех остальных частей сборки. Все это можно автоматизировать, но
мы сначала проделаем все операции вручную.
Ориентации сочленений шаблонного скелета выровнены по глобальной системе координат
(рис. 7.2). После того, как мы сделаем новый скелет, ориентиры будут выровнены по сочленениям.

@Рис. 7.2. Выровненная по глобальной системе координат ориентация сочленений

1. Используя инструмент Joint и привязку к точкам (snap-to-point) (v – горячая клавиша)


создайте новые сочленения поверх шаблонного скелета, используя его как точную
схему для окончательного скелета. Привяжите первое новое сочленение к
родительскому сочленению, и затем продвигайтесь вниз по левой ноге, пока не
получите новый скелет (рис. 7.3). На рисунке (рис.7.4) показан этот только что
созданный нами скелет с видимыми локальными осями вращения или ЛОВ (local
rotation axis - LRA), так что вам виден окончательный результат создания новых
сочленений. Взгляните на ориентации сочленений: теперь они выровнены по
сочленениям, но не постоянны. Ими мы займемся потом, когда закончим остальные
сочленения ноги.
2. Продолжая процесс привязки новых сочленений поверх шаблонного скелета, Вы
закончите пальцами ног и привяжете их к новому скелету, завершив построение левой
ноги.

@Рис. 7.3. Заново созданные сочленения

Исправляя ЛОВ скелета, в данном случае мы должны убедиться, что все они указывают
постоянное направление. В случае с нашим персонажем мы направим ось Y вперед, благодаря
чему все данные анимационной кривой оси Z после анимации будут постоянными. Это один из
первых шагов к созданию надежного, легко анимируемого скелета. Даже простые системы прямой
кинематики должны быть построены так, чтобы их можно было анимировать быстро и
рационально.
Есть несколько способов редактировать ориентации сочленений, множество бесплатных
сценариев в Web, но в Alias проделали большую работу, обновив их собственный инструмент
Orient Joint (Ориентация сочленения) (рис. 7.4).

Врезка. Чтобы ориентировать конечные сочленения так, чтобы они совпали


со своими главными сочленениями, просто выставьте параметры
инструмента Orient Joint на none («никак»). Тогда LRA совпадут с
главными сочленениями. Или можете просто установить ориентацию на нуль
в Attribute Editor, но это нужно сделать одновременно для всех
сочленений. Еще вы можете установить ориентацию сочленений на нуль с
помощью Attribute Spreadsheet (Крупноформатная таблица атрибутов),
которая, в отличие от Attribute Editor, позволяет редактировать
множество значений одновременно.

@Рис. 7.4. Новый завершенный скелет ноги с отображенными LRA и новый инструмент Orient
Joint

1. Примените один из инструментов ориентации и установите ориентации сочленений так,


чтобы ось Y была направлена вперед, а Z указывала на правую сторону персонажа.
2. После того, как вы настроили ориентации ноги так, что все они обращены в одну
сторону, вам, возможно, придется повернуть некоторые из них вручную, чтобы
завершить выравнивание сочленений.
3. Доделайте всю левую сторону скелета так же, как вы делали левую ногу, и убедитесь,
что все LRA сочленений настроены правильно.
4. Меняя настройки Second Axis World Orientation (Глобальной ориентации второй оси)
инструмента Orient Joint, можно установить LRA на руках и пальцах. Пальцы рук,
ребра и грудную клетку сложнее настроить из-за их необычного ветвления и
произвольных углов.
5. Чтобы LRA родительского сочленения выровнялись с первым сочленением
позвоночника, нужно разбить подчинение ноги основанию позвоночника, настроить
ориентацию сочленения и потом вновь установить родительскую связь ноги. Вы можете
настроить это и вручную, но по-нашему получится немного быстрее.

На рисунке показаны окончательные ориентации сочленений скелета (рис. 7.5).

@Рис. 7.5. Законченная левая половина скелета с отлаженными LRA

Прежде чем зеркально отразить ногу и руку, мы займемся присваиванием имен всей иерархии
сочленений. Подбирайте короткие и понятные имена, и не меняйте правила постановки пробелов,
строчных букв и номеров в названиях. В этой книге мы постарались использовать короткие
подсказки в начале имени, например bn_upArm_L: сочленение это или кость, часть тела, сторона
тела.
Теперь мы опустим префикс bn, до тех пор, пока сборка небудет закончена. Пока скелет еще не
прошел риггинг, вы можете сделать набор выделений для отдельных сочленений, чтобы упростить
выделение и переименование в будущем:
1. С помощью встроенного инструмента Prefix (Префикс) можно добавить L или R в
начало названия каждого сочленения в иерархии, но мы предпочитаем, чтобы это было
указано в конце названия, и тут инструмент Prefix нам не поможет. Мы собираемся
сделать это с помощью инструмента Rename (Переименовать), который сделал Майк
Комет. Он выпустил очень удачный набор Mel-инструментов и плагинов для
технических директоров.
2. После того, как вы добавили суффикс, зеркально отразите руки и ноги и удалите
временный скелет.

Врезка. Для именования правых и левых частей есть опция инструмента


Mirror (Зеркало), чтобы, например, заменить L на R. Но тогда любое L в
названии будет заменено на R; можно заменить _L на _R, и тогда замена
затронет только L с подчеркиванием. Это одна из причин, по которым мы
оставили префикс bn на потом, когда скелет будет отражен, чтобы
инструмент Mirror не переименовал bn_leg_L в bn_Reg_R. Вы также можете
применить скрипт Майка Комета rename, чтобы выполнить поиск и замену в
отраженном скелете, не обращаясь к опции переименования инструмента
Mirror.
Скрипты Майка Комета можно скачать с http://www.comet-cartoons.com.

3. Последнее, что нужно сделать с этим скелетом – сгруппировать его и назвать новый
узел группы pgSkeleton: pg – сокращение от pigGoblin, а Skeleton – то, что содержит
группа. Сделав это, мы сохраним независимое от персонажа название скелета, а также
убережем имена скелета от влияния различных проблем именования, если в одном
файле будут загружены несколько персонажей. Если бы мы установили префикс pg для
всего скелета и рига персонажа, то переносить анимацию с одного персонажа на другой
стало бы сложнее, удлинились бы имена файлов, предназначенных для экспорта в
игровой движок, и стало бы труднее сортировать узлы и работать с ними в Outliner
(рис. 7.6).

@Рис. 7.6. Сгруппированный скелет в Outliner

Скрытые имена и редактор Trax


Обновленные возможности редактора Trax в Maya 6 позволяют переносить анимацию со скелета
на скелет. Trax можно использовать для перенесения анимации одного и того же скелета в другие
файлы, а можно заново отображать или перенаправлять движение на скелет, отличающийся и по
размеру, и по пропорциям. Чтобы сделать это и удостовериться, что скелеты по крайней мере
совместимы с маппингом в Trax, нужно воспользоваться Joint Labeling (Маркировка сочленений)
из меню Skeleton → Retargeting (Скелет → Перенаправление) (рис. 7.7).
На рисунке показаны Joint Labels (Метки сочленений); завершив работу с метками, мы
отключим их (рис. 7.8).
Есть ещё несколько вещей, необходимых для хорошей работы Trax, но для основных
возможностей перенаправления анимации Вам достаточно и этого.
Мы сосредоточены на создании надежного скелета, который войдет в процесс настройки и
станет для нас наилучшей основой. Trax дает нам еще одну причину сохранять постоянную
ориентацию сочленений всех скелетов. Ведь для того, чтобы быстро передать схему движения от
одного скелета к другому, местные оси вращения должны совпадать или быть очень близки к
скелету. Иначе скелет может повести себя непредсказуемо: ноги и руки начнут вращаться в
разных направлениях. Это совсем не то, что нам нужно.
Теперь, когда файл скелета готов, мы продолжим работу с файлом сборки, в котором
организуем управление и подключим системы, которые в конечном счете будут управлять этим
скелетом.

@Рис. 7.7. Отображение названий сочленений в Trax

@Рис. 7.8. Законченные метки сочленений

Врезка. Взглянув на скелет Вы, возможно, подумаете, что он еще не


готов, так как у персонажа есть разнообразные ремни, броня и оружие.
Вы будете правы, к сборке осталось прикрепить ещё несколько вещей. Но
мы посчитали, что всё это будет во вторичном проходе скелета,
оставленном на потом, так как всё это не обязательно для основных
движений персонажа. Также вам понадобится файл, которым вы могли бы
снабдить аниматоров для проверки, и чем скорее, тем лучше. Эти
предметы также можно считать элементом симуляции, которая требует
несколько иного управления, нежели анимационная сборка.

Файл сборки: геометрия низкого разрешения


Файл сборки сохранен как rig_имяПерсонажа, в данном случае rig_PigGoblin, и в этом файле мы
настроим прокси-геометрию (proxy geometry), а также все компоненты сборки, необходимые для
анимации.
Так как мы хотим отдать этот файл аниматорам как можно скорее, то для нас нежелательно,
чтобы они ждали, пока мы сделаем скиннинг, прежде чем начнут тестирование риггинга или
анимацию. Модель низкого разрешения можно создать несколькими способами; это даже можно
автоматизировать, как показано в мастер-классе по Maya «Hyper-Real: Body Setup», который
сделал Пол Туриот. В этом случае для его скрипта создания геометрии низкого разрешения вам
нужна законченная или почти законченная модель, прошедшая скиннинг, но тем не менее скрипт
работает очень быстро, если вы хотя бы сделали хотя бы быстрый скиннинг.
Недостаток состоит в том, что для скрипта Вам нужен уже законченный меш, но во многих
случаях сборка нужна до того, как модель завершена. Можно ускорить процесс, если моделер
построит модель низкого разрешения. Тогда технический директор может прикрепить его к
скелету и не дожидаться окончательной модели. Вне зависимости от того, как вы построите
прокси-модель, она должна быть разделена на сегменты, воспроизводящие объем персонажа,
чтобы аниматор мог знать, возникнут ли проблемы пересечения во время анимации, когда она
будет применена к готовой модели. Прокси-модель должна быть очень легкой с как можно
меньшим количеством полигонов, но все-таки оставаться как можно ближе к форме финальной
модели. Так же в ней должен быть один объект на сочленение, чтобы подчинить или прикрепить
его к скелету. Некоторые делают скиннинг геометрии низкого разрешения, но это только приводит
к замедлению, что нежелательно.

Врезка. Небольшой совет о прокси-моделях. Чтобы помочь аниматорам


сделать их скручивания и вращения наглядными, вы можете провести
полосы через отдельные полигоны модели, нанеся на них простые
материалы.

Так как скелет для скиннинга и скелет сборки – это отдельные файлы, с файлом сборки мы
можем делать все, что угодно. Прокси-геометрия отлично подходит для риггинга Прямой
Кинематики. Например, в отличие от всех этих дополнительных узлов-трансформ, путающих
нашу иерархию, прокси-объекты могут просто подчинять свои shape-узлы сочленениям.
Дополнительные узлы исчезают из главной схемы сцены, и объекты будут выступать в качестве
выделяющего манипулятора сочленений, когда вам понадобится анимировать их в ПК.
1. Если вы просто напрямую подчините shape-узлы сочленениям, форма выровняется так,
чтобы совпасть с ориентацией сочленения.
2. Чтобы поработать над этим, сначала сделайте модель дочерней по отношению к ноге,
заморозьте перемещения, чтобы обнулить модель, и потом подчините shape-узел
сочленению. На Web-сайте книги http://www.courseptr.com/downloads есть бесплатный
сценарий под названием bcParentShape.mel. В нем используется базовая Mel-команда
parent -s -r, выделение сочленения и формы меша.
3. После создания дочерних связей просто переименуйте узлы форм, чтобы они
соответствовали сочленениям, к которым прикреплены. Приведем родительское
сочленение в качестве примера: имя формы должно быть root_prxy_Shape, чтобы потом
вы смогли быстро разобраться в прокси-геометрии. Вы можете прикрепить все shape-
узлы к скелету сейчас или подождать, пока сборка будет готова.
4. Последняя отладка пользовательского интерфейса для аниматоров – установление цвета
скелета, его левой и правой частей и центра. Некоторым людям нравится делать это с
помощью слоев, но мы предпочитаем работать прямо с персонажем, не заботясь о
наличии или отсутствии слоев в файле. На рисунке показано, как применять параметры
Drawing Overrides к верхнему сочленению иерархии, чтобы раскрасить ее ветви:
голубой для середины, зеленый для левой стороны, красный для правой (рис. 7.9). То
же самое можно сделать в Max, да и в большинстве 3D пакетов предусмотрен такой
способ раскраски. Обратите внимание, что мы выбрали тусклые цвета, поэтому когда
мы потом раскрасим элементы контроля анимации, сможем взять более яркие оттенки
красного, синего и зеленого. Они будут лучше видны, и их будет проще выделить.
Теперь мы создадим слой для «prxy» геометрии. В поле быстрого выделения (quick-select
field) просто напечатайте *prxy*, и будут выделены все части меша, которые можно
добавить в новый слой, названный mdl_prxy_PG. Вместо слоя для управления
свойствами геометрии prxy можно использовать заданные атрибуты. Чем меньше слоев,
тем лучше, потому что они легко выходят из строя и вносят беспорядок в анимацию.

@Рис. 7.9. Раскраска левой и правой частей скелета.


Врезка. Если вы применяете слои в прокси-геометрии, настройки цвета
слоя будут перекрывать цвета меша. Если вы не хотите, чтобы это
произошло, можете сами задать цвета меша. Можно воспользоваться MEL-
командой color -ud # 1-8 или элементом пользовательского интерфейса из
меню Display  Wireframe Color (Отобразить  Цвет Каркаса), чтобы
применить цвета к прокси-геометрии. На них не повлияет слой, которому
они приписаны. Другая хитрость – проверить, что что-нибудь, например
ключевой кадр, соединено с перекрывающим цветом, прежде чем
приписывать его слою.

Файл сборки: конструирование и планирование сборки


В зависимости от вашего места в производстве и от того, когда вы приступаете к риггингу, нужно
идти навстречу аниматорам, и создавать необходимые для работы сборки компоненты. Однако так
почти никогда не происходит, и построение рига, который легко отлаживать и на котором удобно
основываться в будущем – цель правильного планирования.

Врезка. Не забудьте, что это файл сборки, так что мы можем дополнять
иерархию, добавлять атрибуты, динамику и все, что угодно, потому что
настоящий скелет, предназначенный для скиннинга, находится в другом
файле. Преимущество простого скелета в качестве базового файла для
рендеринга заключается в том, что мы можем смешивать сколько угодно
входных данных в скелете для скиннинга, будь то ключевой кадр, данные
motion capture или имитации. Разделение файлов также упрощает
обновление сборки по эпизодам, протяжении производства, и можно не
беспокоиться о каких-либо сбоях в файле для рендеринга или экспорта
(если речь идет об игре). Недостаток же состоит в том, что если Вам
нужно приспособить скелет для какой-либо цели, то синхронизация файлов
двух этих скелетов может быть довольно сложной, и это главное
обоснование скриптовой системы сборок, где изменения занимают минуты,
а не часы.

Когда Вы только сели создавать сборку, вы можете задействовать свои старые приемы и
хитрости. Некоторые вещи требуют новых решений и позволяют экспериментировать с разными
интерфейсами для аниматоров. Этот персонаж, в общем-то, – обычное двуногое существо, и
поэтому можно воспользоваться некоторыми техниками риггинга, которые были хорошо описаны
в первой книге «Inspired 3D Character Setup»; многие техники доступны в форме бесплатных
файлов и руководств в Internet. Учитывая особенности нашей сборки, можно на основе этих
материалов построить профессиональные элементы интерфейса для гибкости и скорости. При
этом для аниматоров он должен быть как можно менее сложным. Это непростая задача, но когда
вы поймете основные идеи, вы легко ее выполните.
Изучение Свинячьего Гоблина
При риггинге этого персонажа возникают очевидные сложности, особенно это касается ног. Мы
просмотрели огромное количество справочников и изучали работу ноги и стопы человека, но ноги
этого персонажа – ноги существа, похожего на свинью, и их пропорции сильно отличаются от
пропорций нормальных ступней. Мы понимаем анатомию, и поэтому знаем, что в ноге животного
не больше сочленений, чем в человеческой ноге. Это хорошая новость, потому что в таком случае
мы можем взять то, что описано в сотнях учебных пособий и что представляет собой реверсную
ногу персонажа. Но проблема все-таки в том, что из-за изменений в пропорциях и из-за типа
управления ногой, которое мы хотим установить, нормальная реверсная нога, как в сборке
персонажа-человека, здесь работать не будет.

Врезка. Различие здесь в том, что для построения стабильной сборки


ноги этого персонажа нам нужно запустить IK манипулятор там, где
должен быть подъем свода стопы двуногого существа, но у нашего
персонажа это больше похоже на лодыжку. Таким образом мы ограничим
контроль над этой частью персонажа, который, возможно, хотел бы
получить аниматор. В XSI есть очень подходящий ИК решатель под
названием «Dog Leg» («Собачья нога»), и в Motionbuilder от Alias тоже
есть очень хорошая сборка четвероногого существа. В обоих присутствуют
специально написанные ИК решатели, сконструированные для решения
особых проблем, которые возникают при риггинге таких персонажей. В
Maya нет таких решателей, так что нам придется их сымитировать.

Есть несколько способов настроить эту ногу так, чтобы аниматор имел над ней хороший
контроль. Первый и самый простой – просто провести одну цепочку ИК вдоль трех сочленений
ноги. Это работает хорошо, но вы не получите по-настоящему полного контроля над этими тремя
сочленениями. Жесткость сочленений может помочь в управлении решателем, также хорошо
может сработать настройка предпочтительных углов сочленений. Но в обоих случаях есть и
недостатки. Проблема настройки жесткости в том, что она замедляет ИК решатели сочленений, ей
сложно управлять, и она может привести к блокировке или скачкам сочленений.
Предпочтительный угол, в отличие от настройки жесткости, не связан с проблемой замедления, но
вам придется установить его раз и навсегда, впрочем Вы также можете и анимировать
предпочтительный угол, но лишь слегка, до того, как ИК будет привязана и придет в действие. Так
можно поступить, если вам требуется дополнительная гибкость сочленений, но будьте осторожны.
Стандартный метод риггинга реверсной ноги тоже сработает: вы можете настроить ее как
обычную ногу, стоящую на пальцах. Только тогда аниматору придется все время анимировать два
элемента управления вместо одного; иначе стопа будет выглядеть жесткой и неестественной. Вы
не добьетесь ощущения слаженной работы всей мышечной системы, вместо этого вы получите
ощущение, что верхняя и нижняя часть ноги разъединены в лодыжке, а это совсем не то, чего мы
хотим.
В последнем способе настройки ноги используется смешанная техника, дающая одинаковую
работу ИК-решателей всех трех сочленений, чего мы и хотели добиться с помощью первого
метода. Но здесь нужно дополнительное управление «гибкостью» («flex») и «силой» («force»)
лодыжки и колена.
Чтобы рассчитать, как будет работать эта сборка, мы сделали простую и быструю проверку
сочленений, не заботясь о том, так ли это всё будет работать на настоящем скелете. На рисунке
изображен набросок NURBS-кривой ноги, используемой в скиннинге скелета (рис. 7.10). Проделав
это, мы можем наскоро анимировать, чтобы увидеть, не задерживается ли что-нибудь. Так же это
быстрый способ обнаружить неправильные или нестабильные действия сборки, так как
прошедшая скиннинг кривая отразит такие действия лучше, чем просто сочленения. Так же в
Maya запланировано смешивание ИК и ПК, и настал подходящий момент его опробовать.
Отметьте, что стопа не настроена, это просто проверка ноги.
Риггинг ноги свиньи
1. Для начала мы будем работать только с одной стороной, так что скройте сочленение
правой ноги (рис. 7.11).
2. Теперь сделайте дубликат левой ноги и переместите его назад, чтобы ноги не перекрывали
друг друга (рис. 7.12).
3. Удалите prxy-модель и сочленения ноги и пальцев, чтобы это выглядело как на рисунке
(рис. 7.13). Эта новая цепочка сочленений станет управляющей для оригинальной цепочки.
Раскрасьте ее в ярко-желтый. Теперь её хорошо видно, и вы будете знать, что желтые
сочленения принадлежат сборке, а не исходному скелету свиньи. С помощью инструмента
Prefix Hierarchy (Иерархия префиксов) мы назовем эту новую цепочку с префиксом ctrl_.
Это всего лишь еще один способ сохранить организацию файла, но вы можете
использовать любую другую схему присваивания имен (рис. 7.14).

Врезка. Раздел Notes (Заметки) в Attribute Editor поможет в создании


сборки. В нем легко хранить заметки и подробности риггинга объектов в
независимой от названия форме, так же при необходимости, можно
экспортировать эти заметки в отдельный файл с помощью Mel-сценариев.
Вы также можете использовать заметки для хранения собственных данных
для игр. Эквивалент Notes в Max –User Properties (Пользовательские
Настройки). Этим свойством обладают все объекты.

@Рис. 7.10. Быстрый тест ноги

@Рис. 7.11. Скелет и модель приготовлены для риггинга

@Рис. 7.12. Дублированная нога

@Рис. 7.13. Дублированная нога сдвинута назад

@Рис. 7.14. Сборочная нога окрашена, добавлены заметки

4. Теперь мы добавим наш первый IK Handle в скелет ctrl от верхнего сочленения до


нижнего. Назовем его ik_fullLeg_L и запомним, что «эффектор» (effector), созданный
вместе с манипулятором, тоже нужно назвать. Переименуйте его в ef_fullLeg_L (рис. 7.15 и
7.16).
5. Теперь добавьте IK манипулятор в исходную ногу от upLeg_L до середины ноги и еще
один от foot_L до лодыжки модели, сочленения ball_L. Назовите их как раньше,
ef_имясочленения_L и ik_имясочленения_L (рис. 7.17).
6. Привяжите ногу ctrl к исходной ноге, чтобы можно было соединить их вместе. Также вы
должны привязать манипулятор ik_fullLeg_L к оригинальному положению (ball_L) (рис.
7.18).

@Рис. 7.15. ИК целой ноги

@Рис. 7.16. Переименованные элементы ИК и эффекторы

@Рис. 7.17. Еще две цепочки ИК дадут вам дополнительное управление ногой

@Рис. 7.18. Дублированная нога прикрепляется обратно к бедру

7. Подчините ik_lowLeg_L сочленению ctrl_lowLeg_L, а ik_foot_L – сочленению ctrl_foot_L с


помощью подчинения drag-and-drop в Outliner. После этого манипуляторы станут
желтыми. Это означает, что они под правильными сочленениями. Проверьте, выделив и
переместив ik_fullLeg_L; два скелета должны двигаться вместе (рис. 7.19). Отмените
действие, чтобы вернуть ногу в исходное положение.

@Рис. 7.19. Проверка ИК новой ноги

Чтобы наш риг как можно дольше оставался обнуленным, мы сгруппируем IK манипуляторы
так, чтобы подготовить их к анимации и заморозке трансформаций. Не забудьте сначала
подчинить/создать группу для них перед тем, как заморозить трансформации, чтобы они не
разморозились, если вы снова сделаете их дочерними чему-нибудь, перед тем как Вы измените
пространство, в котором они были обнулены.
1. Выделите ik_foot_L и заморозьте трансформации, чтобы они были на нуле.
2. Выделите ik_lowLeg_L и сгруппируйте. Точка опоры группы будет находиться в месте
нахождения родительского объекта ИК-манипулятора, но нам нужно переместить ее к
лодыжке (рис. 7.20 и 7.21).

@Рис. 7.20. Сгруппированный ИК-манипулятор

@Рис. 7.21. Правильное положение центральной точки группового узла force


3. Переименуйте эту группу в ctrl_force_lowLeg_L, и она станет управляющей для изменения
силы (взято у Майка Иснера (Mike Isner)), как только мы немного погодя добавим в нее
элемент управления с помощью нашей хитрости подчинения формы.
4. Снова выделите ik_lowLeg_L и заморозьте его трансформации.
5. Последнее, что нужно сделать, – проверить, локальная ось вращения ctrl_force_lowLeg_L
установлена так, что положительное вращение Z направлено вперед и совпадает с
остальными частями сборки. Выделите ctrl_force_lowLeg_L и отобразите его ЛОВ. После
этого выделите и согласованно вращайте ЛОВ (привязка вращения (rotation snap on)) до
тех пор, пока ЛОВ не повернутся на 180º вокруг X.
6. То же самое можно сделать с одной лишь помощью Attribute Editor. Сначала установите
атрибут Rotate Axis (Вращение оси) на -180 по X. Потом установите атрибут Rotate X
(Вращение по X) на 180. Если вы теперь проверите вращение, то увидите, что оно все еще
вызывает отрицательные вращения, но это легко исправить, установив Rotate Order
(Порядок вращения) ZYX, а не XYZ. Это сработает, потому что мы верно направили ЛОВ;
нам лишь осталось изменить то, как матрица вращения соединяет вместе Эйлеровы $$ От
термина «Эйлерово вращение» - обозначающего метод специфического угла вращения по
осям X Y Z – Прим ред. $$ каналы чтобы получить положительное значение вращения по
Z. На рисунке показаны окончательные настройки ctrl_force_lowLeg_L (рис. 7.22).

@Рис. 7.22. Окончательные настройки, включая порядок вращения и Rotate Axis.

Обнуление управляющих элементов


Если вас беспокоит, что поворот на 180 после того, как его зафиксировали и спрятали, остался
видимым, то знайте, что это не имеет никаких побочных эффектов. Но давайте рассмотрим еще
два способа решения этой проблемы:
1. Первый способ – сгруппировать ctrl_force_lowLeg_L и назвать группу
ctrl_force_lowLeg_Zero_L. Она пригодится для ориентации и обнуления настоящих
объектов управления.
2. Поверните ctrl_force_lowLeg_ Zero_L на 180º по X и убедитесь, что и Rotation, и Rotate
Axis дочерней ей ctrl_force_lowLeg_L теперь обнулены. На этот раз порядок вращения
может быть оставлен XYZ. Продолжайте работу с ИК-манипулятором и проверьте
также его обнуление. Если вы повернете ctrl_force_lowLeg_L по Z в положительном
направлении, то нога должна согнуться (рис. 7.23).
3. Второй способ – использовать отдельное сочленение. Используя сочленение в качестве
родительского объекта ik_lowLeg_L, вместо обычной группы, вы сможете использовать
Rotate Axis и Joint Orient и зафиксировать Z так, чтобы ее повороты были
положительны, а значения вращений оставались нулевыми. При этом Rotate Axis
установлено на 180, Joint Orient – на -180, а Rotate Order не тронут. Так мы его и
оставим, потому что нужно рассчитать меньшее количество узлов.

@Рис. 7.23. Положительное вращение контроллеров по оси Z, так же как и в ПК скелете.

После того, как вы определитесь с желаемым способом управления атрибутом force, установите
пределы вращения, чтобы контроллер силы не мог повернуть ногу за точку отрыва от цепочки
другой ноги. Для этого установите Rotation Limit (Предел вращения)- Min: -30 и Max: 45. Вы
можете уменьшить или увеличить эти значения так, как вам нужно, но эти значения так же хорошо
подходят, предохраняя ногу от крушения, в то же время давая широкий круг движений.
1. Мы сгруппируем контроллер ik_fullLeg_L с самим собой, подгоним точку опоры так,
чтобы она совпадала с нахождением ИК-манипулятора, а потом заморозим
перемещения группы и ИК-манипулятора.
2. Назовем эту новую группу ik_fullLeg_Zero_L.
3. Теперь спрячем ногу ctrl, пока не закончим риг стопы. Создавая контрольные формы
стопы, мы также сделаем контрольную форму узла force.

Врезка. Возможно, вы заметили, что мы пока ничего не заблокировали. Мы


оставим это до следующего прохода, зная, что значительные изменения
или отладка не потребуются, и не будем тратить время на
разблокировку/отображение скрытого, когда находясь посреди процесса
построения сборки. Еще одно преимущество ожидания окончания риггинга в
том, что можно сохранить или записать в Mel блокировку и скрытие всех
атрибутов рига, благодаря чему вы сможете быстро отменить или
повторить действие в течение процесса риггинга.

Риггинг ступней свиньи и узлы точек опоры


В этом разделе мы рассмотрим реверсную стопу, которую все знают и любят, но наш подход
немного отличается от того, как обычно делается стандартная реверсная стопа.
1. Как и в любой другой реверсной стопе, нам нужно добавить несколько ИК-
манипуляторов сочленениям стопы. Назовем их ik_toe_L и ik_toeTip_L и точно также
поступим с конечными эффекторами (end effectors) (такие же имена, но вначале ef
вместо ik).
2. Теперь сгруппируем каждый новый ИК-манипулятор и назовем новые группы так же,
как раньше нулевые узлы, например, ik_toe_Zero_L. Привяжите точку опоры группы к
месту соответствующего ИК-манипулятора.
3. В нашем случае кончик пальца будет в основании модели пальца, а не там, где
находится ИК-манипулятор, из-за положения сочленения кончика пальца и угла стопы
(рис. 7.24).

@Рис. 7.24. Положение точки опоры пальца ноги

Врезка. Благодаря этому отдельному слою сборки, нам не приходится


подстраивать положение скелета, чтобы элементы контроля анимации
находились в нужных для их корректной работы местах. Если бы нам
пришлось сдвинуть скелет, то синхронизация сборочного скелета со
скелетом для скиннинга нарушилась бы, что привело бы к проблемам в
будущем. Синронизация также может нарушиться из-за изменений в модели
после создания скелета или изначально неправильного положения модели
или сочленений. В условиях нелинейного процесса производства часть
работы каждого технического директора по персонажам – заниматься
такими изменениями. Создание сборок с отдельными слоями, работающими
со скелетами, позволяет вносить небольшие изменения, не повреждая всю
сборку.

В большинстве руководств по реверсной стопе говорится только о настройках управления


основными шаговыми движениями, не позволяющими добавить дополнительной гибкости,
добавление которой делает управление анимацией более комплексным и создает много
дополнительных опций.
Стопа позволяет совершать много движений и так же является базой персонажа. Наблюдая за
3D персонажами, вы можете заметить, что у большинства из них стопа не двигается или не
взаимодействует с поверхностью земли как следует. За это отвечают преимущественно
аниматоры, но именно Вы должны создать сборку, позволяющую совершать более сложные
движения.
1. Создайте родительские связи между ИК-группами, чтобы сначала сделать нормальную
иерархию реверсной стопы, а потом по необходимости расширить управление
дополнительными группами (точками опоры).
2. Возьмите ik_fullLeg_Zero_L и подчините его ik_toe_Zero_L.
3. Подчините ik_toe_Zero_L элементу ik_toeTip_Zero_L, чтобы получить иерархию как на
рисунке (рис. 7.25).
Это позволяет стопе перекатываться вперед, но не без пятки. Мы сгруппируем
ik_toeTip_Zero_L и поместим точку опоры этой группы на место нахождения пятки в модели (рис.
7.26).

@Рис. 7.25. Заключительное подчинение ИК стопы


@Рис. 7.26. Положение точки опоры пятки

4. Назовем ее ik_heel_Zero_L. (Несмотря на то, что она не управляет непосредственно ИК-


манипулятором, она контролирует все манипуляторы, так что для сохранения
оговоренной схемы присваивания имен мы назовем ее ik_heel.) Так как мы выбрали
предпочтительную схему вращения скелета персонажа, нужно убедиться, что наши
управляющие элементы системы ИК работают таким же образом и на вращении. Мы
хотим, чтобы у аниматора была четкая схема вращения любого элемента управления,
который может вращаться, так что мы должны помнить об этом и проверять, что у
таких элементов, как ctrl_foot_L есть схема вращения, которая соответствует вращению
скелета в ПК. В нашем случае положительное вращение Z направлено вперед.
5. Применяя для правильной ориентации вращения такие же техники, как в случае с
ctrl_force_lowLeg_L, вы создадите управление стопой с сочленением. Создайте новое
сочленение и установите его в начальной точке 0 0 0. Назовите его ctrl_foot_L.
6. Сгруппируйте его и назовите группу ctrl_foot_Zero_L. Привяжите ее к местоположению
лодыжки. Если вы заморозите перемещения узлов групп, то они обнулятся, но при этом
обнуление передастся дочерним сочленениям, а этого вам не нужно. Вам нужно, чтобы
они обе были на нуле.
7. Чтобы основные перемещения сочленения после того, как вы переместите его к лодыжке,
были нулевыми, вновь отобразите в Channel Control (Управление каналами) атрибуты
rotate pivot translate родительской группы ctrl_foot_Zero_L. Скопируйте значение
перемещения в соответствующую графу rotate pivot translate и обнулите атрибут
translate. Теперь сочленение будет на нуле и в нужном месте. Просто спрячьте или
заблокируйте значения перемещения точки опоры, когда закончите, и сделайте пометку
в Attribute Editor Notes (Заметки в редакторе атрибутов), что это место, где
производится перемещение объекта. Окончательный результат таков: управляющий
элемент стопы обнулен, и его положение совпадает с ПК сочленением. Это пригодится
потом, когда вы захотите перенести значения вращения от ПК-сборки к ИК-сборке,
также это позволит вам зеркально отразить контроллеры вращения ИК-сборки.
Единственное различие в том, что управление ориентировано на прямые углы, так что
значение X не выровнено по сочленению, как у настоящего сочленения лодыжки.
8. Нам нужно сделать управляющий манипулятор для этой стопы. Он может быть любой
формы. Мы используем сферическую форму: три NURBS-круга дочерние ctrl_foot_L.
Вместо этого можно взять кривую в форме стопы, стоящей на земле.
9. Назовите каждую кривую ctrl_Foot_L_Shape (рис. 7.27). Они станут родителем для
ik_heel_Zero_L. Лучше, чтобы управляющий элемент стопы располагался на лодыжке,
полностью контролируя стопу, когда она над землей, и контролируя другие точки
опоры, находясь в контакте с землей. В других персонажных сборках главное
управление стопой часто расположено на подъеме свода стопы, а это может вызвать
нежелательные или дополнительные движения, которые нужно анимировать по-
другому.
10. Наконец, установите порядок вращения на ZYX. Он стабильнее при вращении, потому
что значение X потом будет управлять скручиванием ноги, а это поможет удержать
колено он непредвиденного скручивания из-за вращений шарнирного соединения
(gimbal).

@Рис. 7.27. Новые контрольные формы, подчиненные управлению стопы

Подробнее о реверсной стопе


Следующие шаги и всю иерархию стопы можно упростить, используя возможность анимировать
узловую точку опоры, но для совместимости программного обеспечения с потребностями
риггинга и для большей гибкости в смешивании поз стопы мы настроим их как обычно, то есть
каждая точка опоры будет узлом иерархии.
1. Во-первых, давайте добавим дополнительные узлы, которые нужны для движения стопы
с боку на бок. Нам нужны дополнительные узлы, чтобы повернуть стопу, не нарушая
связи с ее остальными движениями.
2. Выделите ik_toe_Zero_L и дважды его сгруппируйте. Назовите эти две группы
instep_pvt_foot_L и blade_pvt_foot_L (рис. 7.28). Главная точка вращения этих двух
объектов должна находиться около подъема свода стопы, так как именно там стопа все
время соприкасается с поверхностью. Разместите здесь точки опоры двух узлов,
blade_pvt_foot_L – снаружи стопы, а instep_pvt_foot_L – внутри (рис. 7.29). Когда
расположение точек вас удовлетворит, и покрутите их, чтобы убедиться, что они
качают стопу из стороны в сторону. На этом этапе в стопе много элементов управления,
которые, придавая ей большую гибкость, заставляют аниматоров работать со слишком
большим количеством узлов и управлять их ключевыми кадрами. Чтобы исправить это,
мы воспользуемся идеями Джейсона Осипы - упростим интерфейс, создав
джойстиковое управление вращателем стопы (foot roller joystick control).

@Рис. 7.28. Точки опоры в иерархии сборки стопы

@Рис. 7.29. Центральные точки для края и ребра стопы

3. Создайте локатор или нулевой объект, прикрепите его к сочленению лодыжки и


заморозьте его перемещения. Назовите его ctrl_foot_roller_L. Это будет наш
управляющий узел (рис. 7.30).

@Рис. 7.30. Управление вращателем

4. Для управления всеми узлами вращения стопы от перемещения элемента, управляющего


вращателем стопы, мы применим Set Driving Keys. Откройте окно Set Driven Key
(Установить управляемый ключ) и возьмите в качестве контроллера ctrl_foot_roller_L.
Выделите узлы поворота стопы (рис. 7.31) и загрузите их как управляемые.
Перемещение Z у ctrl_foot_roller_L будет управлять движением подъема свода стопы
вперед и назад; поворот X – других управляемых объектов.

Врезка. В Max и XSI имеют одинаковую возможность управления атрибутами


других объектов через кривые; в Max они называются контроллерами-
стабилизаторами (reactor controllers), но требуют больше работы при
настройке. В Max 7 интерфейс усовершенствован, а работа со
стабилизаторами теперь налажена лучше.

@Рис. 7.31. Управляемые ключи стопы

5. Первый объект, которым вы будете управлять, – ik_toe_Zero_L. Установите ключ так,


чтобы при сдвиге контроллера стопы вперед объект поворачивался, изгибая ногу в
подъеме и затем в пальцах. Вы можете сделать такие настройки, чтобы стопа
изгибалась как угодно сильно и чтобы она реагировала на какой хотите положительный
или отрицательный сдвиг ctrl_foot_roller_L по Z. Сохраняйте небольшое и
целочисленное расстояние, чтобы было легко управлять и редактировать. В этом случае
значение 0.5 для Z у ctrl_foot_roller_L будет поворачивать подъем свода стопы вперед,
примерно на 50º по X. При сгибе стопы это можно легко отрегулировать с помощью
кривых SDK $$ Под SDK подразумевается Set Driven Key – прим ред. $$. Настройте
стопу, чтобы подъем выглядел так, как вам хочется.
6. Теперь свяжите перемещение по X с вращением по Z instep_pvt_foot_L и
blade_pvt_foot_L, чтобы нога наклонялась из стороны в сторону. Загрузите
ctrl_foot_roller_L, instep_pvt_foot_L и blade_pvt_foot_L в окно Set Driven Key.
7. Установите первый ключ с нулевыми значениями, затем установите ctrl_foot_roller_L на
-1 по X, поверните instep_pvt_foot_L на 55º и установите ключ. Точно также поступите с
blade_pvt_foot_L, на этот раз со значениями 1 и -55.
8. Подчините ctrl_foot_roller_L ctrl_foot_L. Вы увидите, что стопа скачет из-за значений
перемещения, примененных к управлению вращателем; чтобы исправить это, просто
заморозьте трансформации элемента, управляющего вращателем, и сдвиг исправится.
9. Теперь с помощью пределов движения в Channel Box ограничьте движение контроллера
до 11 юнит сетки (рис. 7.32). Также отметьте, что мы установили предел для Y на 0;
это то, что добавляет компоненту сборки дополнительный защитный слой. Простым
блокированием и скрытием атрибутов этого не достичь.

Врезка. В 3DS Max пределы – единственный способ убедиться, что объекты


заблокированы, потому что блокирование и скрытие атрибутов там не
предусмотрено. К сожалению, если вы не используете кости, пределы в
Max только включают/выключают блокировку или имеют нулевое значение, и
вы не можете устанавливать максимальное и минимальное значения.
Классный трюк с maxscript: с помощью скрипта можно запросить данные о
пределах объекта, и использовать эти данные для управления типом
ключевых кадров объекта. Например, если пределы перемещения и
масштабирования объекта включены, то можно установить ключевые кадры
только для вращения.

@Рис. 7.32. Ограничение перемещения ctrl_foot_roller_L

10. Теперь вы получили возможность перемещать контроллер по XZ как угодно в пределах


квадратной области 11, смешивая основные движения стопы. Это будет нормально
работать почти с любой анимацией, но мы должны дать аниматорам возможность
управлять сборкой, не спрашивая технического директора по персонажам об
изменениях и не копаясь в сборке самостоятельно, чтобы исправить что-нибудь. Мы
применим более продвинутые соединения и узлы, чтобы быстро изменять значения
текущей сборки и добавлять дополнительные элементы управления, которые могут
понадобиться для остальной части стопы.
С помощью узла multiplyDivide вы создадите возможность увеличить степень влияния
расстояния от элемента, управляющего вращателем, на значение вращения стопы во
всех направлениях. Чтобы сократить количество узлов, создайте только два узла
multiplyDivide, а потом используйте X,Y,Z каналы обоих узлов, чтобы задать шесть
независимых каналов, не создавая шесть отдельных узлов.
11. Возьмите выходные данные кривой SDK и отобразите их в input1x узла multiplyDivide.
Потом возьмите выходные данные и отошлите их в instep_pvt_foot_L. Продолжайте с
другими узлами SDK и другими каналами до установления соединений (рис. 7.33 и
7.34). Причина, по которой мы устанавливаем соединение выходных данных от SDK, а
не до SDK, такова: мы хотим увеличить конечный результат SDK, а не изменить
значение, которое SDK берет от перемещения элементов, управляющих вращателем.

@Рис. 7.33. Чтение выходных данных узла multiplyDivide

@Рис. 7.34. Окончательные соединения узла multiplyDivide

@Рис. 7.35. Заданный атрибут узла формы управляющих элементов

12. Создайте атрибут rollAmp со значением по умолчанию, равным 1, в ctrl_foot_roller_L –


в shape-узле элемента управления. Это упрощает доступ, но при этом вне атрибутов,
для которых мы хотим установить ключевые кадры (рис. 7.35).
13. Теперь соедините этот атрибут с input2 узлов multiplyDivide, чтобы иметь возможность
менять значение одного атрибута и управлять степенью поворота. Меньшие значения
заставляют стопу двигаться слабее, позволяя в случае необходимости уменьшить
диапазон вращения.
14. Следующий блок ручного управления, который нам нужен, позволяет во время
вращения ноги переносить анимацию на пальцы, при остановке свода стопы. И снова,
это дополнительное управление продолжит путь shape-узла и не взаимодействует с
главными ключевыми кадрами управления анимацией.
15. Добавьте новый атрибут под названием rollBallAdjust с начальным значением 1, как и
раньше.
16. С помощью команды Mel createNode multDoubleLinear создайте узел, который
подгонит поворот между движением пальцев и свода стопы.
17. Затем, снова применив команду Mel, соедините translateZ контроллера вращения и
input1 у multiDoubleLinear:
connectAttr ctrl_foot_roller_L.translateZ multDoubleLinear1.input1;
18. Теперь сделайте то же самое для ctrl_foot_roller_LShape.rollBallAdust, соединив его
выходные данные с input2 у multiDoubleLinear:
connectAttr ctrl_foot_roller_LShape.rollBallAdust multDoubleLinear1.input2;
19. И наконец, соедините выходные данные multiDoubleLinear с ik_toe_Zero_L_Rotate по X
узла SDK. На рисунке (рис. 7.36) показана окончательная схема всех соединений.
Обратите внимание, что в этот раз мы добавили узел до SDK, потому что в нашем
случае нужно сохранить такое же движение, что и у SDK, но при этом мы хотим
контролировать время этого движения.

@Рис. 7.36. Схема узлов управления движением стопы

Врезка. Следующие шаги можно применить к другому локатору и настроить


управление стопой как управление вращателем стопы, но в этом случае
нам нужно оставить возможность установления ключевых кадров для как
можно меньшего количества элементов управления. Основная анимация
стопы возможна без обращения к Channel Box, но мы всё-таки
устанавливаем в Channel Box атрибуты, к которым обращаемся реже. Они
доступны, но не всегда используются в анимации.

20. Есть еще несколько управляющих элементов стопы, которые мы добавим, чтобы
сделать возможными скручивающие движения, такие как нестандартное смещение или
просто смещение точки опоры свода стопы. И еще мы добавим точку опопры пятки и
управление пальцами ног.
21. Создайте три новых собственных атрибута для контроллера вращения стопы. Первым
атрибутом будет toeTap, предназначенный для анимации движения сочленения пальцев
вверх-вниз; затем добавьте другие два: ballTwist и heelTwist. Когда они будут
добавлены в ctrl_fool_roller_L, прицепите их к соответствующим группам, чтобы
управлять вращением.
22. Сначала выбирите ik_toeTip_L и сгруппируйте. Назовите группу toe_pvt_L и установите
точку опоры для этой группы на подъеме свода стопы (рис. 7.37).
23. Теперь соедините атрибут toeTap c вращением toe_pvt_L по X. Это действие соединит
два атрибута, но с одинаковым отображением значения, что сделает атрибут
замедляющим поворот ноги. Можно настроить узел unitConversion, который Maya
автоматически вставляет между атрибутом и каналом вращения, и увеличить его
значение, чтобы меньше изменить атрибут toeTap и сильнее воздействовать на палец
ноги.

@Рис. 7.37. Центральная точка пальцев в действии

Выделите узел toe_pvt_L и отобразите соединения в Hypergraph. Вы увидите узел


unitConversion. Выделите его и откройте Редактор Атрибутов. Коэффициент конверсии
(conversion factor) должен равняться 0,018. Измените его на 0,5, чтобы аниматор мог
меньше двигать мышью, получая тот же самый результат. Другой шаг – убедиться, что
наши положительные значения анимации все еще работают. Положительные числа
должны заставлять пальцы вращаться вверх, но сейчас они вращаются вниз. Чтобы
исправить это, поместите знак «-» перед 0,5.
Врезка. Вместо реверсного узла (reverse node) можно использовать узел
unitConversion и не мучаться из-за сбоя значения, характерного для
реверсного узла. В Maya для работы с соединениями это применяется
повсеместно, и технический директор по персонажам должен извлечь из
этого выгоду для своих сборок.

Займитесь соединением других атрибутов: ballTwist и ik_toeTip_Zero_L – rotateY, а также


heelTwist и ik_heel_Zero_L.
Вы можете настроить столько слоев управления, сколько захочется и понадобится аниматорам,
и, если иерархия устойчива и вы понимаете, как дополнять сборку с помощью новых групповых
узлов или путем применения математических узлов (math nodes) к слоям при сдвигах, то вы
сможете создать очень быструю, стабильную и гибкую сборку стопы или точно так же любой
части персонажной сборки. Постарайтесь сами создать новое управление сборкой стопы, которое
работало бы поверх текущей системы. Можно сделать все атрибуты индивидуальными, как в
других сборках ступней, и с помощью узла plusMinusAverage анимировать сборку только с этими
атрибутами, при этом похожий на джойстик контроллер вращения так же будет работать (рис.
7.38).

Врезка. Чтобы избежать дополнительных узлов, постарайтесь расставлять


их сразу после узлов multiplyDivide, чтобы соединение устанавливалось
между узлами multiplyDivide и unitConversion. Это исключит
дополнительные узлы конверсии, размещенные, когда вам было нужно
подсоединить узел plusMinusAverage между узлом unitConversion и
последним узлом вращения, как, например, toe_pvtP_L.

@Рис. 7.38. Дополнительные атрибуты, встраиваемые в узлы plusMinusAverage, для


управления по слоям

Пальцы ног и очистка


До сих пор мы имели дело только с тем, что мы называем грубым управлением (coarse controls)
ноги стопы: которые нужны нам для предварительной анимации и постановки поз. Что нам нужно
сделать теперь – настроить управление сочленениями пальцев ног, чтобы добиться более тонкого
управления.
Чтобы закончить сборку этой стопы, мы добавим поверх уже готового управления ПК
несколько автоматических элементов управления пальцами, снова пытаясь по возможности
сохранить положение ключевых кадров и стремясь к гибкости для аниматора. Нам также нужно
добавить к ctrl_foot_roller shape-узел, который легко выделять (вместо обычного крестообразного
локатора), и добавить управляющий объект для узла сгиба или напряжения ноги, который мы уже
сделали ранее.
1. Для начала давайте сделаем быстрое управление узлом сгиба ноги. Вам решать, как вы
будете управлять им, либо с помощью выделяемого элемента в сцене, либо
собственным атрибутом. Мы применим заданный атрибут элемента управления стопы
(рис. 7.39).
2. Затем создайте более удобную форму выделения для локатора вращателя стопы. Для
этого элемента хорошо работает ориентация подогнанной по размеру управляющей
формы из кометовских сценариев (рис. 7.40). Дополнительные атрибуты, которые мы
установили для shape-узла, будут скрыты. Это неплохо, потому что они нужны скорее
техническому директору, чем аниматору. Просто вернитесь и спрячьте оригинальный
локатор. Для ясности назовите его shape-узел xtraAttrs.
3. Чтобы управлять пальцами ног, используйте SDK, соединенные с атрибутами пальцев toe
curl и scrunch. Из-за поворотов сочленений каналы в ПК должны оставаться
незаблокированными. Вам нужно сделать с этими сочленениями что-то еще, чтобы они
заработали с заданными атрибутами.
4. Создайте второй слой сочленений пальцев ног, чтобы установить управление SDK.
Скопируйте цепочку bigToe и удалите геометрию сочленений.
5. Создайте суффикс _Layer новой цепочке сочленений. Чтобы ускорить дело,
воспользуйтесь cometRename.mel или похожим сценарием переименования.
6. Подчините сочленения пальцев так, чтобы каждому соответствовало управляющее
сочленение второго слоя. Над сочленениями добавляется слой, который не дает SDK
заблоркировать непосредственно сочленения ПК. На рисунке (рис. 7.41) показаны
сочленения нового слоя в правильной иерархии и с правильными именами.

@Рис. 7.39. Атрибут гибкости ноги

@Рис. 7.40. Переименуйте shape-узел; это необходимо для вторичных атрибутов

@Рис. 7.41. Сочленения пальцев по слоям

7. Теперь создайте собственные атрибуты узла ctrl_foot_L и установите управляемый ключ


с изогнутой формой, которая вас устраивает. Помните, что лучше дать контроллеру
возможность переворачивать сочленения, а аниматору решать, что не подойдет для
позы, чем наложить на сборку искусственные ограничения. То же самое проделайте с
остальными пальцами. На рисунке (рис. 7.42) показана окончательная сборка с
управлением пальцами.
8. Прежде, чем вы продолжите, давайте быстро вычистим Outliner. Выберите pgSkeleton и
ctrl_foot_Zero_L и сделайте их дочерними новой управляющей кривой под названием
pgWorld. Этот контроллер будет выступать в роли мирового пространства для всех
контроллеров вашего персонажа. Он позволит вам перемещать всю сборку целиком в
любую область сцены, при это сохраняя нулевые значения (рис. 7.43).

@Рис. 7.42. Окончательные атрибуты пальцев

@Рис. 7.43. Быстрое упорядочение Схемы Сцены с помощью pgWorld

Стопа и нога, скручивание ноги, централизация ИК/ПК


контроллеров
Управление коленом этой ноги будет связано с вращением ctrl_foot_L, а атрибут смещения
позволит аниматору анимировать скручивание ноги на высшем уровне. Есть множество способов
соединить объекты, но в этом случае управляемые ключи позволяют сделать это быстрее, так что
мы можем установить два атрибута, управляющих скручиванием ИК:
1. Чтобы убедиться, что скручивание и поворот предусматривают полное вращение,
установите вращение ctrl_fool_L по X на и на плюс, и на минус 360. Точно так же
поступите со скручиванием ik_fullLeg_L в ИК и установите для него SDK.
2. Затем добавьте в ctrl_foot_L атрибут kneeOffset и свяжите его значение со скручиванием
ik_fullLeg_L. Снова установите полное вращение, но отобразите значение атрибута
между -10 и 10. Для устойчивости/слаженности сделайте так, чтобы положительное
значение вашего атрибута поворачивало ногу в сторону от тела. (Можно установить
более широкий диапазон, чтобы реакция была не такой быстрой, или удерживать Ctrl
при перетаскивании средней кнопкой мыши. Так вы добьетесь более тонкого контроля
над значениями.)
3. Наконец, нам нужно установить переключение ИК/ПК для ноги и сделать так, чтобы в
сочленениях ПК была опция принимать или не принимать вращение от тела. (Если вы
были на мастер-классе Alias по сверхреалистичному риггингу персонажей, то эта идея о
переключении чувствительности ПК для вас не нова.)
4. Установки ИК/ПК по умолчанию работают в Maya отлично, но они ограничены
отдельными ИК манипуляторами, и только в одной цепочке, как, например, в руке. В
ноге более сложная конструкция из ИК-манипуляторов и цепочек сочленений, так что
нам всё ещё надо позаботиться о ИК/ПК контроллерах, используя ИК/ПК смешивание
не требующее использование стандартного скелета с ограничителями.
5. Сперва создайте в ctrl_foot_L отдельный атрибут IkFk со значением по умолчанию 1 и
диапазоном от 0 до 1. Соедините его так, чтобы он управлял всеми ИК-манипуляторами
на ноге и стопе, кроме ik_fullLeg_L. Он управляет ctrl_leg и все время будет в ИК.
6. Теперь выделите все ИК-манипуляторы в сборке ноги и отключите атрибут привязки
(snap attribute), так чтобы они не перепрыгнули в конец цепочки сочленений, которой
управляют, оторвавшись от объекта управления и вызвав смещение. Проверьте,
работает ли это, установив атрибут IkFk на ноль. Тогда вы сможете повернуть ногу,
выделив и затем повернув каркас.
Переключение ПК-наследия
Другой шаг, который мы должны сделать, чтобы создать разбитую иерархию ноги, заключается в
смешивании восприятия вращения ее родителя и глобального узла.
1. Просто дублируйте сочленение upleg_L и удалите дочерние ему объекты. После этого
назовите новое сочленение ctrl_upLeg_ori_L. Именно оно будет управлять передачей
вращения ноге в ПК от остального тела.
2. Снова дублируйте новое сочленение и назовите его ctrl_upLeg_ori_Local_L.
3. Дублируйте его снова и назовите ctrl_upLeg_World_ori_L. Подчините его узлу pgSkeleton
и сгруппируйте. Назовите новую группу fkWorldOri_GRP. Эта новая группа будет
держать все дублированные сочленения, к которым будут прикреплены другие ori
сочленения , когда мы их создадим.
4. Подчините upleg_L сочленению ctrl_upLeg_ori_L.
5. Прикрепите ctrl_upLeg_ori_L orient-ограченичителем к глобальному и локальному
сочленениям. Установите interp type ограничителя на самый короткий, чтобы
предотвратить переворот ноги.
Теперь, когда вы настроили веса между локальным и глобальными настройками, ПК-
сочленение либо унаследует движение родительского объекта, либо сохранит свою ориентацию в
глобальном пространстве. И снова, нам нужно всего лишь сделать отключение/включение этой
опции легким для аниматора.
Продолжая исследовать, важность utility-узлов в сборке, мы применим реверсный узел, чтобы
установить переключаемое значение контроллера веса orient-ограничителя:
1. Создайте локатор и назовите его ctrl_fkOri. Этот узел, в конечном счете, будет хранить
все созданные вами атрибуты для переключения ПК-наследования всего тела. Добавьте
в shape-узел этого локатора свой атрибут. Назовите его legL и задайте по умолчанию
нулевое значение.
2. Теперь используйте всевозможные хитрости с родительский объектом, чтобы создать
что-то вроде отраженного shape-узла от локатора, в нашем случае, upleg_L, так что
когда аниматор выберет ногу для анимации в ПК, он сможет просто установить
значение наследования оттуда, без перепрыгивания на другой объект для задания
параметров.
3. Мы воспользуемся командой Mel parent -add -shape ctrl_fkOriShape
upLeg_L, чтобы прикрепить shape-узел локатора к ноге.
4. Теперь соедините атрибут legL c ctrl_upLeg_ori_World_LW0. Затем соедините выходные
данные legL с реверсным узлом, а реверсный узел – с ctrl_upLeg_ori_local_LW1.
Всё это работает используя принципы работы персонажного узла в Maya, где вы создаете в
одном месте набор атрибутов, работающих по всей сборке.

@Рис. 7.44. Объект содержащий отраженные атрибуты

Врезка. Идея отраженных атрибутов применяется не только в Maya. В Max


она очень хорошо работает с отраженными модификаторами и
контроллерами. Наслаивая пустые модификаторы и установливая в
различных модификаторах различные атрибуты, вы помогаете
контролировать - чему можно устанавливать ключевые кадры, а чему нет,
и это также помогает аниматорам переходить от грубого управления к
точному и не тонуть в его бесконечных слайдерах.
В XSI тоже есть уникальные способы выстраивания атрибутов и их
группировки для редактирования во вьюпорте, основанные на объектах,
которые вы выделяете, при отсутствии необходимости устанавливать
атрибуты прямо на них, чтобы отобразить их.

Зеркальное отражение контроллеров. Риггинг противоположной


стороны тела
Так как вся эта сборка только для одной стороны тела, в данном случае, левой, то создание сборки
правой ноги подразумевает тот же самый алгоритм с некоторыми изменениями, касающимися
вещей типа ориентацией контроллеров, так что поведение ИК-сборки отражается так же, как и
ПК-сборки. Мы не будем вновь проходить шаг за шагом весь процесс риггинга другой ноги, а
просто выделим новые способы ускорения процесса. Вот один из них: мы применяли сочленения
для основных контролирующих объектов, и поэтому их можно отразить с помощью инструмента
Mirror Joint (Отразить сочленение), что даст вам возможность отразить поведение, позволяя
контроллерам ИК при вращениях действовать отраженным манером:
1. С помощью инструмента Mirror Joint отразите ctrl_foot_L. Этот инструмент отразит и
ориентацию. Потом вам нужно настроить ось вращения, направленную так, чтобы
значения по Z были положительными (рис. 7.45). В качестве бонуса под управление
попадают все узлы иерархии. Чтобы завершить настройку контроллеров правой стопы,
совершите следующие шаги.
2. Сгруппируйте ctrl_foot_R, назовите группу ctrl_foot_Zero_R, подчините ее pgSkeleton, и
совершите то же процесс с обнулением перемещений, как и раньше, используя
перемещение центральной точки вращения, с целью смещения и сохранения нулевых
значений всех контроллеров.
3. Выделите дочерние узлы и отобразите LRA, чтобы получить возможность заново
выровнять точки опоры контроллеров и заново привязать их к нужной области стопы.
4. Отразите управляющую ногу и удалите все дополнительные ИК-манипуляторы и
эффекторы в иерархии, которые были дублированы; их заменят новые ИК-
манипуляторы правой ноги. Добавьте ИК-манипуляторы к правой ноге, присвойте им
имена и подчините их соответствующим нулевым узлам.
5. Убедитесь, что все объекты переименованы в соответствии со стороной тела.
Исправляйте L на R (также и в скрытых узлах, таких как конечные эффекторы).

@Рис. 7.45. Первоначальное отражение контроллеров ноги

Настоящее бедствие при попытке отразить такую сборку, как эту, вручную – в том, что вам
приходится перестраивать все сети узлов и заново настраивать все соединения SDK, в том числе
для положений стопы. Это яркий пример случая, когда отведение некоторого времени на
написание скрипта для создания сборки или даже её отдельных компонентов обязательно
компенсируется позже, даже если вам нужно сделать сборку всего лишь одного персонажа. С
целью как практики, так и того, чтобы убедиться, что основные идеи риггинга ясны, мы
продолжим разрабатывать правую сторону сборки вручную.
На рисунке (рис. 7.46) показано текущее состояние сборки двух ступней: верхняя схема
показывает все соединения левой стопы, а нижняя – правой, без необходимого риггинга. К
счастью для нас, мы можно применить некоторые хитрости, такие как, дублирование большей
часть узлов левой стопы и пересоединение их на схеме правой стопы.
Чтобы процесс соединения наших атрибутов был изначально прост, мы соединим их также, как
в предыдущей главе, подключая каждый атрибут к нужному соединению. После этого мы
дублируем более сложную схему и соединим остальные компоненты сборки стопы:
1. Дублируйте ctrl_foot_L при настройке дублирования «Дублировать схему входящих
соединений» («Duplicate Input Graph»). Это действие приведет к копированию всех
соединений, включая наши SDK узлы.
2. Теперь вы можете подсоединить к этой схеме атрибуты ctrl_foot_L и удалить все узлы,
которые были дублированы после этого. Вам будет проще если вы сначала разберетесь
с входными данными, потому что с ними работает меньшее количество узлов. Затем
можно приступить к выходным данным схемы правой ноги, сочленений стопы и узлов.
3. В заключение заново подчините shape-узел ctrl_fkOri с помощью Mel-команды parent
-add -shape ctrl_fkOriShape upLegR, добавьте ему наш атрибут LegR и
установите соединения для переключения, как мы делали раньше.

@Рис. 7.46. Желанная окончательная схема стопы

Врезка. Вы можете продолжать использовать реверсный узел, пока у него


не закончатся входные и выходные данные, чтобы сохранить нумерацию
узлов и организацию соединений

4. Теперь, когда вы закончили с соединениями, разберитесь с дублированными объектами,


запустив File → Optimize Scene Size → Options (Файл → Оптимизировать размер
сцены → Опции) и отметив все пункты. Перед тем, как запустить это, сохраните файл,
просто на случай удаления чего-то, что вам нужно. Тогда вы сможете вернуть всё на
место.
5. На этом этапе побочный эффект риггинга ноги при помощи только атрибута
скручивания ИК заключается в том, что мы установили значения полярного вектора
(pole vector) ИК на 0 0 0, позволяя ИК свободно вращаться без переворотов. Проблема в
том, что поворот бедра или родительского сочленения заставляет ноги поворачиваться,
как если бы они управлялись полярными векторами ИК-манипуляторов. Мы исправим
это потом, когда создадим управление бедрами.
Рисунок 7.47 показывает окончательный набор отраженных контроллеров и иерархию, которая
должна вы должны получить, закончив.

@Рис. 7.47. Законченные контроллеры ноги

Плечи, руки и кисти


Лицо, кисти и руки – одни из самых выразительных части тела. Совместите эти части с широким
диапазоном движений плеч, и вы получите очень мощный инструмент коммуникации персонажа
(если вы удостоверитесь, что аниматоры смогут управлять этими частями тела). Есть несколько
базовых идей, которым должны соответствовать все сборки рук и кистей, чтобы осчастливить
аниматоров. Эти основные идеи не включают управление сжатием и растяжением рук, но это
можно добавить в конце риггинга.
Вот список существенных аспектов, которые составляют хорошую сборку руки:
 Переключение ИК/ПК;
 Отделение движения плеча от остального тела в ПК ;
 Легкий в управлении локтевой сустав;
 Управление запястьем, позволяющее сочетать глобальное и локальное наследуемое
вращение кисти, также как и плеча;
 Смешанное переключение ИК контроля между глобальным пространством, телом и
пространством перемещений верхней части туловища;
 Одно дополнительное смешанное пространство для вспомогательного управления кистью,
которое можно присоединить к любому объекту, такому как оружие;
 Автоматическая ключица под управлением аниматора, отключенная по умолчанию;
 Простое и гибкое управление пальцами рук;
 Управление основными положениями всей руки и переназначение для наилучшей
настройки
 Быстрый доступ к системе поз, позволяющий управлять положениями рук и сохранять их,
с целью переноса от одной руки к другой;
 легкий способ переключения между пространствами перемещений без прыжков и
перескоков, также с помощью встроенных в сборку скриптов, либо с использованием
полочной кнопки.
Врезка. При построении сборки симметричной части тела, такой как, к
примеру, руки, наилучшие варианты - построение каждого компонента
для обеих сторон, методом дублирования сборки (не очень много
хлопот), или же написать скрипт создания сборки и затем приспособить
скрипт к построению отраженной части. Скрипт все-таки лучше, но как
правило при коротких сроках построение обеих сторон сборки – лучший
выбор. В этом руководстве рассматривается построение сборки только
левой руки, но вы можете держать в уме оба варианта. Описанный в
руководстве порядок создания сборки не всегда лучше всего работает в
производстве.

Настройка руки очень похожа на риггинг ноги, так что большая часть повторяющихся сведений
не будет здесь приводиться подробно. Если у вас возникают проблемы, вернитесь за помощью в
раздел о ноге.
1. Начав с левой руки, добавьте ИК-манипулятор сочленению upArm_L до wrist_L и
назовите его ik_arm_L; потом сгруппируйте его и назовите группу ik_arm_Zero_L (рис.
7.48).

@Рис. 7.48. Сгруппированный ИК-манипулятор руки с присвоенным именем

2. Привяжите точку опоры от ее первоначального положения к положению ИК-


манипулятора, а затем заморозьте перемещения на манипуляторе ik_arm_L. Так же нам
нужно установить значения полярного вектора на 0 0 0. Спрячьте манипулятор, пока
работаете над другими частями руки.
3. С помощью кривых создайте объект, по форме напоминающий локатор, или примените
cometScripts для создания объекта. Это будет контроллер положения руки,
отображающий манипулятор выделения. Если вы используете такой способ вместо
кривой или другого типа объектов выделения, то риг будет настолько упорядоченным,
насколько возможно, и поскольку у него будет только одна основная функция –
перемещение руки, вам не придется делать так, чтобы она торчала каким-нибудь
особым образом. Мы просто хотим, чтобы выделение происходило легко. Постарайтесь
увидеть различие между контроллером, который только перемещает, и тем, который и
перемещает, и вращает.
4. Назовите его ctrl_arm_L и сгруппируйте. Назовите группу ctrl_arm_Zero_L и привяжите
ее к местоположению запястья. Заморозьте перемещения этого узла.
5. Чтобы подключить ik_arm_L к контроллеру, вам нужно создать узел, который будет
точечно прикреплен к ctrl_arm_L. Выделите ik_arm_L, сгруппируйте и назовите группу
aux_blend_L. Проверьте, что ее точка опоры прикреплена туда же, куда и ik_arm_L, и
что ее перемещения заморожены.
6. Создайте контроллер полюсного вектора для руки, с целью управления локтем. Создайте
локатор-кривую, как мы делали с запястьем, и назовите его ctrl_elbow_L. Сгруппируйте
его и назовите группу ctrl_elbow_Zero_L.
7. Сложность полярного вектора в том, чтобы не вызвать скачок руки, когда вы
прикрепляете к ней ИК-манипулятор. Убедитесь, что цель полярный вектора находится
в той же плоскости, в которой будет работать ИК решатель. Рука этого персонажа вне
оси, и поэтому плоскость трудно отыскать вручную. Мы предпримем следующие шаги,
чтобы разместить объект в правильной плоскости.
8. Выделите три сочленения руки – upArm_L, lowArm_L и wrist_L, – а также
ctrl_elbow_Zero_L, и установите точечный ограничитель. Центр плоскости ИК для
сочленений руки будет найден.
9. Нужно найти вектор направления для перемещения вдоль него группы, так чтобы
полярный вектор находился вне руки и не давал ей переворачиваться. Возьмите
lowArm_L и ctrl_elbow_Zero_L и установите целевой ограничитель. Когда вы будете
перемещать ctrl_elbow_Zero_L по X, он будет перемещаться плоскости ИК-решателя.
Когда контроллер попадет на свое место, можно будет удалить ограничители,
установить вращения ctrl_elbow_Zero_L на ноль и заморозить перемещения.
10. Теперь прикрепите ik_arm_L к ctrl_elbow_L с помощью ограничителя полюсного
вектора. Рука не должна двигаться или дергаться. Если это происходит, то
управляющий элемент находился не в той плоскости и должен быть перепроверен. На
рисунке 7.49 показано расположение полярного вектора руки, и остальные,
подвешенные к руке узлы. Ими вы и займетесь на следующем этапе.

Врезка. Вы также можете установить центральную точку группы в опциях


группы, так как это может помочь ускорить ее размещение при
группировке одного объекта. Точка устанавливается в центр габаритной
рамки группы, а не исходного объекта.

@Рис. 7.49. Полярный вектор локтя.

11. Чтобы немного навести порядок перед тем, как пойти дальше, давайте проверим, что вы
подчинили ваши контроллеры узлу pgWorld. Следующим шагом создается система, в
которой полярный вектор будет всегда следовать за рукой. Это может показаться
странным, но в этой системе можно установить полярный вектор вне персонажа и
сделать для него ключевые кадры как для сдвига, чтобы сократить количество случаев,
когда во время сложных движений он встает на пути. Мы создадим опцию фиксации
его в глобальном пространстве, до тех пор, пока нам не понадобятся его перемещения.
12. Создайте локатор, назовите его ctrl_elbowAttach_L, прикрепите его к вершине upArm_L
и подчините shoulder_L. Потом заморозьте перемещения ctrl_elbowAttach_L. Это будет
верхняя точка, к которой мы прикрепим следующий контроллер – к этой точке и к
локатору запястья.
13. Создайте еще один локатор, назовите его ctrl_elbowFollow_L и прикрепите его к
ctrl_elbowAttach_L и ctrl_arm_L. После этого сделайте его дочерним узлу pgWorld.
14. Выделите ctrl_elbow_L, сгруппируйте его и назовите группу ctrl_elbowLocate_L. Затем
подчините этот узел родительскими ограничителями локатору ctrl_elbowFollow_L и
pgWorld. Это позволит вам чередовать следование за рукой и залипание в глобальном
пространстве. По умолчанию установите следование за рукой, но если нужно, можно
настроить и залипание в глобальном пространстве.
15. Наладьте все это так же, как мы настраивали другие смешивания ограничителей: с
помощью добавления собственного атрибута shape-узлу ctrl_elbow_L. Назовите shape-
узел elbow_attrs_L. Добавьте атрибут под названием followArm и установите его
значение на float, от 0 до 1, по умолчанию 1. Применив нашу хитрость с реверсными
узлами и Connection Editor, подключите атрибут родительскими ограничителями
ctrl_elbowLocate_L.

Врезка. Идея полярного вектора или up-вектора, следующего за рукой,


может показаться странной, но по сравнению с ее аналогом в глобальном
пространстве она дает исключительные преимущества, потому что вектор
остается с персонажем, но не мешает движению. Проблема с полярными
векторами, которые прикреплены к глобальному пространству или просто
сдвигают родительское сочленение персонажа, заключается в том, что они
перемещаются тогда, когда вы этого не хотите, но также они дают
уверенность в том, что локоть всегда двигается немного в стороне от
текущего положения руки. Поначалу локатор, следующий за рукой, может
показаться немного странным, но когда вы привыкнете просто настраивать
локоть для большей части движений и забывать о нем, то вы машинально
будете искать эту возможность в других сборках.

16. У вас есть начатая сборка руки; но чтобы она полноценно заработала, нужно сделать
кое-что еще. Следующий шаг – это то же самое, что мы проделали с ногой, чтобы
создать переключатель ПК наследования, но только теперь нужно настроить руку.
Вспомните, нужно добавить атрибут переключения в ctrl_fkOriShape, назвать его armL
и соединить с ограничителями ctrl_upArm_ori_L, чтобы смешать узлы
ctrl_upArm_ori_Local_L и ctrl_upArm_ori_World_L. Подчините shape-узел узлу upArm_L
с пометкой -add, как в случае с ногой.
17. Проверьте, что вы установили соединения с нужным атрибутом. Для этого установите
смешивание ИК-манипулятора руки на 0 и попробуйте повернуть тело персонажа. Если
рука по умолчанию двигается вслед за ним, то это хорошо. При установке атрибута
armL на 1 она не должна поворачиваться вместе с телом. Если у вас возникли проблемы
с этим компонентом рига, обратитесь к разделу о ноге, где мы делали то же самое.
Последний этап настройки руки и кисти: добавление опций и
элементов управления конечностью
Рука соединяется в целое, и, как и в случае с ногой, нужно настроить еще несколько элементов,
например, смешивание ИК/ПК, скручивание ИК, совмещение локального и глобального
пространств, управление запястьем (которое также потребует реакции на локальное или
глобальное вращение руки), управление пальцами и, наконец, настроить автоматическую
ключицу, которая бы реагировала на подъем руки до определенной точки.
ИК/ПК
1. Настройте переключатель ИК/ПК, добавив в ctrl_arm_L собственный атрибут и назвав его
так же, как в случае с ногой, ikFk. Максимальное значение 1, минимальное 0, по
умолчанию 1. Соедините его с ИК ik_arm_L – атрибутом смешивания ИК на ИК-
манипуляторе.
2. Скручивание в ИК тоже несложно. Добавляя атрибуты и устанавливая прямые соединения,
вы можете управлять скручиванием руки независимо от полярного вектора. Хитрость
здесь в такой отладке узла unit conversion между двумя соединениями, чтобы значение
скручивания руки, управляющего скручиванием в ИК, было больше, и вам не пришлось бы
далеко прокручивать мышь. Хорошо работает значение узла unitConversion, равное 1 или
1,5.
3. В некоторых сборках контроль выкручивания поворачивающегося объекта, размещен на
плече или локте персонажа, и это работает, наряду с атрибутом скручивания или вместо
него, но ключевые кадры распространяются на несколько объектов, и приходится делать
много дополнительных выделений и переключать инструменты, так что лучше все-таки
работать с атрибутом. Если вы хотите, чтобы скручивание управлялось иконкой, то
разместите ее рядом с главным элементом управления руки, чтобы ее можно было быстро
выделить, но не вне оси сочленения руки и не сворачивая ее в иерархию руки.
Смешивание пространств и наследующие перемещения руки – отличные вещи для сборки;
при настройке рук они используются больше всего, но можно применить их и к настройке ног,
если это необходимо. Такие детали нужно настраивать на начальном этапе анимации, в одном
или другом пространстве, но так, чтобы смешивание этих пространств происходило гладко.
4. Использовать текст для целей узлов легко и быстро, к тому же позволяет аниматорам
знать, что представляет из себя каждый узел и как он влияет на руку. Создайте небольшой
текст, используя шрифт Arial, с заглавными буквами W и L. Появится форма кривой и
групповые узлы, которые вы сможете применить для переключения пространства между
глобальным и локальным. Управление локальным пространством будет потом привязано к
сборке бедер, так как L держит руку в одном пространстве с верхней частью туловища, но
вне грудной клетки/плеча, а управление глобальным пространством должно остаться вне
пространства персонажа и может быть анимировано, чтобы присоединить его к другому
персонажу или сдвинуть руку, если нужно. На рисунке (рис. 7.50) показаны имя и
положение глобальной и локальной управляющих кривых. Когда они размещены и
названы, вы можете выделить ctrl_arm_Zero_L и прикрепить его родительским
ограничителем между двух кривых. Мы настроим собственный атрибут для сочетания
глобального и локального контроллеров, как наши переключатели ограничений
5. Переименуйте shape-узел ctrl_arm_L из curveShape1, как он назван в нашем файле - в
xtraAttrs, как мы делали с контроллеров вращения стопы. Добавьте свой атрибут
worldLocal и установите по умолчанию глобальное пространство. Так как этот
переключающий атрибут не входит в состав основных элементов управления анимацией,
то мы установим его на форму, чтобы его по ошибке не анимировали.

@Рис. 7.50. Новые узлы и их правильное размещение в этой части сборки

Автоматическая ключица
Повороты относительно перемещения у наших контроллеров это что-то, к чему нужно подойти
несмеша, решая, как аниматор будет взаимодействовать со сборкой. В большинстве случаев
перемещение делается интуитивно, и проблем с суставами не возникает, а могут быть легко
разобраны и отредактированны в Редакторе Схем (Graph Editor). Так как у нас уже есть хороший
скелет в ПК, а модель настроена для анимации ключиц, то можно просто добавить
дополнительный слой управления, чтобы сделать автоматическую ключицу и иметь возможность
отключить или усилить результат.
1. Начните с выделения и группировки clav_L. Это потом понадобится позже для авто-
риггинга (autoRig). Назовите группу ctrl_clav_AutoClav_L. Она будет соединена с
вращением с помощью управляемого ключа, основанного на положении ctrl_arm_L.
2. Ctrl_arm_L будет управляющим элементом, а ctrl_clav_AutoClav_L – управляемым.
Стандатная процедура SDK – установить ключ для нулевого положения, а потом до
предела поднять руку вверх над головой, повернуть узел AutoClav вверх по Y, так
чтобы рука и ключица в этой позе хорошо выглядели, и установить следующий SDK
ключ. Проделайте то же самое для поворота руки по Z, выставив ее вперед и повернув
узел AutoClav вперед по X. Вы можете настроить ключевые кадры и кривые SDK,
чтобы добиться лучшего ощущения движения ключицы. На рисунке (рис. 7.51)
показаны кривые SDK для ctrl_clav_AutoClav_L.
3. Теперь, когда автоматическая часть ключицы готова, аниматоры хотят получить над ней
управление. Примените ту же технику, что и для настройки Roll Amp стопы. Просто
добавьте к shape-узлу xtraAttrs узла ctrl_arm_L новый собственный атрибут autoclave
(там, где вы поместили атрибут World Local).
4. Теперь примените команду Mel createNode multDoubleLinear и дублируйте
новый узел. Выделив их оба, выделите узел ctrl_clav_AutoClav_L и перейдите к схеме в
Гиперграфе, чтобы установить соединения. Подключите узлы multDoubleLinear между
кривыми SDK и значениями вращения ctrl_clav_AutoClav_L. Затем возьмите свой
autoclave и присоедините его к открытому слоту узлов multDoubleLinear (рис. 7.52).
Помните, что, поскольку мы добавили узлы multDoubleLinear после соединений SDK,
мы можем либо установить их эффект на 0, отключив автоматическое движение
ключицы, либо увеличить значение, чтобы ключица могла двигаться более свободно.
Вы можете даже присвоить отрицательное значение, и плечо будет отходить от руки,
когда вы будете перемещать контроллер вперед. Это пригодится, если героя будут
дергать за руку, а он будет пытаться освободиться.

@Рис. 7.51. Кривые SDK

@Рис. 7.52. Окончательные соединения узлов

5. Нужно помнить об одной вещи: когда вы переключитесь из ПК в ИК, автоматические


ключицы перестанут работать. Но с этой проблемой справиться несложно; нужно
просто отключить смешивание значений во время переключения вперед и назад. Хотя
большинству аниматоров не нравится, когда автомитизация включена, но иногда так
лучше для быстрого блока или игровых движений, когда происходит тесный разворот.
Риггинг лопатки
Чтобы создать сборку лопатки, нужно убедиться, что она удовлетворяет нескольким требованиям.
Главное из них – управление деформациями с участием ключицы, и в то же время возможность
анимации таких мелких движений, как напряжение, и подкожное движение мышц. Хороший путь
к разработке таких деталей сборки – наскоро настроить тестовый файл вне основной сборки
персонажа, чтобы проверить некоторые идеи. В маленьком файле вы сможете понаделать чего
угодно, не боясь испортить оригинальный файл сборки. После того как вы заставили что-нибудь
работать так, как вы хотите, вы можете аккуратно построить это в файле сборки (рис. 7.53).

@Рис. 7.53. Тестовая сборка лопатки.

Взглянув на расположение сочленений в тестовой сборке вы обнаружите, что ключом к тому,


чтобы это заработало является точка вращения, находящаяся в центре модели, где при повороте
конец сочленения образовывает дугу вдоль поверхности модели. Это имеет значение, потому что
лопатка плавает над грудной клеткой, и нам нужно имитировать это движение. Также нужно,
чтобы сочленение могло перемещаться при повороте наружу, как когда рука поднимается над
головой.
Этот процесс проходит в две стадии. Вы создадите сочленения в файле сборки, а потом
перенесете их обратно в файл временного скелета и файл для скиннинга.
1. В файле сборки есть ссылка на модель высокого разрешения, которую мы будем
использовать с целью более легкого размещения новых сочленений. Просто спрячьте
голову на время, чтобы сконцентрироваться на области грудной клетки и плеч. На
рисунке (рис. 7.54) показано положение вращающей мышцы лопатки, на виде сверху,
что позволяет поворачивать ее вдоль поверхности грудной клетки.
2. Теперь используя грубую модель лопатки, на которой положение центральной точки
скручивания отмечено красной стрелкой, отмасштабируйте и переместите её в то место,
где, как вам кажется, должна находиться лопатка персонажа. Когда вы определитесь с
размером и местоположением лопатки, поверните конечное сочленение так, чтобы оно
выровнялось с центральной точкой ее скручивания (рис. 7.55).

@Рис. 7.54. Положение точки опоры в сборке лопатки

@Рис. 7.55. Положение сочленения лопатки

3. Теперь привяжите новые сочленения поверх этих временных сочленений и закончите


концом сочленения ключицы, всего создав три новых сочленения. Назовите их, считая
от основания позвоночника, ctrl_autoScap_L, ctrl_autoScap_Attach_L и
ctrl_autoScap_END_L. Выровняйте ЛОВ ctrl_autoScap_L, чтобы они совпали с ЛОВ
ключицы.
4. Создайте одно отдельное сочленение, которое будет использоваться для скиннинга, и
привяжите его к месту расположения точки опоры лопатки. Назовите его scap_L и
подчините spineChest. Это сочленение, чтобы двигаться правильнее, будет получать
данные как перемещения, так и вращения. Подчините ctrl_autoScap_L сочленению
spineChest.. Рисунок 7.56 показывает новые сочленения в сборке и новое сочленение
лопатки.

@Рис. 7.56. Сочленение лопатки и сочленения сборки

5. Это сочленение – то, которое вы сохраните и поместите в другие файлы, шаблонный и


файл скелета. Не забудьте согласовать ЛОВ с остальным скелетом, положительное
вращение по Z вперед, а отрицательное назад. X – ось скручивания, так что она
располагается в соответствии с направлением скручивания лопатки под определенным
углом. Убедитесь, что у них есть имя для редактора Trax. Зеркально отразите
сочленения, когда закончите. Рисунок 7.57 показывает сочленение с правильным
выравниванием ЛОВ. Теперь разбейте подчинение, экспортируйте два сочленения
лопатки из этого файла и загрузите их в файл скелета и шаблонный файл. Заново
подчините их в файле сборки, когда экспорт будет завершен.
6. Добавьте IK манипулятор из ctrl_autoScap_Attach_L в сочленение ctrl_autoScap_END_L,
назовите его ik_scap_L, а его эффектор – eff_scap_L. Подчините его сочленению clav_L.
7. Чтобы было видно влияние сборки на сочленение лопатки, присоедините сочленение
scap_L к сочленению ctrl_autoScap_Attach_L с помощью родительского ограничителя.
Они будут двигаться вместе. После этого просто подчините каркас лопатки сочленению
scap_L, чтобы сразу видеть его движение.
8. Чтобы закончить с соединениями и для полного диапазона движений заставить лопатку
следовать за ключицей, вы должны настроить соединение поворота и перемещения.
9. Создайте локатор, прикрепите его к месту ctrl_autoScap_L, подчините clav_L и назовите
его ctrl_scapPos_Attach_L. Заморозьте перемещения локатора, чтобы обнулить его.
10. Создайте и привяжите к тому же месту другой локатор, названный ctrl_scapPos_L. При
повороте ключицы вверх он будет перемещаться по Y. Заморозьте перемещения
локатора, чтобы обнулить его.
11. Сгруппируйте его, подчините группу spineChest и назовите новую группу
ctrl_scapPos_Zero_L.
12. Подчините ctrl_autoScap_L локатору ctrl_scapPos_L.
13. Прикрепите ctrl_scapPos_L узлу ctrl_scapPos_Attach_L точечным ограничителем, но
только по Y. Это позволит лопатке перемещаться вверх по спине, когда ключица будет
поворачиваться вверх.
14. Теперь соедините ось Z у clav_L с осью Z у ctrl_autoScap_L. Когда ключица
поворачивается спереди назад, лопатка скользит по грудной клетке и дает очень
неплохое естественное движение, освобождая аниматоров от необходимости его
анимировать.

@Рис. 7.57. Сочленение лопатки и сочленения сборки с выровненными ЛОВ

Врезка. Если у вас установлен пакет Bonus Tools для Maya 6.0.1, то вы
можете щелкнуть правой кнопкой мыши с прижатой клавишей Ctrl на
выделенном атрибуте в Channel Box и добавить его как управляющий,
потом выделить управляемый объект, снова щелкнуть правой кнопкой мыши
с прижатой клавишей Ctrl и выбрать из списка New Attribute Driver.
Когда закончите, просто удалите их. Это быстрее, чем возиться с
Hypergraph или Connecion Editor, когда вам нужны лишь простые прямые
соединения.
В Bonus Tools для Maya 6.5 эта функция по умолчанию отключена, но ее
можно активировать путем удаления комментария к команде publish в
userSetup.mel.

15. Загвоздка в том, что для того, чтобы всё это работало с автоматической ключицей,
нужно еще одно соединение. Помните: чтобы сборка была профессионально отлажена,
технический директор должен проверить, что все отдельные системы работают вместе;
ведь вы создаете инструмент для аниматоров, а не просто список настроек. Когда рука
выставлена вперед, должно вращаться сочленениие ctrl_clav_AutoClav_L, а не clav_L, к
которому привязаны повороты ключицы вперед-назад.
16. Примените проверенные utility-узлы еще раз, чтобы совместить оба вращения на оси Z
ctrl_autoScap_L.
17. Выделите ctrl_autoScap_L и новый узел plusMinusAverage. Отобразите их схему.
Соедините вращение по Z clav_L с входом 1D[0] plusMinusAverage, а затем его
выходные данные с вращением по Z ctrl_autoScap_L.
18. Теперь для вращения возьмите выходные данные ctrl_autoScap_L и подсоедините их к
узлу plusMinusAverage, ко входу 1D[1]. Потом возьмите узел unitConversion, между
ctrl_clav_AutoClav_L и plusMinusAverage. Установите его на «-», чтобы узел autoScap
поворачивася в правильном направлении, и присвойте узлу unitConversion имя
unitCon_clavReverse_L. Так мы будем знать, что он используется в риге, а не просто
создан Maya по умолчанию (рис. 7.58)

@Рис. 7.58. Окончательные соединения автоматической ключицы

Если аниматоры потребуют, вы можете добавить управление скручиванием для анимации


поворота сочленения лопатки или пойти дальше и приспособить положение ik_scap_L для более
интенсивных движений лопатки. Но мы не будем рассказывать об этом в учебнике.
Запястье и пальцы рук
Для управления запястьем и кистью создайте такой же узел, как в случае с лодыжкой, чтобы
можно было без проблем отразить повороты одной руки на другую. При этом вращения будут
нулевыми.
1. Создайте новое сочленение, сгруппируйте его и привяжите к сочленению запястья.
Назовите сочленение ctrl_wrist_L, а группу ctrl_wrist_Zero_L.
2. Контроллер запястья должен совпадать с сочленением запястья, чтобы они
поворачивались одинаково. Подчините ctrl_wrist_Zero_L сочленению lowArm_L и
заморозьте перемещения. Чтобы сочленение совпало с запястьем, можно сделать
разные вещи, но самый быстрый способ – применить новую возможность Maya: кнопка
Presets (предварительные настройки) в Attribute Editor. Сперва возьмите сочленение
wrist_L и кнопкой Presets сохраните новые настройки. Потом выделите ctrl_wrist-
_Zero_L и идите в меню Presets → wrist_L → Replace (Предварительные настройки →
wrist_L → Заменить). Управляющее сочленение запястья точно совпадет с настоящим
сочленением запястья. Остальные настройки запястья будут работать так же, как
наследующий риггинг руки и ноги в ПК: запястье должно следовать за рукой, когда она
поворачивается, или же оно смешается с глобальным пространством и не будет
наследовать вращения руки.
3. Дважды дублируйте сочленение ctrl_wrist_L.Назовите одну копию
ctrl_wrist_ori_World_L, а другую – ctrl_wrist_ori_Local_L. Подчините локальный
контроллер lowArm_L, а глобальный узел – fkWorldOri_GRP.
4. Прикрепите ctrl_wrist_Zero_L orient-ограничителем к глобальному и локальному
сочленениям. (Убедитесь, что ограничение настроено по умолчанию.)
5. Теперь создайте вращающий бокс и подчините его shape-узел сочленению ctrl_wrist_L.
Вам нужно будет приспособить порядок вращения к запястью, чтобы оно лучше
работало при анимации и риггинге. Так как вращение по X влияет на все предплечье и
запястье, именно X должна быть ведущей осью, тогда Z – для движения из стороны в
сторону, а Y – вверх-вниз. Такой порядок также поможет избежать блокирования
шарнирного соединения, так как оси будут разделены, что полезно в основном для оси,
которая вращается последней. В этом случае движение запястья из стороны в сторону
ограничено диапазоном его движения. Вот почему для управления запястьем наиболее
пригоден порядок вращения YZX. Это также является причиной того, что в сборке
создается дополнительный слой сложных сочленений вместо обычного управления
сочленением wrist_L непосредственно в ПК. На рисунке 7.59 показана сборка запястья
и её контроллер (управляющий объект добавлять все-таки нужно). Можно под одно
управление подвести сочленения двух скелетов сборки – запястья и кисти, – чтобы
движения кисти были более естественными. На рисунке 7.60 показана иерархия и узлы
для переключения ориентации (orient-switching).
Чтобы вращения отображались корректно, нужно будет также изменить порядок вращения
сочленений скелета. (Не забудьте точно также изменить файл скелета для скиннинга;
это не обязательно, но помогает совместить их.)

@Рис. 7.59. Управляющее сочленение запястья без кривой

@Рис. 7.60. Переключающие узлы в запястье

6. Прикрепление вращения ctrl_wrist_L к bn_wrist_L и ctrl_hand_L будет прямым. Применяя


прямые соединения, поверните XYZ контроллера по XYZ сочленений. Небольшое
изменение заключается в том, что вы не сможете присоединить ось X сочленения
bn_wrist_L, которое не дает скручиванию возникнуть под запястьем, но разрешает
использовать оба сочленения в поворотах вверх-вниз и налево-направо. Так
устанавливаются места, где запястья поворачивается наружу мимо конца сочленения
локтевой и лучевой костей. При анимации это также создаст впечатление скольжения
кожи по сочленению.
7. Теперь выделите ctrl_wrist_L и назовите shape-узел xtraAttrs. Создайте заданный атрибут
и назовите его wristFollow, значение по умолчанию равно 1. Если его установить на 0,
то он отключится. Это элемент управления для смешивания включенного и
отключенного наследия вращения. Риггинг будет происходить так же, как с прямым
соединением и реверсным узлом (рис. 7.61).

@Рис. 7.61. Собственные атрибуты запястья формы xtraAttrs

Пальцы рук: основанное на положении пальцев управление кистью в


ПК.
Простой и самый прямой путь к риггингу пальцев – оставить их в ПК. Кисти требуют намного
большего уровня сноровки и большего контроля, чем стопы и пальцы ног. Кисти, так сказать,
являются проблемой при анимации из-за большого количества сочленений и множества ключевых
кадров, которые нужно настраивать и контролировать. Один из способов обойти это –
воспользоваться библиотекой скриптов для кистей, чтобы все атрибуты были установлены и
каждый раз вам приходилось бы делать меньше работы по позиционированию. Другой способ –
настроить контроллеры с атрибутами (так, как были настроены пальцы ног), контролирующими
такие вещи, как изгибы, разброс и так далее.
Уникальный способ работы со сложными наборами сочленений – использовать скрипты для
хранения поз и управления ими (таких поз, которые находятся в файле прямо с элементами
управления). Мы уже отмечали такие скрипты, как zooTriggered или zooObjectMenu. Очень
быстрый способ наполнения zooObjectMenu позами – воспользоваться дополнительными
инструментами: сценарии Store Poses (Хранение поз) генерируют наборы команд Mel, которые
можно поместить в zooObjectMenu с помощь меню правой кнопки мыши. Это отлично работает,
если позы хранятся с персонажем. Полка или собственный Mel-скрипт, хранящийся вместе с
персонажем, так же работают очень хорошо. Вариант применения инструмента Store Poses –
добавить в zooObjectMenu управляющие элементы для создания и редактирования заданных
dagPoses, например, пальцев.
Просто для разнообразия мы настроим несколько собственных атрибутов и покажем вам
другой способ взаимодействия с контроллерами кисти. Это путь к ускорению выделения пальцев
и работы с ними с помощью скриптов.

Врезка. Пользователям Max отлично подойдет скрипт Pen_Attribute_Holder


от Пола Нила (Paul Neale), потому что он позволяет добавлять заданные
атрибуты описанному в сценарии модификатору (аналог узла в Maya). С
Pen_Attribute_Holder можно также сохранять позы, копировать и
вставлять, совмещать влияние позы с помощью атрибутов исходной позы.
Последнюю версию вы можете скачать с его Web-сайта
http://paulneale.com. Пол Нил – очень талантливый настройщик
персонажей, и на его сайте есть примеры и великолепные работы, включая
очень хороший тренировочный материал на DVD о риггинге персонажа в
Max, который по случайному стечению обстоятельств оказался похож на
риггинг, о котором рассказывается в этой книге.

Мы рассмотрим два подхода к этому делу. Первый навеян «Character Rigger’s Cookbook»
(«Поваренная книга персонажных Риггеров») Стива Теодора с конференции разработчиков игр
(Game Developer Conference – GDC). Второй – его вариация с теми же функциями, но более
рационализированная и подходящая для многих персонажей.

Врезка. Всю «Character Rigger’s Cookook» вы можете найти на Web-сайте


Стива Теодора по адресу http://www.radgametools.com/cookbook/cookbook
%20final.html. Это очень широкий взгляд на преимущества и недостатки
риггинга. Есть множество примеров из смежного программного
обеспечения. Это очень хороший сайт для художников по персонажам
любого уровня.

Мы создадим несколько атрибутов на всех пальцах рук и соединим их, чтобы ускорить процесс
выделения. Так как они будут основаны на соединениях, изменения имен в скелете не должны на
них повлиять.
1. Добавьте первый набор атрибутов ко всем пальцам, исключая конечные сочленения,
назовите его selHand и установите его значение на string, чтобы он не был виден в
Channel Box.
2. Теперь создайте управляющую форму, которая станет узлом, выделяющим shape-узлы
кисти. Использование аннотаций в нашем примере делает пометку и выделение
контроллеров более легким. Создайте аннотацию ctrl_wrist_L, а затем подчините
аннотацию контроллеру запястья. Назовите его fingerAll_selHand_L. _selHand сообщит
сценарию о том, что это тот объект, для которого нужно искать соединения.
3. Добавьте к fingerAll_selHand_L собственный атрибут, как мы делали с пальцами.
Назовите его selHand и установите на string.
4. Соедините выход fingerAllsel.selHand с заданными атрибутами всех пальцев вместе
– .selHand. Эти соединения позволят управляющему узлу после приведения скрипта в
действие найти все объекты, нужные для выделения.
5. Еще один атрибут, который мы должны добавить, – переключение
включения/выключения скрипта выделения. Создайте атрибут в pgWorld, назовите его
autoSelect и сделайте его логическим (рис. 7.62).
6. Теперь откройте Expression Editor (Редактор выражений). Мы собираемся использовать
скриптовый узел (script node), чтобы запустить наш скрипт и оставить его в файле
персонажа. Открыв Expression Editor, установите By Script Node Name (По имени
скриптового узла) в меню Select Filter (Выбрать фильтр).
7. В графе Script Node Name (Имя скриптового узла) напишите autoSelect и добавьте
комментарий «//это наш сценарий автоматического выделения», чтобы можно было
щелкнуть по кнопке Create (Создать) и чтобы внутри был текст, с которым будет
создаваться узел. Если вы оставите эту графу пустой, то скриптовый узел создан не
будет. На рисунке 7.63 показан только что созданный скриптовый узел. Поменяйте
Execute ON на Open/Close. Сценарий будет запущен в открытом файле. Тот сценарий,
что приведен ниже, нужно поместить в раздел Before («До»)

Окончательный сценарий выглядит так:


//это наш скрипт автоматического выделения
//настраивает скрипт для поиска события,SelectionChanged в Maya
//для получения дополнительных сведений о командах о командах сценария
зайдите в файл справки
scriptJob –killWithScene –compressUndo 1 –event “SelectionChanged”
“selectHnd”;
global proc selectHnd()
{
if (` getAttr pgWorld.autoSelect` == 1) {
string $selectHnd[];
$selectHnd = `ls –sl “*_selHnd*” “*:*_selHnd*” `;

if (`size $selectHnd`) { select `listConnections .selHand`;


RotateTool;// переключает инструмент на режим вращения после
выделения объектов

select –d `ls –sl “*_selHnd” “*:*_selHnd*” `;


}
}
}
Теперь вы можете пойти дальше, добавив дополнительные наборы атрибутов, соединений и
условных выражений к задаче вашего скрипта. У вас может получиться манипулятор мульти-
выделения (multi-selection handle) для каждого пальца а, например, не всей кисти сразу. Можете
воспользоваться этой техникой для создания системы смены ИК – ПК (IK FK swapping system),
для создания независимых от имен систем для замены наборов быстрого выделения, и так далее:
возможности самые широкие. По сравнению со сценариями zooTriggered это базовая
низкотехнологичная версия, но если вы хотите создать такое управление в вашем файле и при
этом не хотите писать сценарий, который для этого необходим, то это хороший способ сохранить
единое внешнее оформление сборки.

@Рис. 7.62. Кисть с соединенными атрибутами

@Рис. 7.63. Только что созданный скриптовый узел

Врезка. Включение и отключение этого сценария пока не поддерживают


ссылки, что вызывает ошибки. Также он не подходит для нескольких
персонажей одновременно, так как запрашивает getAttr определенного
узла.

Скриптовый узел для нескольких персонажей, поддерживающий


ссылки
Мы говорили о том, что нужно убедиться в гибкости вашего плана работы и построения сборки.
Предыдущий метод выделения пальцев основывался на работе другого человека и был лишь
модифицирован. Он не гибок, потому что был сконструирован специально для наших задач. Это
распространенная проблема, с которой должны справляться технические режиссеры по
персонажам во время риггинга, пытаясь убедиться, что то, что работает в отдельном файле,
подходит и для общего производственного процесса.
Проблема предыдущего сценария заключалась в том, что в строчке if (` getAttr
pgWorld.autoSelect` == 1) { он искал определенное имя узла, и если бы это имя
именилось, в сценарии произошел бы сбой. Ссылка на файл или наличие в файле нескольких
персонажей вызовут изменение имени узла pgWorld. Как можно это исправить?
1. Во-первых, воспользуйтесь хитростью Джейсона Шлейфера (Jason Schleifer):
примените для соединения fingerAll_selHnd с узлом pgWorld атрибуты .message. Потом
вы сможете изменить сценарий так, чтобы он находил pgWorld.autoSelect без имени.
Проверив соединение .message от глобального узла к элементам контроля выделения с
помощью команды Mel listConnections, вы сможете потом извлечь имя
глобального узла и проверить, работает ли атрибут .autoSelect.
2. Добавьте атрибут message под названием selectors к узлу pgWorld с помощью команды
Mel:
addAttr –ln “selectors” –at “message.”
3. Атрибут selectors соединится с атрибутом world, который будет добавлен в левый и
правый узлы fingerAll_selHnd. Выделите каждый из узлов fingerAll_selHnd и запустите
Mel: addAttr -ln “world” -at “message”
4. Теперь нужно соединить атрибут selectors узла pgWorld с атрибутом world узлов
fingerAll_selHnd. Воспользуйтесь Connection Editor или Mel-командой connectAttr:
connectAttr pgWorld.selectors fingerAll_selHnd_R.world;
connectAttr pgWorld.selectors fingerAll_selHnd_L.world;
5. Другое изменение первого метода подключения управления выделением к пальцам
состоит в том, что теперь мы будем использовать наборы выделения вместо добавления
собственного атрибута к каждому узлу, который нужно выделить.
6. Возьмите все сочленения пальцев правой руки и сделайте набор быстрого выделения
под названием pgSelect_fingers_R. Точно так же сделайте на левой руке.
7. Добавьте атрибут типа message под названием selectNode к правому и левому узлам
fingerAll_selHnd. Соедините этот атрибут с набором выделения, чтобы скрипт мог
найти и выделить нужные вам узлы, когда вы обращаетесь к контроллерам.
addAttr –ln “selectNode” –at “message”
8. Теперь добавьте атрибут селектора к каждому набору выделения, как в случае с
pgWorld.
addAttr –ln “selectors” –at “message.”
9. Подсоедините атрибуты от fingerAll_selHnd_L к pgSelect_fingers_L, и то же самое
сделайте на правой стороне.
connectAttr fingerAll_selHnd_L.selectNode pgSelect_fingers_L.selectors;
connectAttr fingerAll_selHnd_R.selectNode pgSelect_fingers_R.selectors;

Врезка. Наборы выделения, как и любые другие узлы в Maya, могут иметь
собственные атрибуты. Обычно вы просто соединяете, добавляя
собственные атрибуты узлам-трансформам или shape-узлам, но
использование наборов выделения для хранения собственных атрибутов
открывает перед нами широкие возможности. Например, можно связывать
собственные атрибуты с множеством объектов, не устанавливая на них эти
атрибуты.

10. Создайте новый скриптовый узел так же, как раньше, но с новым кодом.
//новый скрипт///////////////////////////////////////////////////////////
//это наш скрипт автоматического выделения
//настраивает работу сценария для поиска события,SelectionChanged в Maya
scriptJob –kws –compressUndo 1 –event “SelectionChanged” “selectNode”;
global proc selectNode()
{
//получаем выделенный узел
string $sel[] = `ls –sl`;
//ищем по узлам заданный атрибут
for($node in $sel)
//проверка, что у объекта есть атрибут
if(`objExists ($node+“.selectNode”)`)
{
//получаем глобальный узел, которому подчинены элементы управления
выделением
string $worldCon[] = `listConnections ($node+“.world”)`;
//проверка глобального узла чтобы узнать, хочет ли пользователь,
чтобы управление выделением функционировало
if(`getAttr ($worldCon[0]+“.autoSelect”)`== 1)
{
// получаем соединения с наборами выделения, а потом
выделяем эти элементы
string $root[] = `listConnections ($node+“.selectNode”)`;
select –add $root;
// отменяет выделение управления выделением
select –d $node;
// переключает инструмент на режим вращения после того, как
объекты выделены
RotateTool;
}
}
}
//новый сценарий///////////////////////////////////////////////////////////
11. Наконец, проверьте нашу систему и убедитесь, что все соединения работают как
раньше. Теперь вы можете переименовать pgWorld в ugly, а выделения все равно будут
работать, как и предполагалось, независимо от имени. Убедитесь, что, прежде чем
продолжать, вы вернули обратно имя pgWorld.
Риггинг головы
Голова этого персонажа немного отличается от других, потому что на нее надет тяжелый шлем с
кожаными ремешками. Однако мы будем настраивать эту голову так, как будто на ней нет шлема,
потому что никогда не известно, не будет ли он снят. Аниматорам останется только следить за
интенсивностью движений головы с надетым шлемом.
Строению головы и шеи персонажа предъявляются некоторые дизайнерские требования.
Голова должна иметь возможность переключения между глобальным пространством и
пространством тела, как и другие его части. Должно быть единое управление головой и шеей,
управление как перемещением, так и вращением. Вы можете сделать так, чтобы голова и шея
следовали за целью, которая переключается из локального пространства в мировое, но этот тип
управления ограничивает и замедляет работу, так как дает контроль только над вращением.
1. Начните с добавления ИК-манипулятора от сочленения neck до head. Назовите его
ik_head и eff_head.
2. Создайте дубликат сочленения головы и назовите его ctrl_head. Затем удалите конечное
сочленение и shape-узел. Разбейте подчинение ctrl_head, обнулите его перемещение,
чтобы оно передвинулось к исходной точке, и сгруппируйте его. Установите Rotate
Order на YZX.
3. Привяжите группу к сочленению head и назовите ее ctrl_head_Zero.
4. Подчините ik_head сочленению ctrl_head, а затем прикрепите orient-ограничителем
сочленение head к ctrl_head_oriTarget.
5. Чтобы соединить скручивание головы с управлением шеей, сначала добавьте
собственный атрибут neckTwist к shape-узлу ctrl_head. Это будет ограничителем для
управления скручиванием шеи. Создайте multiDoubleLinear и присоедините вращение
ctrl_head к узлу multiDoubleLinear, а затем к ik_head.twist.
6. Соедините ctrl_head.neckTwist с открытым соединением multiDoubleLinear. Установите
neckTwist на 0.5, чтобы поворот шеи сокращался наполовину. Это нужно для того,
чтобы при повороте головы из стороны в сторону шея поворачивалась не слишком
сильно. Нулевое значение отключит вращение шеи, так же аниматор сможет сам
анимировать значение, если потребуется.
7. Теперь управление головой нужно встроить в скелет, чтобы получить возможность
переключения вращения между локальным и глобальным пространствами, а также
прикрепить контроллеры головы к телу.
8. Создайте две пустые группы. Назовите главную ctrl_head_ori_Local_Zero, а подчиненную
– ctrl_head_ori_Local. Создайте еще одну пустую группу под названием
ctrl_head_ori_World. Подчините локальный нулевой узел сочленению spineChest, а
глобальный узел – fkWorldOri_GRP.
9. Прикрепите ctrl_head_Zero orient-ограничителями к глобальному и локальному узлам,
чтобы настроить переключение ориентации. На рисунке 7.64 показана сборка головы
перед прикреплением её к основной сборке.

@Рис. 7.64. Голова с прикрепленным объектом управления ориентацией. Обратите внимание,


что все ориентации ПК находятся на ней

10. Чтобы сборка заработала, контроллер головы должен следовать за грудной клеткой.
Сгруппируйте ctrl_head_Zero, назовите группу ctrl_head_Attach. Подчините ее
spineChest.
11. Добавьте собственный атрибут head в узел ctrl_fkOriShape, который содержит атрибуты
других наследуемых переключателей. Воспользуйтесь Mel командой Parent -add
-shape ctrl_fkOriShape ctrl_head, чтобы подчинить shape-узел сочленению
ctrl_head. Теперь присоедините атрибут head к весам ctrl_head_Zero_orientConstraints.

Теперь вы можете вращать контроллеры спины и главный узел персонажа, при том, что голова
сохранит способность переключения следования за телом.

Риггинг позвоночника
Позвоночник вашего персонажа должен быть легким и быстрым для позиционирования без
большого количества контроллеров. Аниматор не должен сражаться с ним, чтобы получить
хорошие изгибы, или переделывать анимацию при настройке позы. Но позу во время анимации
нужно видоизменять. Большинство сборок позвоночника сводятся к двум методам, ИК и ПК, или
их смеси. До тех пор пока сделанная в ПК спина персонажа позволяет придавать бедрам любое
положение независимо от верхней части туловища и пока у нас есть возможность изолировать
голову и руки, то настройка желаемой позы не потребует много работы. Надеясь на аниматоров,
вы можете обнаружить, что это всё, что им необходимо.
Кстати, в Character Studio есть ПК-решатель спины, позволяющий выделять разные сочленения
позвоночника и аддитивно их вращать. Пользователи Maya, вращая цепочку сочленений или
иерархию, считают это само собой разумеющимся. Но в Max эта функция не установлена по
умолчанию, поэтому считается продвинутой для Character Studio.

Врезка. Существует скрипт для Max, который предусматривает аддитивное


вращение вне Character Studio. Он работает в Max 6 и должен работать в
Max 7. Он называется Rotate Chain 1.1, написан Шоном Льюисом (Sean
Lewis) и доступен на www.scripspot.com.

При таком числе сочленений в позвоночнике этого персонажа и их расположении наклоны


вперед/назад и влево/вправо получаются очень хорошо. Со скручиванием позвоночника
возникают проблемы, но разбиение поворота на дополнительные вспомогательные сочленения
(helper joints) для скиннинга работает отлично, и к этой операции есть хорошая документация. За
подробностями обращайтесь к «Character Rigger’s Cookbook».
В нашей спинной сборке мы используем все преимущества управления вращением с помощью
встроенной сплайновой ИК. На эту сборку спины нас вдохновил Дэвид Уолден (David Walden),
который сделал очень неплохое руководство по позвоночнику – единственное руководство по
продвинутому управлению вращением, которое я видел. В дополнение к этому он
автоматизировал его с помощью своих инструментов dwRiggingTools.

Врезка. Скрипты dwScripts можно скачать с http://www.davidwalden.com,


и среди них – классный скрипт Attribute Manager (Менеджер Атрибутов)
для Maya, который дает вам обширное управление при работе с
собственными атрибутами, в том числе уже настроенными. Так же очень
хороши его инструменты для скиннинга. Они экономят много времени,
взаимодействуя с интерфейсом Maya.

Врезка. В XSI есть очень мощный решатель позвоночника, который работает


без сбоев после поворота на 180º. В нем предусмотрена настройка
сгибания и гибкости области поясницы, а еще он убирает давление,так
что позвоночник не оседает. В Max есть сплайновая ИК, которая хорошо
работает с ограниченными приложениями, но переворачивается и меняет
положение слишком просто, чтобы быть пригодной для сборки нашего вида,
которую мы делаем в Maya. Как бы то ни было, есть несколько возможных
альтернатив, когда сплайновый решатель (spline solver) в Max не
используется, но действует это как сплайновая ИК.

Требования и дизайн сборки спины


Центр тела включает в себя управление основанием позвоночника, бедрами, позвоночником и
влияние на область грудной клетки окружающей позвоночник. В большинстве сборок
позвоночника обширное управление дается за счет снижения скорости анимации и контр-
анимации (counter-animation) или быстрого грубого размещения без окончательного контроля над
спиной. Все это дает аниматору негативный результат. Мы же хотим, чтобы сборка была и
быстрым, и мощным.
Основные требования к ригу выражаются такими качествами:
 независимое движение, вращение и перемещение бедер и грудной клетки обеспечивает
раздельные анимационные реакции;
 усовершенствование позы без контр-анимации;
 размещение и анимация в ПК для лучшего действия;
 при движении талии грудная клетка не двигается, и наоборот;
 распределение скручивания как от бедер, так и от грудной клетки (с возможностью
анимировать сдвиги скручивания (twist offsets));
 сжатие и растяжение спины, которое можно уменьшить или отключить.
Чтобы обеспечить эти функции, воспользуемся сплайновой кривой в Maya в сочетании с
продвинутыми параметрами скручивания, ограничителями и utility-узлами.

Врезка. Так как мы собираемся масштабировать сочленения позвоночника,


нам нужно удостовериться, что масштабирование коснется только
позвоночника и не распространится на дочерние сочленения грудной
клетки. Если вы заметили, что это происходит при ручном
мастабировании, значит, нарушилась синхронизация локальной оси
мастабирования и локальной оси вращения, и ее нужно восстановить. Вы
должны расцепить все соединения с сочленениями позвоночника, запустив
на каждом сочленении команду Mel joint -e -zso и перенастроив их
обратно. До углубления в настройку убедитесь, что ось мастабирования
задана верно с самого начала. Так же, если у вас есть время, хорошо бы
написать для сборки вспомогательные скрипты.

Для начала нужно создать второй набор сочленений, который станет ПК скелетом этой сборки.
Он должен повторять сочленения спины, так что вы можете создать новые сочленения или просто
дублировать их, удалив через spineChest все другие, кроме центральных сочленений тела – spine.
Добавьте новым сочленения префикс ctrl и удалите единицу в конце spine1.
1. Спрячьте ctrl_spine на время настройки ИК на настоящей спине.
2. Создайте цепочку сплайновой ИК от spine до spineChest, с отключенным Auto Parent
Curve (Кривая автоматического подчинения) и количеством делений, установленным
на 2. Эта кривая будет перестроена, чтобы бы дать вам возможность ограничить
влияние сплайна верхней частью грудной клетки и талией. Назовите цепочку ik_spine;
эффектор – effspine, а кривую – ik_spineCurve.
3. Выделите кривую и щелкните правой клавишей мыши, удерживая Ctrl; появится опция
создания кластера кривой. Автоматический скрипт кластера в Maya создает связанные
друг с другом кластеры, так что вы можете снять метку отношения (relative flag) на
каждом кластере.

Врезка. Самый быстрый способ сделать это – удалить проверку отношения


(relative check) из поставляемого вместе с Maya скрипта. Скрипт
называется clusterCurve.net и находится в основной директории скриптов
Maya C:\Program Files\Alias\Maya6.0\scripts\other.Скопируйте этот
скрипт и поместите его в папку My Documents\maya6.0\scripts; затем
отредактируйте его, удалив строчку -relative из команды группировки.

4. Теперь давайте создадим контроллеры спины. Эти формы будут управлять


перемещением, вращением и скручиванием спины. Создайте первую кривую в форме
куба и сгруппируйте ее. Назовите группу ctrl_chest_Zero. Привяжите опорную точку
группы к spineMidBack. Заморозьте ее перемещения. Отлаживайте контрольные
вершины кривой до тех пор, пока форма не придет в соответствие с телом, как показано
на рисунке 7.65.

@Рис. 7.65. Управляющие формы сборки спины и Outliner, показывающая кластеры и ИК-
манипулятор

Врезка. Вам может быть непонятно, почему мы разместили управление


грудной клеткой так низко на позвоночнике. Мы обнаружили, что
большинство сборок со сплайновой ИК работают наилучшим образом, когда
элемент управления вращается вокруг точки, где ребра соединяются с
позвоночником, а не пограничной точки между шеей и грудным отделом
позвоночника. Это дает аниматору больше контроля и снижает
необходимость контр-анимации.
5. Теперь мы будем прикреплять orient-ограничителями сочленение грудной клетки к её
контроллеру. Чтобы убедиться, что элемент управления совпадает с сочленением в ПК,
мы дублируем чистое сочленение ctrl_spineChest и подчиним его ctrl_chest_Zero.
6. Назовите кривую ctrl_chest и обнулите ее перемещение. После этого сделайте узел
кривой управления дочерним ctrl_chest.
7. Выделите и сгруппируйте два верхних манипулятора кластера, в данном случае
cluster4Handle и cluster5Handle. Отрегулируйте положение центральной точки и
назовите группу ctrl_upperBack_Zero. В заключение подчините ее ctrl_chest.
8. Теперь вы сможете управлять поворотом и перемещением верхней части повоночника,
но грудная клетка все еще поворачивается, когда перемещаете ctrl_chest. Чтобы
исправить это, прикрепите spineChest orient-ограничителем к ctrl_chest.
9. Повторите эту процедуру при создании управления бедрами. Просто поменяйте
название chest на waist и вместо сочленения грудной клетки используйте для
управления сочленение, которое соответствует положению родительского сочленения.
10. Сгруппируйте последние три кластера, назовите группу ctrl_lowBack_Zero и подчините
их ctrl_waist.
11. Присвойте названия ctrl_Back_Cluster_# всем манипуляторы кластеров спины, считая
снизу вверх, с номерами от 1 до 6.
12. Теперь прикрепите сочленение root точечным ограничителем к ctrl_waist (рис. 7.66).

@Рис. 7.66. Текущее состояние сборки с кластерами подчиненными контроллеру талии

13. Наконец, нужно прикрепить root к ctrl_waist orient-ограничителем.


14. Настройте скручивание спины так, чтобы оно происходило при повороте контроллеров
позвоночника. Выделите ik_spine и откройте Attribute Editor. В меню IK Solver
Attributes → Advanced Twist Controls (Атрибуты ИК-решателя → Продвинутое
управление скручиванием) отметьте Enable Twist Controls (Разрешить управление
скручиванием) и установите тип World Up на Object Rotation Up (Start/End). В
пустых графах World Up Objects введите названия ctrl_waist и ctrl_chest (рис. 7.67).

@Рис. 7.67. Настройка контроллеров скручивания

15. Последний шаг к работе ИК и ПК состоит в прикреплении orient-ограничителем


настоящего сочленения позвоночника к управляющим сочленениям, которые мы
дублировали в самом начале. Быстрый способ – взять ctrl_spine и сочленение spine и
сделать orient-ограничитель. Потом просто продвигаясь дальше, нажимая горячую
клавишу G (повторяет последнюю команду), чтобы завершить прикрепление остальных
сочленений позвоночника. (Для пользователей Max: если вы поместите меню
Constraint (Ограничение) в меню прямоугольника, то сможете запустить команду
сразу; после этого одно лишь выделение верхушки прямоугольника будет повторять
последнюю команду, выполненную в прямоугольнике. Но вместо инструментального
подхода Max мы рекомендуем скрипт, имитирующий Maya-стиль выделения объектов и
их прикрепления.)
16. Следующая вещь, которую вам нужно сделать – добавить контроллеру грудной клетки
некоторые собственные атрибуты, чтобы настроить переключение ИК/ПК. Добавьте в
ctrl_chest атрибут ikFK, минимальное значение 0, максимальное – 1, по умолчанию 1.
Соедините его с ik_spine.

Сжатие и растяжение спины


Придание позвоночнику способности сжиматься и растягиваться помогает предотвратить разрыв
грудной клетки и бедер, а также добавляет дополнительный слой более тонкого или расширенного
управления для аниматоров. Есть несколько способов настроить сборку таким образом. Как
техническому директору по персонажам, вам придется решить, хотите ли вы, чтобы сочленения
спины имели возможность масштабирования или перемещения; чтобы эти изменения были
ограничены неким диапазоном или просто показывались цветовым индикатором или как-нибудь
по-другому; чтобы их можно было включить или отключить; должен ли размер изменяться как в
режиме ПК, так и в режиме ИК. Эта функция, как и любая другая автоматизированная функция
сборки, должна включаться и отключаться, независимо от того, как вы ее настроите. (Для
игрового движка вам также понадобится узнать, поддерживает ли она масштабирование или
перемещение.)

Врезка. В качестве начальной точки хорошо по возможности применять


инструменты автоматизации или встроенные инструменты, при этом,
применяя к сборке скрипт, нужно убедиться, в том, что вы понимаете,
что этот скрипт делает. Скрипт из пакета Bonus Tool создает
растяжение, контролируя масштаб с помощью узла дистанции, вместо узла
длины дуги. В сочленениях для управления степенью сжатия или
растяжения используются пределы масштабирования, в то время как сам
масштаб контролируется через узел multiplyDivide (Y и Z реагируют на
значение X), а затем через узел plusMinusAverage, где значения от узла
multiplyDivide вычитаются, чтобы получить твердое значение
масштабирования, равное 1. Запуск этого сценария приводит также к
скрытию атрибутов перемещения сочленений позвоночника. Сценарий
довольно открытый, и я призываю вас обратить внимание на его строение,
чтобы понять, как он работает:

1. Настройте сжатие и растяжение этой сборки через масштаб сочленений помощью


встроенного Bonus Tools → Stretchy IK (Бонусные инструменты → Растягивающаяся
ИК). Выделите ik_spine и запустите скрипт; X указывает вниз, так что выберите X в
всплывающем меню. (Чем больше вы используете Bonus Tools, тем лучше, потому что
среди них есть множество инструментов, которые следовало бы полностью встроить в
Maya). Вы также можете воспользоваться сборкой сжимающегося и растягивающегося
позвоночника из второй главы, вместо бонусных инструментов.
2. После запуска скрипта вам нужно кое-что изменить в соответствии с настройкой вашей
сборки. Во-первых, нужно разбить родительскую связь локаторов расстояния, потому
что эти связи приводят к зацикливанию. Кроме того, нужно присвоить локаторам
названия. Назовите их ctrl_ikScaleLow и ctrl_ikScaleUp. Узел дистанции назовите
ik_spine_ScaleDistance.
3. Подчините ctrl_ikScaleLow узлу ctrlWaist, а ctrl_ikScaleUp – ctrl_chest. Это устраняет
цикл и передает слежение масштаба на контроллеры спины. Заморозьте перемещения
этих двух локаторов.
4. Как уже упоминалось раньше, нет быстрого способа отключить или приглушить эффект
растяжения. Но наша настройка хороша тем, что мы можем управлять размером
грудной клетки и бедер вместе или по отдельности.
5. Создайте новый собственный атрибут shape-узла ctrl_chest под названием squashSretch
(если хотите, можете назвать shape-узел xtraAttrs).
6. Затем создайте новый узел pairBlend. Удерживая Ctrl, выделите узел дистанции и
ctrl_chest в Outliner и откройте их схему в Hypergraph (рис. 7.68).

@Рис. 7.68. Новый узел и схема, созданные скриптом растягивающейся ИК

7. Узел pairBlend будет помещен между входными данными от ctrl_ikScaleUp к узлу


ctrl_ikScaleDistance. Наш собственный атрибут squashSretch, управляющий грудной
клеткой, будет ведущим для атрибута pairBlend.weight и будет смешиваться с любым
значением, заданным в узле pairBlend, при этом узел дистанции будет считать, что
расстояние не изменилось. На рисунке 7.69 показано соединение с узлом pairBlend, а на
рисунке 7.70 – окончательные соединения pairBlend с узлом дистанции.

@Рис. 7.69. Соединяя узел pairBlend

@Рис. 7.70. Окончательные соединения


8. Нам нужно добавить значение сочетания по умолчанию (default blend value), чтобы
позвоночник считал, что расстояние одно и то же. Выделите узел pairBlend и откройте
Attribute Editor. Установите для состояния покоя равные значения (In Translate1) и (In
Translate2). Перенастройка растягивающегося позвоночника теперь закончена.
Протестируйте его, вытянув спину вверх а затем уменьшив значение атрибута
squashSretch. Позвоночник должен вернуться к своей прежней длине, со значениями 1, 1
в спине и значением 1 - масштаба.
9. Как вы могли заметить, мы работали только с верхним локатором. Это значение сжатия
и растяжения работает только с верхней частью спины; управление талией все еще
растягивает спину. Эти же процедуры можно применить к нижней части спины. Таким
образом, мы получим обширное управление позвоночником в его максимальном
растяжении (рис. 7.71). Эффект сжатия и растяжения позвоночника точно так же
работает в ПК.

@Рис. 7.71. Верхнее и нижнее соединения с узлом дистанции спины

Врезка. Если вы производили эту настройку в Max, то вы могли вместо


инструмента Distance применить инструмент Measure вместе со списком
весов контроллеров, чтобы смешивать включение и отключение влияния на
размер.

Финальные контроллеры спины и чистка Outliner.


Чтобы завершить сборку спины, вам придется добавить еще одну управляющую форму,
которая будет основным контроллером верхней части туловища:
1. Создайте новый управляющий объект, как и при работе с грудной клеткой и бедрами, с
помощью сочленения и кривой. Назовите его ctrl_master и сгруппируйте, чтобы
получилась нулевая группа.
2. Новый контроллер будет находиться не в основании спины, а в центре тяжести. Где
именно, догадаться довольно легко, но можно наскоро сделать простое прикрепление.
Выделите root и оба бедра, а затем и узел ctrl_master_Zero. Сделайте точечное
прикрепление, а сразу после этого – Constrain → Remove Target (Прикрепить →
Удалить цель). Узел ctrl_master_Zero теперь будет в центре таза.
Вы даже можете приблизить его к положению на прямой линии с сочленениями бедер, в
зависимости от того, как, по вашему мнению, должен работать контроллер. При анимации этот
контроллер будет производить такой эффект, как если бы вы попытались наклониться, оставляя
ноги и таз в покое. Обратите внимание, что, когда вы откидываетесь назад, таз вращается
вокруг того места, где находится углубление для ноги, и поэтому вы не падаете. Это
совершенно особое движение, сильно отличающееся от поворота в основании позвоночника,
как, например, при выпаде тазом или его скручивании. Эта точка вращения также очень
заметна, когда вы садитесь или когда ваш зад находится на твердой поверхности.
3. Сгруппируйте ik_spine, ik_spineCurve и ik_spine_ScaleDistance. Назовите группу
ik_backrig_Grp.
4. Подчините ctrl_spine, ctrl_Waist_Zero и ik_backrig_Grp узлу ctrl_master.
5. Так как вы подчинили ik_spineCurve элементу, который также управляет кластерами,
двигающими кривую, то вы создали двойной сдвиг. Это легко исправить. Выделите
кривую и зайдите в Attribute Editor. Отключите опцию Inherits Transform
(Наследуемые Трансформации). Это простой способ сохранить важную для
организации геометрию в группах, при перемещении которой возникают проблемы.
6. С доступным для ctrl_Master диапазоном движений сборке необходим дополнительный
управляющий слой, во избежание блокирования шарнирного соединения. Просто
сгруппируйте его и назовите новую группу ctrl_Master_Gmbl. Обозначьте текстовый
объект в виде кривой (curve text object) буквами gm и подчините его shape-узел группе
ctrl_Master_Gmbl.
7. Создайте дополнительный атрибут shape-узла ctrl_Master под названием gmblCtrl.
Задайте логический тип значения. Соедините его собственный атрибут с видимостью
curveShapes группы ctrl_Master_Gmbl, чтобы аниматоры могли по необходимости
воспользоваться этой группой, но чтобы она была невидима для выделения. Если вы
соедините этот атрибут с видимостью управляющего узла-трансформы, то будет скрыт
а вся сборка спины целиком (рис. 7.72).

@Рис. 7.72. Завершенная сборка спины с собственными атрибутами для управления


шарнирным соединением

Врезка. Возможно, вам понадобится создать такие же дополнительные контроллеры на других


частях тела персонажа, например, в запястьях или в любом узле, который должен делать полный
поворот на 360º больше, чем по одной оси. Просто следуйте той же процедуре, создавая элементы,
управляющие перенастройкой вращения.

Переключение руки между локальным и мировым


Теперь, настроив сборку спины, мы можем снова обратиться к локальному и глобальному узлам
руки и подчинить их соответствующим контроллерам, или прикрепить к ним родительскими
ограничителями. Глобальный контроллер должен находиться в глобальном пространстве
персонажа, так что он останется там, где есть. Локальный контроллер будет прикреплен parent-
ограничителем к ctrl_chest. Его можно прикрепить к некоторым другим частям тела, например, к
голове, а потом дать пользователю контроль смешивания локального пространства, которое он
хочет использовать.
В зависимости от того, какой работы вы ждете от сборки при другом переключении локального
и глобального наследования, например, в случаях с руками и головой, можно применить
родительский ограничитель. При этом глобальное пространство будет не полностью глобальным
узлом, а под ctrl_master. Помните, что все глобальные ориентировки подчинены fkWorldOri_GRP.
Управляемое атрибутом переключение видимости
В этой теме нужно рассмотреть еще несколько переключений видимости. Сделайте так, чтобы
значение переключения ctrl_arm_L|xtraAttrs.worldLocal управляло видимостью узлов L и W.
Аниматорам нужно предоставлять как можно менее запутанный файл. Это часть конструирования
пользовательского интерфейса сборки. В случае с включением/отключением видимости атрибута
смешивания нужно убедиться, ясно ли художнику, когда в нем сочетаются глобальные и
локальные настройки, а когда он работает с чем-то одним. Применение Set Driven Keys – простой
и быстрый способ настроить это, но можно также прибегнуть к помощи узлов с условием. Когда
переключатель установлен на 0, работает глобоальное пространство, и L должен быть скрыт;
когда на 1, рука находится в локальном пространстве, и должен быть скрыт W. Любое смешанное
значение в промежутке между ними делает видимыми и L, и W одновременно.
Чтобы показать, когда аниматор работает в ПК, а когда в ИК, вы проделаете операции такого
же типа с ctrl_back, но только с цветами, а не с видимостью, так как спина может управляться и
ПК, и ИК одновременно. Изменение цвета может помочь аниматору догадаться, какие ключевые
кадры влияют на риг. Управляйте цветом в ctrl_chestShape под Display Overrides с помощью
пробного Set Driven Key, чтобы управляющий элемент в режиме ПК переключался от синего по
умолчанию на голубой. Отличие небольшое, но его достаточно для быстрой подсказки о
настройках управляющего элемента. Поищите атрибут Override Color shape-узла, чтобы сделать
SDK.
Эти идеи можно внедрить целиком или же использовать лишь частично; идея обратной связи с
аниматором – одна и та же. Чем больше времени тратится на то, чтобы вникать в действия сборки
после анимации, тем больше времени займет анимация или исправление неполадок сборки.
Последний способ облегчения управления сборкой – контролировать возможность выделяемости
объектов, управляя значением переназначения ссылок (reference override value), при этом
оставаясь вне слоев, чтобы персонаж сохранял самостоятельность. В этом случае на него можно
легко установить ссылку, многократно импортировать в файл или даже сохранить, с тем чтобы
отослать на рассортировку анимации.
Дополнительные визуальные индикаторы, например, линии, соединяющие плавающие
управляющие элементы (такие, как полярные векторы рук), тоже удобны и легко делаются либо с
кластерами и двухточечной кривой, либо с помощью чего-нибудь вроде команды аннотации для
создания стрелки (arrow) и текстовых пометок для управляющего элемента.
Врезка. Вот совет для пользователей Maya. У вас есть возможность
разобраться с отображением сочленений, ветвящихся в таких местах, как
бедра или грудная клетка. Установите Draw Style (Стиль Прорисовки)
сочленения, которому подчинены все ветвящиеся узлы, на Box, а не на
Bone, и файл визуально будет быстро упорядочен гораздо меньшими
усилиями.
В версии 6.5 появилась возможность управлять размером сочленения
через файл и через конкретное сочленение, что позволяет произвести
упорядочивание и отладку. В версии 6.0 эти настройки были глобальными,
от файла к файлу.

Риггинг правой руки


Может показаться странным, что мы откладывали до этого момента риггинг правой руки. Так как
сборка руки, из за количества соединений с другими частями сборки это одна из наиболее
сложных систем персонажа, проще полностью закончить одну руку и убедиться, что она работает,
а потом зеркально отразить ее на другую сторону или скопировать строение с рабочего варианта.
В этой книге мы советуем вам создавать последний вариант, чтобы вы лучше понимали процесс
риггинга. Тем не менее, вы можете пойти путем отражения части сборки, если вы уверены, что
понимаете её устройство.
Для зеркального отражения сборки может потребоваться много работы: настройка соединений
между ограничителями, собственными атрибутами и сетью utility-узлов. Как утверждалось
вначале, лучше всего по возможности автоматизировать этот процесс. Следующая часть
познакомит вас с отражением сборки с помощью Hypergraph и чистого файла для отражения.
Пока вы работаете над созданием отражения сборки, лучше избавиться от всего того, что
непосредственно не относится к риггингу руки. Первый шаг в отражении сборки руки – взглянуть
на все узлы, составляющие руку, и проверить входящие и исходящие соединения компонентов
руки:
1. Примените Outliner, чтобы отфильтровать только названия с *arm*; будут показаны все
узлы, относящиеся к сборке руки и те узлы, которым они подчинены. Следуйте дальше
и удалите все, что не является частью системы руки – ноги, голову, контролирующие
ИК и так далее (рис. 7.73).

@Рис. 7.73. Отправная точка для начала отражения руки

2. Так как с правой рукой вы работаете в новом файле, следуйте дальше, ищите в именах L
и меняйте на R. Еще вам придется удалить все ограничители и соединения для ваших
новых контроллеров. Соединения будут установлены в окончательном файле, и вы
должны убедиться, что импортируются только чистые контроллеры, и не один из них не
должен внести с собой дополнительные присоединенные к ним узлы. Чтобы избавиться
от них, следуйте пунктам меню Edit → Delete All by Type → Constraints
(Редактировать → Удалить все по типу → Ограничители) (рис. 7.74).

@Рис. 7.74. Удаление всех ограничителей и других ненужных узлов

3. Затем давайте обратим внимание на простые элементы, как, например,


ctrl_worldLocal_arm_R. Так как точки опоры контроллеров не меняются, то для
создания отраженной версии вы просто переместите вершины управляющей формы, на
восемь юнитов, посредством привязки к сетке.
4. Теперь можно отразить сочленения, включая цели orient-ограничителей.
5. Сгруппируйте все, что осталось в файле, кроме сочленений (вы должны будете разбить
дочерние связи контроллеров, основанных на сочленениях), и отрицательно
отмасштабируйте по X, чтобы перевернуть все узлы. Чтобы заморозить перемещения,
вам нужно разбить все соединения узлов. После этого заморозьте перемещения и
разбейте все подчинения этого группового узла. Сохраните этот файл.
6. Загрузите этот чистый файл в файл главной сборки. Начните добавлять ИК-
манипуляторы в скелет правой руки и в сборку лопатки. Назовите их так, чтобы имена
совпали с именами левых ИК-манипуляторов. Все узлы-трансформ были отражены,
поэтому новый ik_arm_R можно подчинить aux_armZero_R, а его – узлу pgWorld (рис.
7.75).

@Рис. 7.75. Новые узлы руки, подчиненные основной иерархии

7. Прикрепите ik_arm_R полярно-векторным ограничителем (pole vector constraint) к


ctrl_elbow_R, а aux_blend_R – точечным ограничителем к ctrl_arm_R, точно так же, как
с другой рукой.
8. Продолжайте заново подчинять и прикреплять узлы правой руки, пока они не будут
идентичны левой руке. Когда это будет сделано, можете подключить все заданные
атрибуты и сети узлов. (Иногда вращение или ориентацию отраженных сочленений
нужно исправлять или заново приводить в соответствие с первоначальными
сочленениями после подчинения, так что следите за тем, чтобы вращения сочленений
во время работы оставались нулевыми.)
Это занятие может быть очень утомительным, но знать, как отражать более или менее сложную
сборку, полезно. И снова, несмотря на это, что мы делаем акцент на важности скриптов в тех
случаях, когда вам нужно сделать больше, чем одну персонажную сборку, или даже одну
сборку, которую нужно будет доработать или исправить позднее.
После того, как все узлы подчинены и прикреплены, вы готовы к подключению собственных
атрибутов, отраженных вместе с контроллерами.
9. Постепенно продвигаясь глубже, начните с контроллеров кисти. Выберете их и левые, и
правые и отобразите их соединения. Это позволит вам увидеть, какие узлы и атрибуты
соединены, и вы сможете дублировать utility-узлы левой руки и подключить их к
правой. В зависимости от атрибутов, которыми вы управляете, вам, возможно, придется
добавить знаки «-» (минус) к узлам unitConversion, чтобы значения атрибутов
производили такой же результат.
10. Чтобы сделать возможным автоматическое выделение на правой руке, вам нужно
просто добавить узел описания, как и слева, и еще добавить в узел описания руки
собственный атрибут selHand типа string и соединить его с пальцами. (Так как вы
отразили сочленения, собственные атрибуты уже будут присутствовать в них.)
11. После того, как вы прошли через все это и закончили с соединениями узлов и
атрибутов, отобразите схему обеих рук, которая выглядит как рисунок 7.76. Кое-что на
заметку: вы можете дублировать узлы Set Driven Keys, но чтобы они работали на
правой руке, их значения нужно перевернуть в Graph Editor.

@Рис. 7.76. Совпадающие схемы управляющих элементов обеих рук после соединения
вручную

Исправления ноги: избавление от вращения, наследуемого от бедер


Обратившись снова к риггингу ног, мы увидим, что все работает отлично. Всё, кроме вращения,
вызванного методом, каким мы настраивали полярный вектор, чтобы нога не переворачивалась.
Побочный эффект заключается в том, что родительский узел ноги, заставляет ее вращаться.
Колено направляется в противоположную сторону внешнему контроллеру стопы, и аниматоры
вынуждены контр-анимировать ногу. Чтобы решить эту проблему, мы собираемся исключить
любое вращательное влияние бедер на сочленения ноги:
1. Создайте пустую группу и подчините ее bn_hips. Назовите ее ctrl_leg_GRP_R.
2. Нужно привязать групповой узел к вершине сочленения ноги и заморозить
перемещения.
3. Выделите ctrl_upLeg_R и ctrl_upLeg_ori_R. Подчините их ctrl_leg_GRP_R.
4. Мы не хотим, чтобы вращение бедер влияло на ноги. Чтобы исправить это, начните с
создания пустой группы или нулевого объекта.
5. Назовите его ctrl_legs_Ori; он будет объектом привязки ориентации обеих ног.
Подчините его bn_hips и заморозьте перемещения; потом подчините его pgSkeleton.
Ориентация необходимая для следующего шага будет выровнена.
6. Присоедините ctrl_leg_GRP_R orient-ограничителем к ctrl_legs_Ori, который исключит
влияние bn_hips на ноги.
7. Опробуйте систему, повращав контроллеры бедер; верхняя часть ноги должна
двигаться, но когда вы поворачиваете бедра влево и вправо, колено должно по-
прежнему указывать точно вперед.
8. Проработав правую ногу, проделайте то же самое с левой, заменяя по необходимости R
на L.
Итоговая работа
Когда основные компоненты риггинга завершены и скреплены, файл с функциональной точки
зрения готов, но его все еще нельзя передать аниматору, не приведя в порядок. Очистка файла
подразумевает выполнение следующих шагов:
 Доделайте все видимые объекты для таких контроллеров, как например смешивание ИК/ПК;
 Создайте конечные группы и завершите очистку Outliner;
 Спрячьте и ограничьте видимость/выделяемость всех объектов, кроме только тех, которые
будут подвергнуты анимации;
 Заблокируйте и спрячьте все атрибуты, которые не будут анимированы;
 Создайте группы выделения как для анимационных контроллеров, так и для атрибутов сборки,
которые имеют значение для технического директора по персонажам;
 Настройте управляющие элементы так, чтобы автоматически выделялся тот инструмент,
который должен к ним применяться: режим вращения, перемещения или и то, и другое;
 если нужно, установите заданную систему pickwalk, чтобы аниматоры могли осуществить pick
walk up and down, не выделяя не предназначенный для захвата управляющий элемент.

Врезка. Блокируя и скрывая атрибуты, помните, что хорошо бы


скопировать и вставить содержимое Script Editor в текстовый файл. Это
быстрый способ скрыть и вновь показать все мелкие часты сборки, так
что потом вы сможете доработать и наладить сборку, не затрачивая
дополнительных и совсем ненужных усилий. В Maya 6 есть возможность
фильтровать выходные данные, не включая в них все результаты,
информацию, предупреждения или сообщения об ошибках. Так, копируя и
вставляя, вы сможете создать очень чистый скрипт.

Видимая обратная связь


Первым этапом очистки станет завершение добавления цветных контроллеров руки, дающих
аниматорам знать, что они находятся в определенном режиме. Точно так же мы поступали с
контроллерами спины. Так как proxy-геометрия находится на слое, вы должны разбить соединение
с переопределением цвета (override color), чтобы связать его с атрибутом IKFK. Это приведет к
тому, что модель больше не будет связана со слоем, но вы можете просто переназначить её к
слою, так как цвет имеет входящее соединение. Переключение цвета тем не менее будет работать,
потому что слой не смог разбить соединение SDK.
Еще один простой способ показать, в каком состоянии находится контроллер, – включить или
выключить текст или примечания, в зависимости от значения атрибута. Например, в случае с
руками вы можете сделать видимым небольшой текстовый объект рядом с ИК контроллером руки,
в котором IK задается ярким цветом, что дает представление о том, в каком режиме находится
сборка.
Каким бы образом вы, как технический директор по персонажам, не пожелали бы организовать
обратную связь с аниматором, важно, чтобы вы сделали что-нибудь для сообщения состояния
сборку, чтобы было легко работать с ним и анимировать.

@Рис. 7.77. Отображение линий


Чтобы сделать простое, наглядное соединение между плавающим контроллером, таким как
локтевой, и управляемыми им сочленениями, создайте простую двухточечную кривую. Таким
кривым требуются только две вершины, чтобы образовать линию. Создайте кластеры для двух
точек кривой и подчините один верхнему сочленению руки, а второй – локтевому контроллеру.
Теперь, куда бы вы ни сдвинули локтевой контроллер, система дает очень четкую видимость
соединения с управляемой им частью, держа ее отдельно от всего остального. В нашем файле узлы
называются ctr_elbowDisplay_L или R.
Приведение Outliner в порядок
Чем лучше упорядочены Outliner и иерархия файла, тем быстрее работа со сборкой и её
редактирование и тем проще её анимировать, поэтому нужно убедиться, что все элементы
сгруппированы и упорядочены как следует. В Maya изменение порядка в Outliner также служит
для управления порядком выделения; например, перенесение узлов ближе к вершине Outliner
приводит к тому, что они просчитываются первыми в схеме сцены (scene graph). Это напрямую
влияет на то, как элементы выделяются и просчитываются, так что вам нужно постараться и
держать контроллеры в иерархии выше, чем все остальные. Рисунок 7.78 показывает
единственный возможный способ сгруппировать и упорядочить Outliner. Здесь виден скелет,
контроллеры и дополнительные части, которые трогать не надо. Группа контроллеров выше в
списке, чем скелет или «неприкасаемые узлы», потому что мы хотим, чтобы контроллеры
выделялись первыми, даже если их перекрывают другие объекты.

@Рис. 7.78. Чистка групп в Outliner

Блокировка и скрытие
Завершающая стадия «уборки» включает в себя очистку каждого узла сборки, чтобы анимированы
были только те атрибуты, которые должны быть анимированы, а каналы, для которых не должны
быть установлены ключи, остались без ключей. Это не удерживает аниматоров от отмены скрытия
и блокировки этих атрибутов, но всё же это полезно для предотвращения подобных действий.
Если вы можете применить ссылки на файлы в вашей сборке или уже применяете, то все, что вы
заблокировали или скрыли, аниматор изменить не сможет, также этот способ защищает кривые и
соединения SDK от ошибочного удаления. Еще это выгодно тем, что меньшее количество
ключевых кадров означает меньше кривых данных, меньше узлов и меньше соединений, и все это
сохраняет скорость работы сборки. Если у некоторых контроллеров способность посмотреть
значение атрибута может быть полезной для обратной связи, то не прячьте его, а просто
заблокируйте. В хорошо скрытых контроллерах я обычно блокирую атрибуты, а не прячу их. Во
всех контроллерах, которые затрагивает аниматор, я блокирую и скрываю атрибуты.
Не забудьте включить и отфильтровать выходные данные Script Editor для всех атрибутов,
которые вы заблокировали и скрыли, и объектов, видимость которых вы включили или
отключили. Это позволяет очень быстро копировать/вставлять скрипт, чтобы включить или
отключить все, что должно быть спрятано или заблокировано, когда вам нужно углубиться в
редактирование сборки. Чтобы вновь показать все, вам нужно написать только быстрый цикл for.
Он пробежится по всем узлам, сделает их видимыми, покажет и разблокирует основные атрибуты.
После блокировки и скрытия атрибутов нужно заблокировать и скрыть те части сборки,
которые не должны быть выделены аниматорами. Быстрый способ – просто сбросить все на
отдельный слой, и готово. Трудность тут в том, что первое, что люди делают, когда открывают
файл, – отображают все. Аниматоры пользуются скрытием и отображением постоянно, чтобы
видеть только определенные части персонажа, и из-за этого нам нужно подойти к скрытию
творчески. Чтобы скрыть любой объект и расправиться с проблемой «показать все», нужно
проверить, что вы заблокировали атрибут видимости объекта. На некоторых объектах вы должны
сначала сделать атрибут видимости видимым в Channel Box, а потом заблокировать его.
На этом этапе вы также можете вернуть обратно всем ярко-желтым сочленениям цвета по
умолчанию в соответствии с частями тела, так как они были сделаны желтыми только для того,
чтобы нам было проще настраивать объекты. Но все-таки лучше записать это в скрипт
отображения мелких деталей, ради возможности вернуть сборку к начальному состоянию.
Также частью очистки модели является проверка того, что аниматоры не выделяют proxy-
геометрию, не предназначенную для управления ПК анимацией. Так как все части модели
находятся в слое, слой можно держать без изменений, но нужно разбить управляемое слоем
соединение, которое позволяет устанавливать значение шаблона или ссылки на каждый объект
модели. Ниже приведен простой цикл for, используемый для разрушения всех связей слоя на всех
выделенных частях модели.

//убивает соединение слоя


{
string $sel[] = `ls –sl`;
for ($obj in $sel) {
CBdeleteConnection ($obj + “.ovdt”);
}
}

Запустив сценарий, примените контроль каналов, чтобы переместить overrideDisplayType в


раздел keyable и установите для него ключевой кадр, чтобы не допустить соединения слоя с ним
после того, как мы переназначим модель слою. Таким образом, слой все еще управляет
видимостью, но мы управляем типом отображения. Если вы вообще не хотите применять слой, то
можете создать главный атрибут proxy-модели, управляющий видимостью всех её частей. Теперь,
получив контроль над моделью, установите её как ссылку на все, что не будет использоваться как
ПК контроллер.
Чтобы вы могли использовать слои, вы должны сохранять входящие соединения любых узлов,
которые будут установлены как ссылки. Мы можем оставить ключевые кадры, но тогда
появляется шанс легко удалить их по ошибке. Вместо этого просто установите собственный
атрибут в pgWorld –Enum – и сделайте три значения: Normal, Template, Reference. Назовите
атрибут prxyViz. Соедините значения с входными каналами атрибута displayOverride proxy-
геометрии. Это позволяет нам управлять ими из одной части сборки и не дает управление слою.
Чтобы полностью удалить слой из proxy-модели, можно также добавить в pgWorld атрибут
видимости prxyVisibility и подсоединить его ко всем атрибутам видимости prxyShape.

Группы выделения и группы персонажей


Создание групп выделения контроллеров может оказаться лучше, чем лишь предположение о том,
что группировка и именование сами по себе сделают сборку простой в редактировании. Трудность
здесь в том, что, пытаясь держать все в нужных группах, вы можете нажить себе дополнительной
работы, с целью добавления большего количества ограничителей или, обдумывая как нужно
соединить контроллеры, когда на самом деле узел просто должен быть подчинен части сборки.
Так как группы выделения не зависят от иерархии, они представляют собой совершенный
инструмент для группировки компонентов сборки. Как минимум, нужно создать группу для
каждой системы сборки, например, для сборки всего позвоночника, рук, ног и головы. Это делает
файл легко редактируемым для вас или для кого-то ещё, без необходимости просматривать всю
иерархию, чтобы найти все компоненты сборки.
Группы персонажа будут настроены как для Trax-совместимости, так и для того чтобы сделать
возможной группировку всех данных анимации, независимо от иерархии. И, снова, это очень
удобно и освобождает вас от беспокойств по поводу управления ключевыми кадрами, с которыми
при большом количестве контроллеров могут возникнуть некоторые проблемы. Это особенно
важно при попытке сохранить синхронизацию чего-нибудь вроде переключения ИК/ПК в руке.
Мы советуем вам построить группу персонажа или подгруппу из всех узлов, которые нужно
анимировать в ИК и ПК, а также других узлов, которые могут повлиять на переключение режимов
руки, в том числе локтевой полярный вектор или узлы ключиц. Для настройки подперсонажа
также будет хороша и другая группа узлов – пальцы. Это упрощает управление, размещение и
установку ключевых кадров для пальцев.

Врезка. Замечание насчет именования: так как некоторые атрибуты


называются одинаково и принадлежат узлам, которые так же называются
одинаково, нужно убедиться, что узлы, находящиеся на одном и том же
уровне, различаются по крайней мере буквами L и R, иначе вы не сможете
различить атрибуты. Это легко исправить и потом, если понадобится.

Автоматическое выделение инструмента и настройка прохода


выделения
Один из лучших способов сделать работу со сборкой быстрее – настроить контроллеры так, чтобы
они автоматически переключались на тот инструмент, который должен с ними использоваться. ПК
контроллеры являются вращаемыми, и при их выделении текущий инструмент должен
переключаться на Rotate. Перемещаемые контроллеры должны переключать вас на инструмент
Move и так далее. Так же в Maya есть мульти-манипулятор, позволяющий вращать и перемещать
одновременно и который нужно устанавливать на такие узлы, как контроллеры ног или головы,
где один и то же контроллер и вращается и перемещается. Это один из лучших способов
визуально усилить представление о том, что конкретный контроллер персонажа из себя
представляет.
Применение встроенного в Maya метода требует работы в режиме выделенного манипулятора и
предполагает, что вы настроите переключения инструмента в зависимости от объекта с помощью
атрибута showManipDefault, который можно установить через Mel или в меню Display в Attribute
Editor.
Другой способ сделать это – использовать такой же скрипт, как в сборке руки, когда он видит
собственный атрибут и даже может прочитать настройки манипулятора атрибута
showManipDefault. Скрипт может напрямую установить инструменты Rotate, Translate или Scale,
что избавляет вас от необходимости находиться в режиме выделения. На самом деле, в скрипте
сборки руки это выполнялось командой RotateTool.

Врезка. Для пользователей Max существует скрипт под названием SMART


SELECT v.0.1, написанный Мартином Ван Херком (Martin Van Herk). Он
доступен на http://www.scriptspot.com. Этот скрипт позволяет делать то
же самое, что и наш, но текстовые команды, запускающие инструмент
Scale, Rotate или Translate, нужно вводить в пользовательских
настройках (user properties) объекта. (Пользовательские настройки
объекта в Max – это то же самое, что вкладка Notes (Заметки) в
Attributes Editor в Maya.)

Вот аналогичный Maya скрипт, размещенный на Highend 3D listserv Шахаром Левави


(http://www.levavi.net/). Чтобы воспользоваться им, добавьте собственный атрибут в каждый
контроллер сборки (руки, бедра, ноги и т.д.) и назовите его defaultTool.
Это атрибут типа Enum с тремя опциями: 0, 1 или 2 (или move, rotate, scale). После этого
добавьте скриптовый узел, который выполняется каждый раз при запуске файла.
В скриптовый узел поместите этот скрипт.

////////////////////////////////////////////////////////////
global proc SL_toolSwitch()
{
scriptJob –e “SelectionChanged” “whichTool”;
}
global proc whichTool()
{
string $gTools = ‘currentCtx’;
string $obj[] = ‘ls –sl’;
if (size($obj) != 0)
{
if (‘attributeExists “defaultTool” $obj[0]’)
{
string $tool = ‘getAttr ($obj[0] + “.defaultTool”)’;
switch ($tool)
{
case “0”:
$gTools = “moveSuperContext”;
break;
case “1”:
$gTools = “rotateSuperContext”;
break;
case “2”:
$gTools = “scaleSuperContext”;
break;
}
}
}
setToolTo $gTools;
}
////////////////////////////////////////////////////////////

На рисунке 7.79 показана окончательная сборка с группами персонажа, окончательными


группами и группами выделения.

@Рис. 7.79. Окончательная сборка.

Законченная сборка, на самом деле никогда не может быть законченной. Попав в производство
она проходит через изменения и переработки, подвергается тонкой регулировке. Будем надеяться,
что идеи, обсуждавшиеся в этой главе и во всей книге, помогут вам создать стабильную, быструю
сборку, которая станет твердой основой вашей работы.

Глава 8
Пропсы и интерактивные аксессуары.
С пропсами $$Под «пропсами» подразумеваются некие аксессуары и предметы взаимодействия,
такие как оружие, стаканы, фонарики и т.д. – прим ред. $$ дело обстояло нелегко с самого
появления 3D анимации. Иерархическая природа трехмерной анимации не давала просто брать и
устанавливать объекты в персонажах. По мере совершенствования анимационного программного
обеспечения появились разнообразные инструменты, упрощающие управление пропсами.
Разработка ограничителей позволила объектам выходить за пределы иерархии. Но теперь, с
появлением новых инструментов, появились и новые вопросы. Как организовать пропсы
наилучшим образом?
Прежде чем заняться пропсами, важно сделать кое-какую подготовку и задать некоторые
вопросы. В случае с пропсом нужно в первую очередь определить его статус, то есть узнать,
является ли он неотъемлемой частью персонажа. Если вы настраиваете такой персонаж, как
Hellboy, который всегда держит необычное оружие, то пропс всегда должен быть со сборкой, и,
вероятно, он будет настроен для постоянного взаимодействия с персонажем. Другие пропсы могут
взаимодействовать с ним на протяжении нескольких сцен, например, когда он пьет из банки с
газировкой, а потом ставит ее на место.

Простое переключение ограничителя пропса


Как персонажный риггер, вы не раз попадете в такие ситуации, когда будет необходимо закрепить
один объект между двумя другими и сделать так, чтобы он мог легко переключаться от одного к
другому. В случае с пропсами всё это можно легко настроить в один прием, также как основное
управление самим персонажем. Система ограничителей и узлов в Maya как раз приспособлена под
переключения объекта между двумя локациями через переключение ограничителя. В этом разделе
рассказывается о создании такой переключающей системы использующей ограничители в Maya. В
следующих разделах мы рассмотрим переключение ограничителя между множественными
локациями.
Для начала давайте обратимся к настройке системы ограничителя, которая может легко
переключаться между двумя целями:
1. Откройте файл reverseConstraint_start.ma (рис. 8.1). Его можно найти на
http://www.courseptr.com/downloads. Вы увидите простую кисть, цилиндр и контроллер
глобального пространства в виде кривой NURBS. Идея заключается в том, что цилиндр
prop будет настроен на смешивание местоположения между кистью и кривой NURBS,
которая действует как контроллер.

@Рис. 8.1. Сцена reverseConstraint_start.ma

2. Выделите цилиндр. Он должен быть расположен в точке отсчета. Нажмите Ctrl+g,


чтобы сгруппировать его. Назовите новый узел prop_pivot. Этот узел будет служить в
качестве узла сдвига: он может быть анимирован и будет задействован, если аниматору
понадобится внести корректировки в пропс.

Врезка. Обратите внимание, что геометрия пропса сгруппирована под


узлом prop_pivot. Это позволяет довольно легко заменить её в любое
время. Этот небольшой объект можно заменить группой объектов, и
текущая точка опоры этой группы не имеет значения, главное разместить
ее лишь опираясь на узел prop_pivot.

3. Нажмите Ctrl+g, чтобы снова сгруппировать узел prop_pivot. Переименуйте этот новый
узел в prop_attach. К этому узлу и будет применен ограничитель. Иерархия должна
совпадать с той, что на рисунке 8.2.

@Рис. 8.2. Иерархия, управляющая геометрией пропса

4. Теперь пора установить местоположение пропса на кисти. Создайте пустую группу с


помощью меню Create → Empty Group (Создать → Пустая группа), или просто
нажмите Ctrl+g, ничего не выделяя. Назовите новую группу prop_wrist_null.
5. Выделите сочленение wrist. Это то сочленение, к которому будет прикреплен пропс.
Так как объект будет находиться в ладони персонажа, нужно, чтобы он двигался всякий
раз, когда двигается узел, отвечающий за деформацию кисти. Удерживая Shift,
выделите узел prop_wrist_null, затем создайте точечный ограничитель и
ориентационный ограничитель.
6. Создайте локатор и назовите его prop_wrist_attach. С выделенным локатором выделите,
удерживая Shift, узел prop_wrist_null и нажмите p, чтобы создать между ними
родительскую связь.
7. В Channel Box установите перемещения и вращения узла prop_wrist_attach на 0.

Врезка. Обратите внимание, что целевой объект этого ограничителя не


связан с ИК-контроллером кисти. Очень вероятно, что в анимации ИК
контроллеры могут не использоваться, и поэтому не соответствовать
деформациям персонажа. Чтобы свести затруднения к минимуму, всегда
прикрепляйте пропсы к трансформам, деформирующим геометрию.

8. С помощью меню Create → Empty Group создайте новый нулевой узел. Переименуйте
его в prop_wrist_offset и подчините локатору prop_wrist_attach. Установите его
перемещения и вращения на 0.
9. Через меню File → Import импортируйте файл nurbSplineCube.ma с
http://www.courseptr.com/downloads. Переименуйте узел curve1 в prop_ctrl.
10. Теперь создайте еще одну пустую группу и переименуйте ее в prop_ctrl_offset. Это
будет узел, к которому прикрепляется собранный prop на NURBS контроллере. С
выделенным узлом prop_ctrl_offset выделите, удерживая Shift, кривую NURBS prop_ctrl
и нажмите p, чтобы создать родительскую связь. Установите перемещения и вращения
узла prop_ctrl_offset на 0. Когда вы закончите, Outliner должен выглядеть как на
рисунке 8.3.

@Рис. 8.3. Иерархия для присоединения пропса к ладони и глобальный контроллер пропса

11. Когда ничего еще не выделено, выделите узлы ctrl_prop_offset, ctrl_wrist_offset и,


наконец, prop_attach. Создайте точечный ограничитель и ориентационный ограничитель
с помощью меню Constaint $$ Меню “Constrain” можно найти предварительно выбрав
Animation-расположение главного меню - прим ред. $$.
12. Теперь пора сделать управляющий атрибут пропса. Размещение этого атрибута –
вопрос, который должен быть согласован риггером и аниматором. В нашем случае
контроллер будет размещен на NURBS кривой.
13. Выделите NURBS кривую prop_ctrl. Нажмите Ctrl-a, чтобы вызвать Attribute Editor.
Создайте атрибут под названием toHand с минимальным значением 0.0 и максимальным
1.0. Этот атрибут будет управлять переключением пропса.
14. Откройте окно Hypershade. Выделите кривую prop_ctrl и узлы prop_attach и отобразите
их входящие и исходящие соединения. Вы должны увидеть узлы и ограничители в окне
Hypershade.
15. В разделе General Utilities пункта Create создайте реверсный узел. Переменуйте его в
prop_reverse.
16. С помощью правой кнопки мыши соедините атрибут prop_ctrl.toHand с атрибутом
inputX реверсного узла, как показано на рисунке 8.4.

@Рис. 8.4. Соединение атрибута prop_ctrl.toHand с узлом prop_reverse

17. Соедините атрибут prop_ctrl.toHand с атрибутом prop_wrist_offsetW1 узлов точечного и


orient-ограничителей.
18. Соедините атрибут outputX реверсного узла с атрибутом prop_ctrl_offsetW0 узлов
точечного и orient-ограничителей.
19. Установите атрибут prop_ctrl.toHand на 1. Обратите внимание на то, что пропс
направлен в центр геометрии запястья. Выделите узел prop_wrist_attach и переместите
его так, чтобы пропс лежал на ладони. Когда вы будете довольны размещением,
примените к локатору Freeze Transforms,чтобы эта позиция стала положением покоя
(рис. 8.5).

@Рис. 8.5. Завершенная система реверсного ограничителя.

Врезка. Когда вы размещаете локатор prop_wrist_attach, убедитесь, что


вы настроили атрибут prop_ctrl.toHand, чтобы увидеть, как пропс
смешивает движения к руке и от нее. Во многих случаях вращение
локатора таково, что пропс при перемещении будет описывать дугу в
360º, а это обычно нежелательно, так как мешает гладкому переходу от
контроллера пропса к кисти. Это можно исправить, повернув локатор
prop_wrist_offset так, чтобы добиться более приемлемого положения.
Обычно поворот этого узла на 180º по оси Z решает проблему. Возможно,
придется немного поэкспериментировать, чтобы найти наилучшее
сочетание. Если локатор нельзя изменить, чтобы сохранить выровненное
положение, то попробуйте изменить поворот узла ctrl_prop_offset,
смягчая переход.

Теперь ограничитель готов. Изменив значение атрибута to.Hand, вы получите смешивание


перемещения пропса между его контроллером и локатором присоединения на ладони. Обратите
внимание на то, что весь пропс располагается вне иерархии, управляющей деформацией, так как
не было подчинений ни к одному из сочленений. Это удобно, потому что так систему пропса
можно удалить когда угодно, никак не повлияв на деформации. Пропс можно сгруппировать под
узлом, что упростит процесс его размещения и редактирования.
Также нужно обратить внимание на то, как пропс перемещается между своими локациями. С
orientConstraint пропс может неудачно перевернуться при настройке весов. Когда вращения
определены, Maya преобразовывает их из Эйлеровых в кватернионы, чтобы вычислить вращения.
Результат преобразовывается обратно в Эйлерово вращение. Недостаток этого заключается в том,
что кватернионовый решатель иногда берет альтернативный набор значений Эйлерова вращения
как искомый объект. Чтобы решить эту проблему, выделите orientConstraint и установите его
атрибут interpType на shortest. Это должно исключить нежелательные перевороты, пока две цели
ограничителей вращаются с учетом друг друга.
Возможно, вы также заметили, что вам действительно не нужны дополнительные узлы сдвига
под локатором и пропсом. Узлы сдвига – дополнительный слой гибкости, который, возможно,
никогда вам и не понадобится. Они занимают некоторое количество памяти и некоторую
вычислительную мощность, но их потолок довольно низок, и, с точки зрения предосторожности,
обычно лучше ошибиться. Если бы в этой сцене были сотни пропсов, думаю - был бы смысл
избавиться от дополнительных слоев.

Система одноручного пропса.


Итак, простой реверсный ограничитель хорошо работает с пропсами, имеющими только две
локации, но от некоторых пропсов требуется более сложное поведение. В этой книге мы работали
над фэнтэзийным персонажем, так что давайте продолжим и дадим ему оружие. Наш
воображаемый режиссер решил, что персонажу нужен грозный нож, чтобы кромсать врагов. Мы
взглянули на раскадровку эпизодов, где персонаж использует нож, и решили, что нож должен
помещаться только в правую руку персонажа и в ножны на поясе. Однако, предугадывая
требования проекта, мы добавим способность ножа свободно находиться в глобальном
пространстве. Правило риггинга – не перегружать сборку, но в нашем случае все эти операции не
потребует особых затрат, и сделать так, чтобы нож был свободен, довольно просто.
Теперь, когда мы знаем, что должен делать пропс, нужно обратить внимание на его геометрию
и на руку, которая должна его держать. Тут все довольно очевидно: у ножа есть рукоятка, а у
персонажа – руки, хорошо приспособленные для хватания. Кисть персонажа будет удобно
охватывать рукоятку, так что особой подгонки не потребуется.
Техника, которую мы используем для управления пропсом, будет включать в себя
присоединение его ограничителями к разным узлам. В Maya есть родительские ограничители
(parent constraints), которые позволяют динамически подчинять объекты, что очень полезно для
быстрой и легкой настройки пропса. Однако в случае с этим пропсом, который будет
использоваться очень интенсивно, родительские ограничители имеют несколько побочных
эффектов. Во-первых, при переключении от одного контроллера к другому нет гарантии в
сохранении местоположения пропса. Чтобы обеспечить в производстве постоянство персонажа,
который будет использоваться многими аниматорами, вероятность несовпадения должна быть
сведена к минимуму.
1. Откройте файл knife_start.ma. Он есть на http://www.courseptr.com/downloads.
2. Импортируйте файл knife.ma с того же Web-сайта. Вы увидите геометрию ножа и
ножен в сцене Maya. В Outliner должен быть показан новый узел под названием knife.
Если вы рассмотрите группу ножа, то увидите, что она содержит два узла,
составляющие геометрию ножа. Нож появится в точке начала отсчета (рис. 8.6).

@Рис. 8.6. Импортированная геометрия ножа

3. Создайте пустую группу и назовите ее sheath_geo_offset.


4. Выделив узел sheath_geo_offset, выделите также sheath_geo, удерживая клавишу Shift.
Создайте pointConstraint и orientConstraint.
5. С помощью инструмента Move разместите sheath_geo_offset так, чтобы геометрия
ножен размещалась сразу за торсом персонажа. Разместив, не запускайте Freeze
Transforms: это действие установит ориентацию ножен неверно.
6. Через меню File импортируйте nurbsSplineCube.ma. Это кривая NURBS, которую вы
примените для управления ножнами. Этот файл вы найдете на уже упоминавшемся
Web-сайте.
7. Выделите только что импортированную curve1 и переименуйте ее в sheath_ctrl.
8. Выделите узел sheath_geo_offset и затем, удерживая клавишу Shift, выделите sheath_ctrl.
Создайте pointConstraint и orientConstraint, чтобы выровнять sheath_ctrl с геометрией.
Удалите ограничители и примените инструмент Move, чтобы разместить кривую
sheath_ctrl соотносительно с ножнами, как на рисунке 8.7.

@Рис. 8.7. Размещение управляющей кривой ножен

9. Создайте новую пустую группу. Переименуйте ее в sheath_ctrl_Zero.


10. Выделите узел bn_hips и, удерживая клавишу Shift, выделите группу sheath_ctrl_Zero.
Создайте pointConstraint и orientConstraint
11. С помощью меню Window → General Editors → Channel Control (Окно → Общие
редакторы → Управление каналами) отобразите окно Channel Control. Переместите
атрибуты перемещения, вращения, масштабирования и видимости узла sheath_ctrl_Zero
в графу unkeyable.
12. Выделите sheath_ctrl и, удерживая клавишу Shift, выделите sheath_ctrl_Zero. Нажмите p,
чтобы создать родительскую связь.
13. Примените Freeze Transformations к узлу sheath_ctrl.
14. Выделите узел sheath_geo_offset и, удерживая клавишу Shift, выделите узел sheath_ctrl.
Нажмите p, чтобы родительскую связь.

Врезка. Задача узла sheath_geo_offset – сдвинуть вращения геометрии


ножен, поэтому он не должен находиться в положении покоя – в точке 0 0
0. Узел sheath_ctrl должен быть в положении покоя, но команда Freeze
Transformations заморозит перемещения во всей иерархии, в том числе и
те, которые будут влиять на вращение геометрии с учетом узла
sheath_geo_offset. Следовательно, исправления во вращении нужно делать
после заморозки трансформаций узла sheath_ctrl.

15. Выделите узел sheath_geo_offset. Выделите каналы в Channel Control и заблокируйте


их с помощью меню правой кнопки мыши.
16. Создайте пустую группу и переименуйте ее в knife_geo_ofset.
17. Выделите узел knife_geo_ofset, а затем выделите геометрию knife_geo. Создайте
pointConstraint и orientConstraint. В идеале геометрия ножа должна быть обнулена с
учетом точки начала отсчета, так чтобы при создании ограничителя геометрия не
перемещалась.

Врезка. Единственная задача этого узла – выступать в качестве цели


ограничителя геометрии: если геометрия была заменена, то она может
быть прикреплена к этому узлу, а узел можно передвинуть, если нужно.

18. Выделив узел knife_geo_ofset, нажмите Ctrl+g, чтобы создать новую группу.
Переименуйте эту группу в knife_pivot.
19. Снова импортируйте файл nurbsSplineCube.ma. Переименуйте импортированный узел
curve1 в knife_ctrl.
20. Для правильного выделения разместите с помощью инструментов Move, Rotate и Scale
кривую knife_ctrl в таком месте, которое хорошо соотносится с геометрией ножа (рис.
8.8).

@Рис. 8.8. Размещение управляющей кривой ножа

Врезка. В этом разделе значительная часть работы над пропсами


сосредоточена вокруг точки начала отсчета. Чтобы облегчить эту работу,
переключите видимость слоя персонажа и спрячьте сочленения в меню Show
(Показать), которое находится на панели моделирования.

21. Выделив knife_ctrl, с помощью меню Modify → Freeze Transformations обнулите


управляющий элемент.
22. Выделите узел knife_pivot и кривую knife_ctrl, удерживая клавишу Shift. Нажмите
клавишу p, чтобы создать между ними родительскую связь.
23. Выделив узел knife_ctrl, нажмите Ctrl+g, чтобы снова его сгруппировать. Переименуйте
получившуюся трансформу в knife_ctrl_Zero.
24. Теперь пора построить систему ограничителей. Создайте пустую группу и
переименуйте ее в knife_handR.
25. Выделив узел knife_handR, нажмите g, чтобы сгруппировать его. Переименуйте новую
группу в knife_handR_attach. У вас должно быть две пустых группы в простой иерархии.
26. Дублируйте эту иерархию и переименуйте верхний узел в knife_sheath_attach, а нижний
– в knife_sheath.
27. Еще раз дублируйте иерархию и переименуйте верхний узел в knife_world_attach, а
нижний – в knife_world.
28. На этом этапе у вас должно быть три иерархии из пустых групп, как на рис. 8.9.
Обратите внимание, что в названиях всех этих узлов есть префикс knife_. Если бы вам
понадобился больше, чем один проп, то это предупредило бы появление множества
узлов с названиями world или handR. В Outliner нажмите [+] после каждой группы,
чтобы развернуть иерархии. Удерживая клавишу Ctrl, выделите узлы handR, sheath,
world и knife_ctrl_Zero в этом порядке. С помощью команд Constrain → Point и
Constrain → Orient создайте точечный ограничитель и ориентационных ограничитель.

@Рис. 8.9. Иерархии пропса

29. В Outliner нажмите [+] после узла knife_ctrl_Zero, чтобы показать его иерархию.
Выделите узел knife_ctrl_Zero_orientConstraint1 и установите его Interp Type на shortest
в Channel Box или Attribute Editor. Это предотвратит нежелательные перевороты при
переключении между объектами.
30. Выделите узел ctrl_knife. Откройте Attribute Editor и создайте три новых атрибута под
названиями handR, sheath и world. Атрибуты должны быть типа float, и их минимальное
и максимальное значения должны быть установлены на 0 и 1. Значение атрибутов по
умолчанию должно быть 0, кроме атрибута sheath, который нужно установить на 1: это
будет положение пропса по умолчанию.

Врезка. Какое положение установить по умолчанию – это решать


техническому режиссеру и аниматорам. Всегда полезно определить
подходящее положение по умолчанию, так как это предотвращает ситуацию,
когда пропс при распространении файла находится в нежелательном
положении. Например, если по умолчанию нож был установлен на world, то
всякий раз, когда файл требовался для новой анимации, нужно было
вручную устанавливать пропс на sheath и handR. Это еще одна деталь,
которую нужно принять во внимание.

31. Следующий шаг лучше всего осуществляется в Hypergraph. В Outliner выделите,


удерживая клавишу Ctrl, узлы knife_ctrl_Zero, knife_ctrl_Zero_pointConstraint1и
knife_ctrl_Zero_orientConstraint1. В окне Hypergraph отобразите с помощью кнопки pod
racer входящие и исходящие соединения. Через контекстное меню правой кнопки
мыши соедините атрибут knife_ctrl_Zero.handR с атрибутом handRW0 узла
knife_ctrl_Zero_pointConstraint1. Повторите эту операцию для соединения атрибута
knife_ctrl_Zero.handR с атрибутом handRW0 узла knife_ctrl_Zero_orientConstraint1 (рис.
8.10).

@Рис. 8.10. Соединение knife_ctrl_Zero с ограничителями

Врезка. Порядок, в котором вы выделяете объекты ограничителей, влияет


на название атрибута, управляющего весом ограничителя. Имя первого
целевого узла при создании узла ограничителя должно иметь суффикс W0.
Имя второго объекта будет с суффиксом W1, третьего – с W2, и так
далее. При настройке и управлении множеством объектов ограничителей
важно давать им осмысленные названия, потому что это может быть
единственным способом проследить за ними при управлении весами.

32. Повторите эти операции с другими атрибутами узла knife_ctrl_Zero. Соедините атрибут
sheath этого узла c атрибутами sheathW1 точечного и ориентационного ограничителей.
Также соедините атрибут world с атрибутом worldW1 узлов ограничителей.
33. На этом этапе вы сможете контролировать, к какому объекту направляется нож,
настроив значения узла knife_ctrl_Zero. Хорошо бы спрятать атрибуты, заново заданные
ограничителями. Примените команду Window → General Editors → Channel Control,
чтобы открыть окно Channel Control. Подсветите атрибуты перемещения, вращения и
масштабирования (и видимости, если хотите) и переместите их в колонку non-keyable,
нажав кнопку Move в нижней части окна.
34. Теперь пора подобрать локации пропса. Выделите knife_ctrl_Zero и установите все
значения, кроме sheath, на 0. Установите значение sheath на 1. Нож должен находиться
рядом с точкой начала отсчета, там, где находятся пустые узлы.
35. Выделите узел sheath_ctrl и, удерживая Ctrl, выделите узел knife_sheath_attach.
Создайте точечный ограничитель и ограничитель ориентации. Нож должен двигаться
по направлению к ножнам, но размещены они не точно.
36. Выделите узел sheath и с помощью инструментов Move и Rotate разместите нож так,
чтобы лезвие было в ножнах и казалось, что оно надежно спрятано (рис. 8.11).

Врезка. Не замораживайте перемещения узла sheath: помните, что это не


контроллер. Это узел сдвига (offset node), и его не нужно обнулять.

@Рис. 8.11. Размещение цели ограничителя ножа

37. Когда он придет в правильное положение, выделите все каналы в Channel Box и
заблокируйте их с помощью контекстного меню. Через меню Window → General
Editors → Channel Control откройте окно Channel Control. Выделите keyable-каналы
узла sheath и переместите их в колонку unkeyable, нажав на кнопку Move.
38. Выделите узел knife_ctrl_Zero и установите все атрибуты, кроме handR, на 1.
39. Выделите сочленение hand_R и, удерживая Ctrl, выделите в Outliner узел handR_attach.
Создайте точечный и ориентационный ограничители .
40. Выделите узел handR и, воспользовавшись инструментами Move и Rotate, разместите
нож так, чтобы его рукоятка вкладывалась в ладонь воина (рис. 8.12).

@Рис. 8.12. Размещение ножа по отношению к кисти

Убедитесь в том, что нож плавно перемещается из ножен в руку. Даже при interpType
ориентационного ограничителя, установленном на shortest, если есть существенное различие в
ориентации узлов sheath и handR, то пропс все еще может вращаться не так, как нужно.
Следующие пункты раскроют процесс очищения объектов ограничителей для создания
гладкого смешивания:
1. Придайте персонажу такую позу, как будто он вытаскивает нож из ножен. Так как
это не формальная сборка персонажа, то для придания нужной позы вы можете
вращать непосредственно сочленения. В качестве примера вы можете использовать
рисунок 8.13.

@Рис. 8.13. Придание персонажу позы для совершенствования перемещения ножа из ножен в
руку

2. Когда персонаж будет находиться в нужном положении, выделите узел


knife_ctrl_Zero. Установите канал sheath на 1, а остальные каналы – на 0. Убедитесь,
что временной ползунок на нуле и нажмите s, чтобы сохранить ключевой кадр.
3. Переместите временной ползунок на кадр 10 и установите атрибут handR на 1, а
остальные – на 0. Сохраните еще один ключевой кадр.
4. Теперь подвигайте временной ползунок назад и вперед между кадрами 0 и 10. Если
все идет хорошо, то вы должны увидеть плавное перемещение. Если что-то не так,
посмотрите, по какой оси происходит скручивание. Пусть это будет ось Y.
Выделите узел handR и поверните его на 180º по оси Y. Например, если узел handR
отклонен на 35º, попробуйте повернуть его до 215º (180+35). Подвигайте временной
ползунок назад и вперед, чтобы проверить результат.
5. Теперь, когда ориентация установлена, удалите ключевые кадры узла
knife_ctrl_Zero. Потом заблокируйте каналы узла handR. Работайте в окне Channels
Control, чтобы заблокировать у каналов возможность создания ключевых кадров.
Выделите узлы world_attach, sheath_attach, handR_attach, sheath_ctrl_Zero и
knife_ctrl_Zero. Нажмите клавишу g, чтобы сгруппировать их вместе. Назовите
группу knife_rig.

Теперь пропс настроен. При анимации весов пропс будет сдвигаться от кисти к ножнам в
глобальном пространстве. Этот сдвиг сконструирован с целью использования в анимации, для
имитации настоящего перемещения пропса от одного объекта к другому.

Облегчение перемещения
Итак, пропс настроен для переключения, но сделать все это довольно тяжело. Эй, они наняли тебя,
чтобы аниматорам не приходилось отслеживать все эти нули и единицы, так?
Но все-таки было бы здорово, если бы вы автоматизировали переключение пропса так, чтобы
при переключении на кисть вам не приходилось бы вручную устанавливать все остальные
атрибуты на ноль, особенно учитывая то, что в любой анимированной сцене, возможно, придется
остановить движение пропса на полпути между ножнами и кистью. Было бы удобно настроить
систему, в которой установка одного объекта на on переключала бы остальные объекты на off.
Одно из решений – сделать так, чтобы целочисленное значение управляло весами
ограничителей через Set Driven Key. Значением может быть атрибут типа enum, добавленный в
knife_ctrl_Zero. Недостаток здесь в анимации. Пусть цели ножен присвоено значение, скажем, 0, а
цели кисти – 1, а глобальная цель представлена значением 2. В анимации перемещение от ножен,
или нуля, к глобальному пространству, или двойке, должно будет произойти через положение 1 –
кисть.
Обходным путём будет являться создание интерфейса, который будет автоматически
устанавливать атрибуты пропса. Если веса целей являются единственными объектами с
возможностью установки ключевых кадров, мы можем просто установить все атрибуты (кроме
нужным нам целей) на ноль. Наличие в Maya некоторых инструментов делает возможным
создание такой операции.
В следующем упражнении мы настроим мягкую, автоматизированную систему пропса.
1. Продолжайте предыдущее упражнение или отройте
файл /chapter08/scenes/knife/knife_part2.ma.
2. Выделите узел knife_ctrl_Zero.
3. В следующей части вы будете использовать Script Editor, так что убедитесь, что он
открыт. Через меню Edit → Clear All (Редактировать → Очистить все) очистите
историю и все входящие соединения.
4. В Channel Box установите атрибут handR на 1. Остальные целевые атрибуты (sheath и
world) установите на 0. Эти команды должны отразиться в Script Editor следующим
образом:
setAttr “knife_ctrl_Zero.handR” 1;
setAttr “knife_ctrl_Zero.sheath” 0;
setAttr “knife_ctrl_Zero.world” 2;
select –r knife_ctrl;
Команда выделения в скрипте не обязательна, так как узел knife_ctrl, вероятно, не будет
активно участвовать в анимации. Решения должны быть приняты аниматорами, совместно с
персонажными риггерами.
Теперь нам нужно создать несколько скриптовых узлов для оперирования управляющими
атрибутами ножа.
1. Выделите команды в поле истории и скопируйте их в буфер обмена, нажав Ctrl+c.
2. Через меню Window → Animation Editors → Expression Editor (Окно → Редакторы
анимации → Редактор выражений) откройте Expression Editor. С помощью меню
Select Filter → By Script Node Name переключите редактор на редактирование узлов со
сценарием.
3. В поле Script Node Name введите toHandR. В поле Script вставьте команды, которые
вы скопировали из Script Editor. Script Editor должен выглядеть как на рисунке 8.14.

@Рис. 8.14. Создание скриптового узла toHand

4. Держа окно Script Node открытым, выделите узел knife_ctrl_Zero. Измените значения
узлов handR, sheath и world на 1. Нажмите кнопку Test Script, чтобы проверить работу
команд.
5. Нажмите кнопку Create, чтобы создать Скриптовый Узел. Его имя должно добавиться в
список.
6. Создайте локатор и назовите его hand_switcher. Нажмите на клавишу g, чтобы
группировать локатор и назовите получившийся узел hand_switcher_Node.
7. Выделите сочленение hand_R и затем, удерживая клавишу Shift, выделите
hand_switcher_Node. Создайте точечный ограничитель.
8. Выделите локатор hand_switcher и используя инструмент Move, сдвиньте его от
сочленения запястья.
9. В командной строке введите следующее: buttonManip “scriptNode -executeBefore
toHandR” “ hand_switcher ”.
10. В Expression Editor скопируйте команды из скриптового узла toHandR, выделив их и
нажав Ctrl+c.
11. Нажмите кнопку New Script Node (Новый скриптовый узел), чтобы очистить настройки
в Expression Editor.
12. Вставьте команды в поле Script, нажав Ctrl+v.
13. Измените значения в выражениях с командой setAttr, чтобы установить атрибут
knife_ctrl_Zero.sheath на 1, а остальные – на 0, так же, как в следующем коде:
setAttr “knife_ctrl_Zero.handR” 0;
setAttr “knife_ctrl_Zero.sheath” 1;
setAttr “knife_ctrl_Zero.world” 0;
select –r sheath_ctrl;
14. И снова, автоматическое выделение узла sheath_ctrl необязательно.
15. В поле Script Node Name введите toSheath.
16. Нажмите кнопку Create, чтобы создать новый скриптовый узел. Он должен называться
toSheath (рис. 8.15).

@Рис. 8.15. Создание скриптового узла toSheath

17. В среде моделирования создайте локатор и назовите его sheath_switcher.Сгруппируйте


этот узел, нажав на g, и переименуйте его в sheath_switcher_node.
18. Выделите узел sheath и, удерживая клавишу Shift, sheath_switcher_node. Создайте
точечный ограничитель.
19. Переместите локатор sheath_switcher, немного отодвинув его от тела.
20. В командной строке введите следующую команду: buttonManip “scriptNode
-executeBefore toSheath” “sheath_switcher_node”.
21. Выделите узел sheath_ctrl и, удерживая клавишу Shift, sheath_switcher_node. Создайте
pointConstraint с помощью меню Constrain → Point.
22. Выделите узел sheath_switcher и разместите его так, чтобы он находился вне геометрии
(рис. 8.16).

@Рис. 8.16. Создание скриптового узла toWorld

23. Снова обратитесь к Expression Editor и нажмите на кнопку New Script Node. В поле
Script Node Name введите toWorld.
24. На панели Script введите следующие команды:
setAttr “knife_ctrl_Zero.handR” 0;
setAttr “knife_ctrl_Zero.sheath” 0;
setAttr “knife_ctrl_Zero.world” 1;
select –r world_attach;
25. При переключении на глобальное пространство глобальный узел, возможно, следует
выделить, просто потому, что ему, скорее всего, потребуется регулировка.
26. В среде моделирования создайте локатор и назовите его toWorld_switcher.
27. В командной строке введите следующую команду: buttonManip “scriptNode
-executeBefore toSheath” “toHandR1”.
28. Выделите в Outliner узлы worldSwitcher_Node, sheath_switcher_Node и
ctrl_switcher_Node, а также узлы манипуляторов. Наконец, выделите, удерживая Ctrl,
узел knifeRig и нажмите p, чтобы подчинить ему остальные .
Команда buttonManip создает сферу, которая, если щелкнуть по ней, выполняет команду
первого аргумента. Второй аргумент – это трансформа, с которой сфера перемещается.
Скриптовый узел содержит команды для установления весов ограничителя. При изменении
значений атрибута эти изменения записываются через установление ключевых кадров узла
knife_ctrl_Zero.
Команды buttonManip выполняются наилучшим образом, если они связаны с трансформой.
Когда трансформа двигается, buttonManip следует за ней. Здесь есть один недостаток: сфера,
являющаяся кнопкой, не может быть отмасштабирована, и всегда держит один размер в окнах
вьюпорта.
Важно знать причину использования buttonManips. В Maya можно применить reverseNode и
создать простой контроллер переменного веса. Когда один вес равен 0, другой – 1, и наоборот (для
получения дополнительной информации обратитесь к разделу reverseNode главы 1). Однако
балансирование между тремя и более весами усложняет задачу. Можно наложить реверсные узлы
и multiply-узлы, чтобы они управляли более чем двумя целями, но вы все равно придете к
множеству атрибутов, которые нужно установить на 0 или 1. Решение с buttonManip и скриптовым
контролем упрощает управление: вы можете установить столько контролирующих скриптов,
сколько нужно для данного количества целей. Обычно мы работаем со включенной функцией
автоключей. Если это не ваш стиль, можете добавить в контролирующие скрипты команду
setKeyframe, чтобы ключевой кадр сохранялся при переключении целей .
Эта ситуация чуть более управляема. Вместо постоянного соединения scriptNode вручную
устанавливает атрибуты, как если бы они были установлены в Channel Box.
Наведение блеска
Когда базовая система пропса для ножа в основном настроена, еще несколько штрихов сделают ее
чище. В то время как buttonManips очень полезная штука, нам всё же нужно немного освободить
экран. Для этого персонажа нож – скорее, вспомогательный пропс, поэтому имеет смысл скрыть
контроллеры, чтобы упростить работу аниматора. Основной контроллер пропса ножа – узел
knife_ctrl_Zero, так что он будет управлять еще и видимостью контроллеров пропса.
Следующие шаги иллюстрируют, как настроить управление видимостью buttonManips:
1. Откройте Outliner.
2. Выделите узел knife_ctrl_Zero и откройте Attribute Editor. С помощью пункта меню
Add Attribute добавьте логический атрибут под названием knifeSwitchControls.
3. Откройте Connection Editor. На левую панель загрузите узел knife_ctrl_Zero. На
правую – узел knifeRig. Проверьте, что кнопка в центре установлена на from→to.
4. Соедините атрибут knife_ctrl_Zero.knifeSwitchControls с атрибутом видимости узла
knifeRig (рис. 8.17).

@Рис. 8.17. Добавление управления видимостью переключения ножа

Теперь аниматор может контролировать видимость контроллеров, не обращаясь к Outliner. Так


как knife_ctrl_Zero – корневой узел пропса, то логично установить в нем особые атрибуты,
влияющие на функционирование контроллеров. Также обратите внимание на то, что атрибут
knifeSwitchControls имеет возможность установки ключевых кадров. На самом деле так не должно
быть, но иначе он не отображался бы в Channel Box. Каждое производство своеобразно, но для
нас предпочтительно, чтобы простота доступа перевешивала раздражения от невизуализирумых
контроллеров, анимируемых на включение и выключение.
Теперь пропс настроен, но допустим, что персонаж собирается положить нож на стол. При
переключении с правой руки на глобальное пространство возникает неестественный сдвиг. Его
можно скорректировать «на глаз» или с помощью временных ограничителей, но, возможно,
выгоднее встроить эту функцию в саму систему пропса. Для этого мы должны будем применить
скрипт, разработанный с использованием некоторого материала из главы 3: скрипт под названием
snapArgs. SnapArgs принимает в качестве входных данных имена двух узлов и привязывает второй
узел к первому, что очень похоже на ограничитель. Однако постоянного соединения нет, так как
сценарий лишь устанавливает значения атрибута.
Поведение, которое мы хотим установить, таково: всякий раз, когда модель переключается с
руки или ножен на мировое пространство, узел глобального пространства должен выравниваться
по положению и ориентации узла текущего присоединения. Все данные положения и вращения
ножа предоставляются узлом knife_ctrl_Zero. Это та трансформа, которая присоединяется к узлам
handR, sheath и world. Если узел worldCtrlWorld перемещается в положение узла handR, когда
пропс переключен не на руку, то пропс не сдвинется и перемещение будет плавным. Чтобы оно
было плавным, действуйте следующим образом:

Врезка. Важно помнить, какие трансформы влияют на пропс. Чтобы этот


процесс происходил плавно, вращения и перемещения узла ctrlKnife
должны быть обнулены.

1. Выделите узел knife_ctrl_Zero и откройте Attribute Editor.


2. Примените команду меню Attributes → Add Attribute, чтобы добавить логический
атрибут под названием worldAutoSnap.
3. С помощью меню Window → Animation Editors → Expression Editor откройте окно
Expression Editor.
4. Примените команду Select Filter → By Script Node Name, чтобы переключить редактор
в режим редактирования скриптового узла.
5. Выделите узел toWorld на панели Script Node.
6. В окне сценария перед любой из команд setAttr добавьте следующие строки (рис. 8.18):
if(`getAttr knife_ctrl_Zero.worldAutoSnap`)
{
select –r knife_ctrl_Zero knife_ctrlWorld;
snap();
}

@Рис. 8.18. Добавление команды привязки в узел со скриптом toWorld

7. Первая строка проверяет, нужно ли привязать узел глобального пространства к


положению пропса, когда происходит переключение. Чтобы совершить привязку, во
второй строке используется MEL-команда snap из третьей главы. Копия команды
привязки есть на Web-сайте http://www.courseptr.com/downloads.
8. Нажмите на кнопку Edit, чтобы внести изменения в скриптовый узел.
9. Выделите узел knife_ctrl_Zero и установите атрибут worldAutoSnap на on.
Теперь, если вы щелкнете по buttonManip руки или ножен, пропс будет двигаться. Если
щелкнете по buttonManip глобального пространства, то его контроллер привяжется к положению
активного в настоящий момент пропса. Он действительно привязывается в текущее положение
узла knife_ctrl_Zero до того, как меняет веса в ограничителе.
Двуручные пропсы
Итак, одноручный пропс довольно прост. Теперь мы рассмотрим двуручный. Здесь возникают
новые вопросы. Как пропс будет управляться? Будет ли он управлять движением рук? Как руки
будут управлять им?
Многие аниматоры предпочитают применять решения прямой кинематики, там, где это только
возможно. Помните об этом, при конструировании пропса разумно связывать его главное действие
с его основной рукой. Другую руку можно прикрепить ограничителем к точке на пропсе. Это
простое решение хорошо работает, пока не возникает необходимости в переключении рук пропса.
Давайте посмотрим, как одарить нашего персонажа дубинкой:
1. Скачайте файл staff_start.ma с http://www.courseptr.com/downloads.
2. С помощью команды File → Import импортируйте файл /chapter_8/scenes/staff_start.ma.
У точки начала отсчета вы увидите аксессуар персонажа.
3. Создайте пустую группу и переименуйте ее в staff_geo_offset.
4. Выделите узел staff_geo_offset и, удерживая Shift, узел staffGeo. Через меню Constrain
создайте pointConstraint и orientConstraint.
5. В меню File выберите Import и импортируйте nurbSplineCube.mb. Переименуйте объект
curve1 в staff_ctrl.
6. Выделите узел staff_geo_offset и, удерживая Shift, кривую staff_ctrl. Нажмите p, чтобы
создать между ними родительскую связь.
7. Выделите узел staffCtrl и сгруппируйте его, нажав Ctrl+g. Переименуйте группу в
staff_hand_L_attach.
8. Импортируйте еще одну управляющую кривую. Переименуйте узел curve1 в
staff_hand_L_ctrl. Прикрепленный к дубинке, он будет управлять левой рукой.
9. Выделите узел staff_hand_L_attach. Удерживая Shift, выделите узел staff_hand_L_ctrl.
Нажмите p, чтобы создать родительскую связь.
10. Выделите staff_hand_L_ctrl и подчините его узлу staff_ctrl.

@Рис. 8.19. Импортирование двуручного пропса персонажа

11. Выделите узел staff_hand_L_ctrl. Используя инструмент Move, сдвиньте его вниз по
рукоятке копья. Не обязательно ставить его именно в этой точке, мы просто
подготавливаем иерархию. Когда вы закончите, два контроллера должны располагаться
на дубинке так, как показано на рис. 8.20.

@Рис. 8.20. Создание управляющей геометрии аксессуара

12. Теперь займемся созданием узлов прикрепления (attachment nodes). Сначала создайте
пустую группу и переименуйте ее в staff_r_hand_offset. Сгруппируйте этот узел и
переименуйте его в staff_r_hand_offset_attach.
13. Выделите bn_hand_node. Удерживая Shift, выделите узел staff_r_hand_attach. Создайте
точечный и ориентационный ограничители.
14. Создайте пустую группу и назовите ее staff_world_offset. Сгруппируйте этот узел и
назовите получившуюся группу staff_world_space.
15. Выделите узлы staff_r_hand_offset, staff_world_offset и staff. Создайте точечный и
ориентационный ограничители.
16. Выделите узел staff_ctrl и откройте Attribute Editor. Через меню Add Attributes
создайте атрибут под названием toWorld с минимальным значением 0.0, максимальным
1.0 и 0 по умолчанию.
17. Откройте Hypergraph. Выделите узлы staff_ctrl и staff. Отобразите входящие и
исходящие соединения.
18. Соедините атрибут staff_ctrl.toWorld с атрибутом sWorldW2 узла staff_pointConstraint1 и
еще раз с таким же атрибутом узла staff_orientConstraint1.
19. Откройте Hypershade, в закладке Create выберите Maya Utilities (Утилиты Maya) и
создайте реверсный узел. Переименуйте его в staff_reverse.
20. В Hypergraph или Hypershade выделите реверсный узел и узел staff_ctrl. Отобразите
соединения.
21. Соедините атрибут toWorld узла staff_ctrl с атрибутом inputX узла staff_reverse, как
показано на рис. 8.21.

@Рис. 8.21. Соединение узла staff_ctrl

22. Соедините атрибут staff_reverse.outputX с атрибутами r_HandW1 узлов


staff_pointConstraint1и staff_orientConstraint1.
23. Копье должно быть выровнено по узлу r_Hand правой руки. Выделите этот узел и
примените инструменты Move и Rotate, чтобы правильно разместить копье. Нужно
определить ее место так, чтобы это выглядело естественно.
Этой настройки будет достаточно для вещей, предназначенных для одной руки, таких, как
трость, например. Мы собираемся сделать так, чтобы левая рука pigGoblin тоже захватывала
копье, придавая ощущение большей интерактивности. Так же мы хотим настроить левую руку так,
чтобы было смешивание обычных анимационных контроллеров сборки и контроллеров,
расположенных на копье. Это значит, что точка прикрепления левой руки к дубинке будет
снабжена объектами точечного и ориентационного ограничителей.
1. Придайте фигуре такую позу, чтобы контакт копья и левой руки выглядел наиболее
натурально. Вы можете воспользоваться этой возможностью, чтобы заново разместить
staff_ctrl рядом с точкой прикрепления. Если вы так поступите, то не забудьте
заморозить трансформации, чтобы установить положение покоя. Сверьтесь с рис. 8.22.

@Рис. 8.22. Регулировка положения узла staff_ctrl.

2. Теперь пора сделать первую цель для оружия. Выделите узел ctrl_wrist_ori_local. Если у
вас возникли трудности с его нахождением, введите его название в строке быстрого
выделения или введите в командной строке select -r staff_hand_L_ctrl.
3. Выделив узел, нажмите Ctrl+d, чтобы дублировать его. Переименуйте узел в
ctrl_wrist_ori_Staff_L.
4. Оставьте этот узел выделенным и, удерживая Ctrl, выделите узел staff_hand_L_attach.
Нажмите клавишу p, чтобы создать родительскую связь.
5. Выделите узел ctrl_wrist_ori_Staff_L и, удерживая Shift, узел ctrl_wrist_Zero_L. Через
меню Constrain → Orient Constraint установите дублированный узел как новую цель
ориентации.
6. Выделите узел ctrl_wrist_L|xtraAttrs. В Attribute Editor примените пункт меню Add
Attribute для создания нового атрибута под названием weapon. Назначьте ему
минимальное значение 0.0, максимальное 1.0. Значение по умолчанию должно
равняться 0.0.
7. Атрибут оружия будет управлять смешиванием между контроллерами левой руки и
копья. С помощью utility-узлов он будет прицепляться к различным ограничителям,
управляющим ориентацией руки. В Hypershade создайте реверсный узел.
Переименуйте его в staff_orient_reverse.
8. Следующие действия лучше всего выполнять в окнах Hypergraph или Hypershade.
Соедините атрибут ctrl_wrist_L|xtraAttrs.staff с атрибутом
ctrl_wrist_Zero_L_orientConstraint1.ctrl_wrist_ori_Staff_LW2. Это установит вес цели
оружия на 1.
9. Соедините атрибут ctrl_wrist_L|xtraAttrs.staff с атрибутом staff_reverse.inputX.
10. В Hypershade создайте узел multiplyDivide. Переименуйте его в staff_constraint_dampen.
Этот узел будет использоваться для изменения значений первоначальных целей руки на
0. Когда атрибут ctrl_wrist_L|xtraAttrs.staff установлен на 1, оба других веса – целей
глобальной и локальной ориентации – будут умножены на 0, и станут равны нулю.
11. Соедините атрибут staff_reverse.outputX с атрибутами staff_constraint_dampen.input2X и
staff_constraint_dampen.input2Y (рис. 8.23).

@Рис. 8.23. Соединение узла staff_orient_reverse с multiplyDivide-узлом staff_constraint_dampen

12. Соедините атрибут ctrl_wrist_L|xtraAttrs.wristFollow с атрибутом


staff_constraint_dampen.input1X.
13. Соедините атрибут reverse5.output с атрибутом staff_constraint_dampen.input2Y. Это
управление локальным и глобальным весами ориентации запястья.
14. Соедините атрибут staff_constraint_dampen.outputX с атрибутом
ctrl_wrist_Zero_L_orientConstraint1.ctrl_wrist_ori_Local_LW0.
15. Соедините атрибут staff_constraint_dampen.outputX с атрибутом
ctrl_wrist_Zero_L_orientConstraint1.ctrl_wrist_ori_World_LW1.
16. На этом этапе значения ограничителя ориентации на месте. Теперь пора создать
переназначение перемещения. Выделите узел aux_blend_L и дублируйте его.
Переименуйте узел в aux_blend_staff_L.
17. Выделив узел aux_blend_staff_L, выделите также, удерживая Shift, узел
staff_hand_L_attach. Нажмите на клавишу p, чтобы создать родительскую связь.
18. Выделите узел aux_blend_staff_L. Удерживая Shift, выделите aux_blend_L. С помощью
меню Constrain → Point Constraint установите aux_blend_staff_L в качестве цели
точечного ограничителя.
19. Создайте реверсный узел и переименуйте его в staff_point_reverse.
20. Соедините атрибут ctrl_wrist_L|xtraAttrs.staff с атрибутом
aux_blend_L_pointConstraint1.aux_blend:staff_LW1.
21. Соедините атрибут ctrl_wrist_L|xtraAttrs.staff с атрибутом staff_point_reverse.inputX.
22. Соедините атрибут staff_point_reverse.outputX с атрибутом
aux_blend_L_pointConstraint1.ctrl_arm_LW0.
Теперь настройка смешивания завершена. Персонаж должен выглядеть так, как на рис. 8.24.
Когда атрибут ctrl_wrist_L|xtraAttrs.staff установлен на 1, другие веса точечного и
ориентационного ограничителей умножаются на 0, и их значение становится равным нулю.

@Рис. 8.24. Законченный пропс

Создавая цели для левой руки, обратите внимание на то, проще будет продублировать и
переподчинить цель, особенно если в качестве цели вы используете сочленение. Сочленения с их
собственной ориентацией выравнивать нелегко. Вы также заметите, что пропс не должен
находиться в положении покоя для того, чтобы его можно было использовать как цель. В
сущности, к настройке двуручного пропса нужно отнестись внимательно именно потому, что его
нельзя настроить в обычном положении покоя. Можно обеспечить сохранность позы покоя,
установив всем контроллерам ключевой кадр в нулевом кадре анимации и работая с позой в
другом кадре.

Глава 9
Внимание на лицо
В этой главе два раздела посвящены лицевому риггингу. Чтобы как следует рассказать о риггинге
и моделировании лица, потребовалась бы целая книга. Она написана Джейсоном Осипой и
называется «Stop Staring». Нам повезло, и мы смогли взять интервью у арт-директора Кэлеба
«Cro» Оуэнса (Caleb Owens), который проделал в Digital Domain новаторскую роботу над такими
проектами, как «Digital James Brown», и позже демо лица Zoltar для nVidia полностью в реальном
времени. В дополнение к этому интервью у нас есть потрясающее руководство от Джоша Кэри,
художника по персонажам в The Animation Farm, который учился у Кэлеба Оуэнса. В написанном
Джошем руководстве «сборка поросенка» рассматриваются стили лицевого риггинга Кэлеба
Оуэнса и Джейсона Осипы, что позволяет вам выбрать наиболее подходящий для вашего
персонажа стиль.

Интервью с Кэлебом Оуэнсом


@Рис. 9.1

Кэлеб «Cro» Оуэнс – многогранная личность: художник, дизайнер и музыкант. В течение почти 15
лет Cro профессионально и интенсивно работал во всех сферах компьютерной графики, включая
коммерческие, судебные, образовательные, интерактивные, художественные фильмы и
широкоэкранный фильм.
Осенью и зимой 1999-2000 гг. Оуэнс был ведущим техническим режиссером проекта
Experience Music Project в получившей награду Академии студии визуальных эффектов Digital
Domain. Он руководил командой художников, занимавшейся созданием 3-D компьютерной
имитацией лица Джеймса Брауна. Применяя новейшие технологии, такие как Maya и
иерархические поверхности (subdivision surfaces), и новые техники в художественном и
дизайнерском подходах, он способствовал утверждению нового стандарта в анимации лица
фотографической реалистичности и в творческом применении приложений для трехмерной
компьютерной графики.

@Рис. 9.2

В октябре 2000 г. Cro снова участвовал в революционном скачке компьютерной графики.


Работая с всемирно известными специалистами, гуру в области «железа» для 3-D графики и с
теми, кто занимался разработкой nVidia X-Box, Кэлеб сконструировал и анимировал полностью
трехмерный персонаж для запуска нового революционного продукта nVidia – geForce3. Работая
интенсивнее с Джеймсом Брауном, Оуэнс снова установил новый стандарт, на этот раз в области
анимации в реальном времени.
Неполный список работ Кэлеба включает следующее: «Водная жизнь» («The Life Aquatic»),
«Питер Пэн» («Peter Pan»), «Я, робот» («iRobot») (превизуализация), «Loony Tunes», «Жена
астронавта» («Astronaut’s Wife»), «Инспектор Гаджет» («Inspector Gadget»).
Оуэнс имеет степень бакалавра изобразительных искусств университета Florida Atlantic
University. Помимо своей ежедневной работы, Кэлеб – владелец, дизайнер и создатель в
собственном магазине мотоциклов, cro customs inc., а так же владелец торговой марки mumbo
jumbo. Дополнительную информацию можно получить на www.crocustoms.com и
www.mumbojumbotunes.com.
Интервью
Начнем с краткого предисловия. У тебя выдающаяся биография, и мы планировали спросить
тебя о Джеймсе Брауне и проектах nVidia. Что в данный момент является ежедневной
рутинной работой?
На момент этого интервью я только что согласился занять должность технического арт-
директора в EA (Electronic Arts). Здесь я занимаюсь не только художественной стороной игр
следующего поколения, но еще и помогаю другим художникам в управлении и выявлении
неполадок.

@Рис. 9.3

Когда кто-то произносит «лицевой риггинг», первое, о чем я думаю, – это твой Джеймс
Браун, на которого мне удалось посмотреть, когда ты проводил мастер класс по Maya. Какие
еще проекты у тебя были, такие же впечатляющие как этот, с таким же фантастическим
качеством анимации лица?
Это была веха, и мне очень повезло, что подвернулась такая возможность. Работа была
впечатляющей, но могла бы быть еще лучше. В то время мы говорили о вещах, к которым люди не
были по-настоящему готовы, и мы могли реализовать только 30% наших идей во время работы.
Меня очень радовала работа над Зольтаром (Zoltar), которую я делал для nVidia. Не фильм, а вся
основа 3D была похожа на работу над Джеймсом Брауном, а в некоторых отношениях даже была
лучше. Зольтар не пел, а говорил, и хотя модель была основана на моем отсканированном лице, я
исказил его и сделал более карикатурным.
Зольтар получился отлично, особенно в режиме реального времени. Какие технические
осложнения у тебя появились при работе над проектом? Можешь немного рассказать о том,
какие корректировки тебе пришлось внести в реально временной проект, включающий лицевую
анимацию?
В этом и была вся соль того проекта. Парни из nVidia сказали: «Сделай так, чтобы это
выглядело максимально круто, а мы разберемся с техническими деталями рендеринга в реальном
времени». Так что я применял все те же техники, что и в фильме. В этой работе было
одновременно и хорошо, и плохо то, что, начиная с идеи и до самого конца, я занимался проектом
в одиночку в моем доме в Малибу. В nVidia был художник, подправлявший текстурирование в
соответствии со специфическими требованиями демо в реальном времени. Хорошее заключалось в
том, что у меня был полный контроль над производством, съемкой и интеграцией motion capture, а
плохое – в том, что у меня было лишь 3 месяца и больше двадцати отрывков диалога для
настройки. Это была трудная задача – выполнить такое количество работы на уровне, который бы
устраивал меня, и которого ожидали в nVidia. Плохо по тем же причинам, по которым хорошо…
(смеется). В конце концов, парням в nVidia работа по-настоящему понравилась, и хотя я бы
потратил еще некоторое время на отладку анимации, я был доволен окончательным результатом и
отзывами, которые я получил.

@Рис. 9.4

Насчет стиля. Что привлекает тебя больше – фото-реалистичноть или стилизация?


На самом деле, и то, и другое. Больше всего меня привлекает хорошая разработка персонажа и
его правдоподобие, как если бы он был живым. Несколько лет назад все шумели вокруг этой идеи
создания цифрового клона. Я тоже в этом участвовал. Идея цифрового клона интересовала
большинство людей из-за ее технических сложностей; для меня были важнее сложности
эстетические, о которых говорили очень немногие. Я просто убежден, что огромное количество
людей упускают это из вида. Если слишком сильный акцент делается на техническом аспекте
комплексной работы, то страдает эстетическая сторона, даже на самом мелком уровне. Когда я
делал исследования перед тем, как приступить к работе над Джеймсом Брауном, это казалось мне
важнейшим, но недостающим элементом фото-реалистичного лица.
Ты можешь еще немного поговорить об эстетике? Чего стоит достичь следующего уровня?
Понятно, что, чтобы замечать все мелкие детали, требуются годы практики и учебы. Что, по-
твоему, самое сложное при переходе на следующий уровень?
Тяжелее всего развить наметанный глаз. Об этом думают меньше всего. Наметанный глаз на
композицию, на детали и так далее. Этой способностью обладают некоторые из величайших
художников и режиссеров нашего времени, такие люди, как Ансел Адамс (Ansel Adams), Кубрик и
другие. Когда ты видишь их работу, ты это знаешь, и лишь немногие спорят с тем, что их работы
не только великие, но и незабываемые. Наметанный глаз – это способность остановиться,
посмотреть и увидеть то, что другие могут проглядеть. Со временем это происходит
автоматически. Я думаю, тут дело в элементарной идее: «подумать сперва о самом простом». В
нашей отрасли всегда было трудно найти людей, хорошо мыслящих технически и с
художественным прошлым. А теперь, по-моему, очень сложно найти действительно способных
художников, потому что эстетика настолько же научна, насколько субъективна.
Как ты занялся проектом с реалистичной анимацией лица?
Прежде всего, я сконцентрировался на эстетической стороне. Затем стал размышлять в
простейших терминах. Как быстрее всего выполнить это задание, создав в то же время
правдоподобные движения? Я начал с чистого основания, а затем старался не слишком усложнять
конструкцию.
Как часто ты прибегаешь к исследованиям и разработкам, чтобы опробовать новые техники
лицевого риггинга? Можешь ли ты рассказать о новых техниках, с которыми ты работал в
последнее время?
Сейчас довольно мало проектов жестко специализированных только на лице, но когда у меня
есть время, я экспериментирую с идеями. Больше всего меня интересуют те вещи, которые можно
сделать без помощи команды специалистов по программному обеспечению. В самых больших
студиях, таких как Sony или ILM, есть целые команды для поддержки команд художников. В
последнее время я занимался имитацией кожи используя серию соединенный симуляторов ткани.
Звучит интересно… Используешь ил ты модели мышц для получения неплохого кожного
скольжения во время управления кожей? Какие инструменты и техники, по-твоему, уд