/
Теги: информационные технологии вычислительная техника обработка данных учебники и учебные пособия по военной науке
ISBN: 978-5-902976-03-5
Текст
Сергей Цыпцын
В двух книгах
Книга первая
000 "Арт Хаус медиа"
Москва 2007
ББК 68я73
УДК 004(75)
П75
Цыпцын Сергей.
П 75 Понимая MAYA
Издательство ООО "Арт Хаус медиа", 2007
В двух книгах/ - М. Издательство ООО "Арт Хаус медиа", 2007 - 1428 с.
ISBN 978-5-902976-03-5
Эта книга не о том, "как" сделать красиво и не от том, как освоить программу за 21
день. Эта книга о понимании принципов, по которым работает MAYA.
Автор, выпускник мехмата МГУ, соединил академический научный подход и легкий
стиль изложения. Среди прикладной литературы, посвященной компьютерным
программам, эта книга является совершенно уникальной, так как призывает читателя
вникнуть в саму суть построения программы и понять логику использования ее
инструментов.
Автор является официальным российским "проповедником" MAYA, а также
единственным в России сертифицированным инструктором компании Autodesk по
этому пакету.
Материал построен на основе семилетнего цикла лекций, прочитанных автором,
и является предельно субъективным и неформальным. В подготовке книги автору
помогали лучшие специалисты отечественной индустрии компьютерной графики.
ISBN 978-5-902976-03-5
© Цыпцын Сергей, 2007
® ООО "Арт Хаус медиа", 2007
Содержание
Книга 1
Глава 1. Не короткое, но и нескучное введение 16
Что же такое MAYA? 16
Начинка MAYA 16
Свойства MAYA 18
Применения MAYA 18
Феномен MAYA 19
История MAYA 19
История создания этой книги 21
Чего в книге нет. Или есть, но совсем мало 21
Для кого эта книга предназначена 22
Как читать книгу 23
Требования к компьютеру 23
Терминология 24
Освоение MAYA 25
Требования к мозгу 25
Источники знаний о MAYA 26
О чем эта книга 26
Глава 2 Витрина интерфейс MAYA 27
Принципы построения интерфейса 28
Список основных горячих клавиш 29
Модульность. Метод «тыка» 30
Глаза и уши MAYA 31
Фокусы MAYA 32
Меню MAYA 32
Режимы работы 32
Панели и камеры 35
Layouts. Схемы расположения панелей 35
Режимы представления геометрических объектов на экране 36
Качество отображения объектов 37
Терминологический комментарий 38
Наезды, подъезды и отъезды 38
Инструменты на каждый день 39
Проблема выбора 41
Маски выбора 42
Настройки инструментов 43
Мягкие модификации 45
Правая часть окна MAYA 46
Точка опоры 47
Компоненты и объекты 48
F8F8 49
Привязки и отвязки 50
Дублирование и размножение 51
Channel Box или коробка передач 53
Манипуляторы и невидимые слайдеры 55
Фиксация и сброс: Freeze и Reset 57
Слои 57
Attribute Editor 57
Невидимые объекты. Игра в прятки 59
Outliner и Hypergraph 59
Десять способов переименовать объект 60
Меню Display 60
Шаблоны 61
Группировка и парентинг 61
Временная шкала (timeline) 61
Промежуточный итог 62
Ускорение и оптимизация работы в MAYA 62
Горячие клавиши 62
Полки (Shelves) 63
Рассмотрим основные приемы работы с полками 64
Script Editor и командная строка 66
HotBox 68
Marking Menu 69
Настройка цветов интерфейса 71
Сохранение настроек интерфейса 71
Настройки проекта 72
Еще раз о пользе подсказки Help Line 73
Практические замечания по поводу интерфейса АЛАУА 74
Воспоминания автора 75
Глава 3 Изнанка программы. Архитектура MAYA 79
Архитектура MAYA 80
Объект как список атрибутов. Основная концепция MAYA 81
Изучение внутренностей. Работа с Hypergraph.
Исследовательская кнопка. Дерево зависимостей.
«Нода» как новое слово в русском языке.
Терминологические муки 81
Режимы работы в Hypergraph.
Иерархия сцены и дерево зависимостей. Дело вкуса 82
Transform и Shape. Положение и форма.
Родители и потомки. Неразрывная связь 83
Отцы и дети. Начальники и подчиненные.
«Припарентивание» и прочие термины.
Наследование трансформаций 85
Некриминальные группировки.
Пустые группы. Умение группироваться 87
Навигация по группам. Работа с клавиатурой 88
Порядок поворотов 88
Самогруппировка. Слоеная иерархическая анимация 90
Инстансирование или подстановки.
Поверхности с общей формой. Один потомок у семи родителей 90
Длинные и короткие прозвища.
Полный путь к объекту. Уникальные имена 91
Sets и Partitions. Фиктивные наборы и эксклюзивные партии.
Списки для быстрого выбора 92
О пространствах. И локальных осях 94
Сброс и заморозка (Reset и Freeze).
Новое место рождения объекта. Разворот локальных осей 95
Связи между атрибутами. Работа с Connection Editor.
Полное имя атрибута. Типы атрибутов. Совместимые атрибуты.
Красивые и настоящие имена атрибутов 96
Непрямые связи. Функция Set Driven Key.
Определение интеллектуальных зависимостей
между атрибутами без программирования.
Расширение сознания 101
Анимация. Связь атрибутов с временем.
Анимационные кривые как объекты сцены.
Анимация и деформация времени 104
Вывод номер один 106
Типы атрибутов и их назначение.
Анимируемость и совместимость атрибутов.
Интеллектуальные атрибуты. Мешки чисел 106
Динамические атрибуты. Статические атрибуты.
Добавление и удаление собственных атрибутов.
Повышение уровня абстракции и очеловечивание объектов 108
Изменение порядка динамических атрибутов в ноде. Шаманство 110
Mesh In, Mesh Out 110
Снова вывод номер один 112
Работа с документацией. Исследование незнакомых объектов.
Источник безграничных познаний 113
История (History) 114
Construction History. Стэк моделирования.
Протоколирование действий и операций.
Конструктивные входы и выходы 115
Удаление History. Отшибание памяти. Разрыв с прошлым 118
Double Transformation. Двойные перемещения.
Законопослушная MAYA 118
Изысканный Duplicate. Input Graph. Input Connections.
Копирование старых связей.
Дублирование входящего дерева зависимостей 119
Стэк деформаций и история моделирования 121
Порядок деформаций. Список операций 121
ЗагадочныйТу/еак 124
Путешествия по истории 124
DAG или не DAG? Терминологические дебри 125
Циклы в дереве зависимостей и их последствия.
Поднимание себя за уши 127
Expression как нода совершенно произвольного назначения.
Природа expressions. Входы, выходы и сиротливые expressions 127
Загадочный атрибут Node State. Состояние ноды.
Блокировка действия некоторых нод. Обновление экрана
и оптимизация интерактивной производительности 134
Секретные коды, секретные ноды. Создание нод вручную 136
Секретные атрибуты. Изменение поведения нод по умолчанию,
путем добавления динамических атрибутов 137
Закрепление одного объекта на поверхности другого 138
Рисование скриптами. Geometry Paint. Секретные заклинания 139
Работа с секретными нодами. pointOnSurfacelnfo и rotateHelper 141
Использование нод не по назначению. Real Trans Objects.
Пересадка объектов вместо волос на произвольную поверхность 143
Цветокоррекция.
Использование анимационных кривых не по назначению 149
Изучение MAYA.
Методы оперативного вскрытия и анализа внутренностей.
Сценарии исследования MAYA 154
Догоняя MAYA 155
Глава 4 Моделирование 157
Немного«воды» 158
Еще чуть-чуть «воды» 158
История моделирования, но не Construction History 158
Методы моделирования 159
Области применения методов моделирования 161
Альтернативные и экстремальные методы моделирования 162
Импорт и форматы данных 162
Метаболы 163
Процедурное моделирование 163
L-системы 163
MEL-моделирование 163
Генераторы всего на свете 164
Рисовальные эффекты как средство моделирования 164
Сплайновое моделирование 166
Работа с кривыми 168
Степень и гладкость 168
Тангенс и кривизна 168
Непрерывность 169
Создание кривых. Практические инструменты и методы 170
CVCurveTool 171
ЕР Curve Tool 172
Параметризация. Длина кривой.Способы параметризации 173
Первыеужасы параметризации 173
Операции над кривыми.
Склеивание и разрезание. Detach и Attach.
Способы склейки. Keep originals 175
Работа с углами 178
Использование сеток 180
Тактика построения кривых 180
Вставка точек. Команда Insert Knot 180
Перестройка. Операция Rebuild 180
Остальные операции для работы с кривыми 184
Кривые на поверхности: Curves on surface.
«Оживление»: Make Live 187
Расширение сознания и понимания природы кривых на поверхност 189
Небольшой раздел для взрослых. Multiplicity.
Концевые условия (End Conditions) 192
Веса контрольных точек (Weights) 194
Дпя любителей Безье 196
Артизан. Воплощение в скульпуре 197
Работа с поверхностями. Идеологические особенности 201
Главное ограничение сплайновых поверхностей 204
Совместимые края поверхностей 205
Совместимая параметризация 206
Конвертирование сплайнов в полигоны и тесселяция 209
Паровозостроение 211
Продвинутое паровозостроение 239
Котел 239
Труба 244
Последствия параметризации 247
Шапка 248
Звезда 250
Моделирование хорошего сплайнового куба 254
Теселяция 258
Кабина и окна 266
Крыша 266
SoftWindows, мягкие окна 269
О том, что не влезает в эту главу. Патчевое моделирование 274
Особенности использования операции Global Stitch 275
Практические советы 277
Главная практическая рекомендация 277
Полигональное моделирование 280
Про полигоны без прогона, или полигоны Про 280
Начинка и устройство майских полигонов 281
Терминология 283
Восьмая версия - внимание, диверсия! 283
Нормальные нормали 283
Работа с компонентами 286
Эффективный выбор компонент 288
Немного о перетаскивании вершин 290
Отображение полигональных компонентов 292
Создание полигональной геометрии 294
Create Polygon Tool 294
Append to Polygon Tool 297
Редактирование полигональной геометрии 301
Split Polygon Tool 304
Extrude Face - мечта космических авиаконструкторов 307
Extrude Edge - операция для ленивых 311
Обдуманное убийство: Delete Vertex и Delete Edge 312
Латание дыр: Fill Hole 313
Разрезание плоскостью: Cut Faces Tool 314
Фаски-шоу: Bevel и Chamfer 316
Sculp Geometry Tool 322
Темная лошадка: Move Component 323
Немного об экзотике 323
Poke Face 324
Wedge Face 324
Flip Triangle Edge 324
Collapse 325
Технические операции 325
Combine и Separate. Разукрупнение 325
Extract и Duplicate Faces 327
Симметричное моделирование 336
Smooth Proxy как метод симметричного моделирования 340
Скользкие вопросы сглаживания 342
Smooth Proxy как метод контроля формы поверхности 345
Удаление симметрии: Unmirror Smooth Proxy 348
Connect Poly Shape и другие альтернативные инструменты 349
Плохая и хорошая геометрия. Проблемы и лекарства. Cleanup 350
Triangulate, Quadrangulate и Subdivide 359
Еще немного о нормалях 360
Немного про историю и инстансирование 361
Текстовый графический режим. Работа с текстами 364
Вершинные цвета и симуляция освещения 365
Карты нормалей, ZBrush, Modo и другие 366
Практические советы мастеров Полидзен 369
Моделирование головы - не шутка 371
Процесс моделирования 373
Пара заключительных советов 415
Subdivision Surfaces 416
Реализация сабдивов в MAYA 417
Два способа работы с Subdivision Surfaces 421
Немного о конвертации 422
Два режима работы с Subdivision Surfaces 423
Динамика и сабдивы. Полный коллапс 425
Деформация сабдивов 427
Blend Shapes и сабдивы 428
Сабдивы и скининг 429
Рендерингсабдивов 429
Глава 5 UV 435
Курсы кройки и шитья.
Текстурирование полигонов 436
Замапливание» терминологии 437
Создание UV-координат на поверхности 437
Немного практики. Освежевание утки. Texture Editor 439
Создание Quick Select Sets 440
Планарная проекция 442
Цилиндрическая проекция 445
Симметрия прежде всего 447
Нормализация 448
Первые удары скальпелем. CutUV 450
Назначение шашек 455
Немного о швах 457
Корректировка цилиндрической развертки. UV Lattice 457
Полный Relax 460
Трюки. Blend Shapes для UV-координат 461
Кройка и шитье. Cut, Move and Sew UVs 463
Автоматическая мозаика. LayoutUV 467
Зеркалирование и сшивание половин 471
Сохранение UV-выкройки в файл 474
Немного про текстуры 475
Что такое хорошо и что такое плохо 476
Еще немного практики. Пошив пивных кружек 478
Инструментальный хит-парад 488
Еще немного о швах. Нет... много о швах! 489
Автоматический таксидермист. UnfoldUVs 491
Как замести следы. И скрыть швы 499
3D Paint Tool 502
Мультитекстуринг 507
Мультитекстуринг как средство борьбы со швами 511
«Оверлампинг» 516
Овермаппинг. Экономия экономия времени и нервов 517
UV-координаты и NURBS-поверхности 529
UV-координаты и сабдивы 530
Советы. Трюки. Угрозы. Меховая тема 533
Советы. Трюки. Угрозы. Универсальный трансфер 534
Советы. Трюки. Угрозы. Текстурирование после сетапа 538
Советы. Трюки. Угрозы. Последние штрихи 539
Мастера UV-дзен 541
Глава 6 Анимация 543
Типы анимации. Немного терминологии 545
Применения анимации 546
Главный принцип анимации в MAYA 546
Общие принципы и внутреннее устройство анимации в MAYA 547
Работа с Channel Box 549
Защита от анимации 549
Просмотр анимации и настройки проигрывания 551
Скорость воспроизведения анимации 552
Анимация по ключам 553
Способы создания ключей 554
Режим Auto Key 555
Качение куба. Комментарии 555
Редактирование ключевой анимации 559
Редактирование анимации в Graph Editor 559
Редактирование ключей на временной линейке 560
Перенос анимации с объекта на объект 560
Работа с ключами в Channel Box 563
Работа с ключами в Attribute Editor 563
Основы работы с Graph Editor.
Свойства ключей и анимационных кривых 564
Дополнительные возможности Graph Editor 569
Dope Sheet - альтернативный графический редактор 569
Иерархическая анимация. Стэк анимации. Слоеная анимация 570
Анимация юлы 571
Типы ключей. Breakdowns 578
Короткие вставки. Inbetweens 579
Анимация по пути 579
Пресмыкание по пути 580
Редактирование анимации по пути 583
Деформация по пути 585
Некоторые практические замечания по использованию
анимации по пути 588
Констрейны 589
Порядок работы с констрейнами. Их устройство
и отличия от других видов связи между объектами 590
Типы констреинов. Их общие и уникальные атрибуты 591
Point Constraint 591
Orient Constraint 591
Scale Constraint 592
Смешивание анимации - старый добрый подход 592
Parent Constraint 592
Aim Constraint 593
Борьба с переворачиванием 595
Geometry Constraint 598
Normal Constraint 598
Tangent Constraint 599
Pole Vector Constraint 599
Совместимость констреинов.
Использование нескольких констреинов для одного объекта 599
Удаление и добавление дополнительных управляющих объектов 600
Работа с весами.
Включение и выключение констреинов.
Rest Position. Исходная позиция 600
Констрейны как потенциальный источник циклов
в дереве зависимостей 601
Пример использования констреинов 602
Конструирование карданной передачи 602
Процедурная анимация.
Крепкие выражения. Expressions 610
Порядок создания expressions 611
Синтаксис expressions 612
Разница между скриптами и expressions.
Порядок выполнения expressions 313
Примеры использования expressions. Часы 614
Приручение Expression Editor 617
Примеры использования expressions. Телескопическая антенна 619
Общие принципы создания и использования expressions 623
Циклические движения. Устаканивание с помощью expressions 624
Скорость объекта. Использование expressions для ориентации объекта
по направлению движения. Работа с динамическими атрибутами 629
Коленвал.
Преобразование типов движений с помощью expressions.
Теорема Пифагора 632
Операция Set Driven Key. Формула произвольной гибкости 635
Интеллектуальный шлагбаум 636
Управление множеством атрибутов с помощью Set Driven Key.
Борьба с комарами 640
Set Driven Key - некоторые замечания 642
Смешивание различных типов анимаций: Animation Blending 643
Порядок смешивания анимаций 645
Кватернионы, эйлеровские углы, синхронизация вращений
и прочие ужасы 646
Бесплатный гхостинг, или классическая фазовка 649
Playblast: предварительный просмотр анимации 650
Работасозвуком 651
Еще раз про основной принцип анимации в MAYA 652
Выбор типа анимации в конкретном случае: общий подход 653
Как я стал инструктором 654
Деформеры 657
Основная идея 657
Типичный ритуал применения деформеров.
Создание и удаление деформеров 658
Типы деформеров. Нелинейные деформации 658
Деформация частиц 659
Решетки Lattice. Free Form Deformation 662
Устройство решеток Lattice и работа с ними.
Двойные решетки. Алгоритм деформации 666
Двойные решетки. Алгоритм деформации.
Wrap deformer. Решетка произвольной формы.
Обобщенные деформации 668
Деформеры Sculp и Wire 669
Jiggle-деформер. Остаточные явления 671
Кластеры - группирование компонент и объектов 671
Еще немного теории деформаций 675
Общие свойства всех деформеров. Атрибут Envelope 675
Порядок деформаций 676
Промежуточные объекты (Intermediate Objects) 678
ЗагадочныйТ\А/еак 679
Порядок деформаций, определяемый при создании деформеров 681
Членство в партии деформеров.
Вступление и выход из партии.
Партиции и эксклюзивные деформеры 683
Трехмерный морфинг. Смешанные формы - BlendShape 686
Окно для работы с Blend Shapes 688
Устройство объекта blendShape.
Удаление и добавление новых целевых объектов 689
Совместимость форм и принцип работы морфинга 691
Последовательный морфинг 692
Морфинг групп и иерархий 693
Локальный и глобальный морфинг 693
Симметричный морфинг 693
Некоторые замечания по поводу лицевой анимации 693
Практические советы по использованию деформеров 695
Используйте Wrap и Wire деформеры 695
Оптимизируйте количество объектов 695
Подстройка Wrap Base и Wire Base объектов 696
Меняем тип Wrap алгоритма 697
Wrap не любит изменения масштаба объекта влияния 697
Чего следует избегать при работе с Wrap-деформером 697
Wrap-деформер и параллельные деформации 697
Wrap-деформер в составе Skin Cluster-деформера 698
Wire и его dropoff-локаторы 698
Wire + Wrap 699
Wrap для одежды 701
Wrap как непрямой скининг 701
Не короткое,
но и нескучное ведение.
Не короткое, но и нескучное введение.
Программы для производства трехмерной компьютерной графики бывают разные.
Различные по размеру, по характеру, по популярности, по сложности, вобщем по породе. Одна
порода, например, распространена очень широко и встречается практически во всех уголках
планеты. Отличается дискретным трудолюбием, немного неказиста, ее не очень любят, но широко
используют для различных работ и разводят в больших количествах.
Другая порода домашняя, уютная, практически декоративная, ее легко носить с собой,
она приживается практически в любых условиях и не требует особых усилий по уходу. У нее
квантовофизическое название, хороший мех и неплохие способности к рендерингу. В работе
ее используют редко, только для спецзадач, в силу быстрой утомляемости и ограниченной
трудоспособности.
Встречается также крупная порода, пережившая всякие катаклизмы, смерчи и многочисленную
смену хозяев, ускользнувшая из лап самой Microsoft. Порода эта хорошо двигается, отлично
выглядит, в работе надежна, но обладает неважным характером - отчаянно ревнует своих
пользователей к другим породам и не дает им общаться ни с кем кроме себя.
Иногда в природе встречается редкая красивая порода с человеческим названием. Порода
уникальная, генетически модифицированная практически до полного совершенства. Умеет
произносить мантры и делать все на свете. С ней мало работают, в основном изучают,
совершенствуют, с удовольствием демонстрируют и восхищаются.
Говорят, в некоторых удаленных уголках планеты иногда встречается редчайшая финская
трехмерная порода, но ее никто не видел живьем и приручить не пытался.
Есть также одна породистая программа, которую реально любят и ценят. За хороший характер
и дружелюбный нрав. За приятный внешний вид и приспосабливаемость к любым условиям. За
умение быстро и эффективно работать. За красивое имя и внутреннее обаяние.
Про эту программу по имени MAYA, я и хотел бы рассказать. Рассказ похоже получился
некоротким.
Что же такое MAYA?
Рекламные заявления продавцов программного обеспечения гласят, что это «пакет для
производства анимации и спецэффектов». Это не совсем так. Скорее, MAYA можно назвать средой
разработки инструментов для производства трехмерной компьютерной графики. Не фиксированным
набором средств, а именно средой, в которой наряду с уже имеющимися огромными возможностями
можно создавать новые инструменты и разрабатывать новые методы для получения необходимых
эффектов и результатов. MAYA не похожа на конкретный механизм с четко определенным набором
функций - это скорее конструктор, позволяющий комбинировать уже имеющиеся работающие
блоки в нужной последовательности, а при необходимости легко создавать новые блоки.
После таких туманных заявлений стоит уточнить, из чего AAAYA состоит и как она устроена. Кроме
того, необходим навести немного традиционного пафоса, присущего рассказам о программном
обеспечении.
Начинка MAYA.
Как разработка, появившаяся сравнительно недавно, MAYA является действительно
современным набором инструментов, вобравшим в себя последние идеи и технологии компьютерной
графики. Средства моделирования включают в себя несколько технологий. Во-первых, это
довольно удобный набор инструментов для полигонального моделирования. Во-вторых, операции
NURBS-моделирования, позволяющие работать со сплайновыми моделями действительно быстро.
А сохранение истории моделирования позволяет экономить массу времени и не переделывать
заново множество операций. Поверхности разбиения (Subdivision Surfaces), являющиеся симбиозом
16
Книга Сергея Цыпцына
№
сплайнов и полигонов, представлены как эффективная технология иерархического моделирования
топологически произвольных поверхностей.
Средства анимации включают в себя как традиционные методы типа ключевой анимации
или движения вдоль пути, так и уникальные технологии, элегантно реализованные в MAYA. Это
прежде всего средство Set Driven Key, позволяющее связывать движение нескольких объектов
произвольной и легко редактируемой зависимостью. Также это механизм Expressions, реализующий
концепцию процедурной анимации. Современные идеи нелинейной анимации реализованы в
TraX Editor, мощном инструменте для монтажа анимационных клипов. Широкий спектр средств
деформации объектов и технология blend shape, расширяющая традиционное представление о
морфинге, доступны для всех типов поверхностей.
Управление персонажами включает в себя прямую и инверсную кинематику, различные
методы скининга с возможностью трехмерного раскрашивания зон влияния скелета на поверхность.
Механизм констрейнов позволяет создать механизм управления персонажем, уникальный для
каждой анимационной задачи. Концепция Character Set позволяет собрать все управляющие
персонажем атрибуты в одном объекте и абстрагироваться от технического устройства персонажа.
Полностью интегрированное наследство компании Kaydara, включает в себя уникальный механизм
«полнотельной» кинематики Full Body IK для управления персонажем как единым целым.
Про средства разработки динамических спецэффектов в MAYA можно говорить бесконечно.
Их уникальность заключается не только в широких возможностях, позволяющих решать практически
сколь угодно сложные задачи, но и в гибкости, настраиваемости и продуманности инструментов.
Именно баланс между сложностью решаемых проблем и гуманностью методов делает майскую
динамику столь привлекательной для технических директоров и постановщиков спецэффектов.
Системы частиц, динамика твердых тел, мягкие тела, система волос, симуляция одежды, механика
сплошных сред - это лишь формальный список инструментов и методов.
Paint Effects - уникальная концепция трехмерных кистей и штрихов. Можно назвать это L-
системой с человеческим лицом. Или огромной трехмерной процедурной текстурой. С помощью
этого инструмента в несколько движений создаются сложные трехмерные объекты, описываемые
параметрами используемых кистей. Библиотеки кистей огромны, более того, кисти можно
смешивать или порождать новые. Деревья, цветы, облака, галактики, молнии, чайники(!) и многое
другое может быть описано и нарисовано трехмерными штрихами. И не только трехмерными,
так в состав Paint Effects входит эффективный модуль плоского рисования, использующий те же
самые кисти.
Про MEL (MAYA Embedded Language) уже написаны отдельные книги. Революционная идея
сделать открытым язык, с помощью которого описываются майские сцены и интерфейс, превратила
MAYA в безгранично расширяемую среду разработки новых инструментов.
Создание сложных материалов и моделей освещения производится в графическом редакторе
Hypershade. Этот эффективный инструмент позволяет конструировать довольно сложные сетки
материалов (Shading Networks), интерактивно соединяя между собой различные элементы в
нужной последовательности.
Выбор средств для финального рендеринга вызывающе велик. Software Render, Mental Ray
Render, Hardware Render, Paint Effects Render, Fur Render, Vector Render, Hardware Render Buffer,
Interactive Photorealistic Render. Восемь вариантов. Последний из них - IPR - является произведением
искусства, позволяющим практически мгновенно, не пересчитывая сцену целиком, обновлять
финальное изображение при изменении исходных параметров материалов и источников света.
Плагины сторонних производителей позволяют осуществлять просчет сцен в других
программах рендеринга. Наиболее известные из них - MTOR(MAYA То Renderman Converter) и
Renderman for Maya, позволяющие просчитывать майские сцены с помощью пакета Renderman,
являющегося промышленным стандартом . В последнее время появляется все больше независимых
систем рендеринга, поддерживающих работу с MAYA: Turtle Render, finalRender, Brasil, TomCat
Render и другие.
He короткое, но и нескучное введение.
17
НМШ
Свойства MAYA.
Теперь, когда нужный пафос и небходимые приличия соблюдены можно поговорить о
природных свойствах MAYA.
Бешеная конкуренция и звериный оскал капитализма заставляют производителей
программного обеспечения не только плодотворно красть хорошие идеи и решения, но и
разрабатывать новые технологии, впоследствии тиражируемые конкурентами. В результате
все современные трехмерные пакеты имеют схожий набор технологических возможностей,
отличающийся лишь особенностями реализации в той или иной трехмерной программе.
Что же отличает MAYA от конкурентов и создает вокруг нее некое мистическое настроение?
(«MAYA - это невыносимо круто», вот квинтэссенция такого мистического настроения в
русскоговорящей среде).
Во-первых, настраиваемость, или, говоря совсем технически, кофигурируемость. Гибкость
в выборе не только внешнего вида, но способов взаимодействия с AAAYA позволяет адаптировать
AAAYA в соответствии с личными пристрастиями и требованиями рабочего процесса в равной
степени. Таким образом, MAYA не диктует четкой последовательности действий или набора правил
в процессе работы с её различными модулями. Это иногда обескураживает, ибо пользователи
программного обеспечения привыкли, что, как правило, любой пакет навязывает некоторый
стиль работы. В случае с AAAYA пользователь частично чувствует себя художником, частично -
разработчиком новых инструментов.
Во-вторых, это приспособляемость, то есть возможность использовать AAAYA так, как
требуют этого обстоятельства работы, а не наоборот.
В-третьих, уже упомянутая выше расширяемость. Использование MEL и MAYA API позволяет
дополнить имеющиеся возможности новыми инструментами, причем в вызывающе короткие
сроки.
В-четвертых, открытость. Сохранив трехмерную сцену, пользователь MAYA имеет
возможность отредактировать ее в любом текстовом редакторе, ибо сцена представляет собой
просто набор инструкций на языке MEL, который описывает создание объектов, составляющих сцену.
Кроме того, наряду с поддержкой импорта-экспорта промышленных стандартов IGES и OBJ, MAYA
позволяет легко читать и записывать данные в произвольных форматах с помощью соответствующих
функций чтения и записи языка MEL. Многие наверное читали, что MAYA использовалась при
создании того или иного фильма или что AAAYA активно используется крупными и известными
студиями для производства тех или иных спецэффектов. Именно открытость и настраиваемость
AAAYA позволяет внедрять ее на крупных студиях и подстраивать под любой производственный
процесс. Это не означает, конечно, что AAAYA противопоказана индивидуальным труженикам от
компьютерной графики. Напротив, вы можете настроить и использовать пакет в соответствии с
вашими пристрастиями и темпераментом и работать в среде, максимально отвечающей вашим
требованиям.
Применения MAYA.
Изначально проектируемая для индустрии развлечений MAYA неожиданно распространилась
как в смежные, так и в довольно отдаленные области. Никого не удивишь тем, что AAAYA используется
в кинопроизводстве, рекламном бизнесе или в игровой индустрии. Благодаря открытому формату
данных MAYA нашла интенсивное применение в сфере научной визуализации, когда огромные
массивы уже полученных данных чрезвычайно гибко и интерактивно представляются на экране
с помощью разнообразных майских инструментов. Помню, что когда мне потребовалось, я без
особого труда запрограммировал AAAYA для решения нелинейной системы дифференциальных
уравнений, после чего в реальном времени менял параметры математической модели, наблюдая
результат в окне камеры - как в виде траекторий, так и в виде движущегося тела в набегающем
потоке.
18
Книга Сергея Цыпцына
№
Промышленные дизайнеры сразу оценили возможности быстрой и качественной
визуализации, доступные в MAYA. Я неоднократно обучал специалистов с ВАЗа, которым необходимо
было не только спроектировать модель, но и выгодно ее представить.
Возможности выразительного органического моделирования и наглядной визуализации
сделали MAYA привлекательной и для медицины. Мне лично довелось работать с глазными
хирургами, удачно дополнявшими съемки реальных операций богатым иллюстративным
трехмерным материалом.
Список можно продолжать, ибо благодаря открытости MAYA области ее применения весьма
широки. Из своего личного опыта упомяну сотрудничество с ювелирными мастерами и дизайнерами
салонов самолетов.
Кстати, банальный факт использования MAYA в индустрии компьютерных игр можно
дополнить нетривиальным вариантом использования MAYA в качестве интереснейшей, красивой,
(и трехмерной!) компьютерной игры с бесконечным количеством уровней.
Феномен MAYA.
В принципе MAYA появилась на рынке сравнительно недавно. Феноменальной является ее
популярность и скорость, с которой AAAYA распространилась среди специалистов. Кроме того, надо
признать, что появление AAAYA не только всколыхнуло индустрию, но и изменило ее. В течение
первых двух лет после выхода первой версии разработчиками конкурирующих пакетов были
творчески заимствованы все основные свежие идеи и новые технологии, впервые появившиеся
именно в MAYA. Это сильно повысило требования, предъявляемые к инструментам трехмерной
графики и позволило всем пользователям (а не только пользователям AAAYA) получить новые, как
правило, более удобные и дружественные возможности. С моей точки зрения, в нашей части
света некоторая доля феномена скрывается в имени пакета. Точнее в его женском роде. До этого
на рынке доминировали исключительно «мужские» названия. Power Animator, Explore, 3ds max,
Lightwave, Photoshop, Illustrator, Softimage и даже XSI уверенно идентифицируются нами как «он».
Только Houdini со своим предком Prisms представляются как нечто среднего рода в множественном
числе, которого никто не видел, но все про них слышали (аналог Странников в романах Стругацких).
AAAYA же со своим женским именем стоит особняком и тем самым провоцирует на несколько иное
(причем бессознательно иное) отношение. Созидательность (или, по-модному, креативность),
присущая женскому роду, сослужила AAAYA неплохую службу. (Конечно весь этот бред - сугубо моя
личная гетеросексуальная точка зрения. Плюс дополнительная политкорректность .)
А что же было до появления феномена AAAYA?
История MAYA.
В далеком 1993 году в канадской компании Alias началась разработка нового пакета, который
впоследствии обрел имя AAAYA . В 1995 году произошло слияние компаний Alias и Wavefront под
крышей корпорации Silicon Graphics. Соответственно, разработчики будущей AAAYA столкнулись с
необходимостью не только использовать все имеющиеся к тому моменту наработки в пакетах Alias
Power Animator, Wavefront Explore и Advanced Visualizer, но еще и дать возможность пользователям
вышеупомянутых пакетов чувствовать себя в привычной обстановке при работе с AAAYA. Этим и
объясняется открытость и гибкость первой же версии пакета, которая появилась в феврале 1998
года.
Первые три модуля - AAAYA Base, AAAYA FX и AAAYA Artisan - стоили в то время в России тридцать
две тысячи долларов и работали исключительно на платформе Silicon Graphics. Но время шло, AAAYA
понемногу дешевела и в 1999 году эволюционировала в два варианта поставки. В AAAYA Complete
вошли все инструменты от первой версии, а вот AAAYA Unlimited дополняла версию Complete новыми
модулями AAAYA Live, AAAYA Fur и AAAYA Cloth. Впоследствии появился еще и AAAYA Builder - усеченная
версия AAAYA Complete для разработчиков игр. Фраза «понемногу дешевела» означает то, что цена
AAAYA Complete составляла уже 9 000 долларов, a AAAYA Unlimited - 16 000 долларов. В сентябре
1999 года в составе AAAYA Complete 2.5 появился знаменитый модуль Paint Effects, использующий
Не короткое, но и нескучное введение.
19
11111,1!
концепцию трехмерных кистей для создания и анимации процедурных трехмерных объектов. В
2001 году появились версии для Linux и MacOSX. В апреле 2002 произошло потрясающее снижение
цен: MAYA Complete стоит на сегодняшний день 1999 долларов, MAYA Unlimited - 6999. Ирония
судьбы заключается в следующем: в 1999 году в Москву приезжал мой хороший знакомый Bart
Nel, заведовавший тогда в компании Alias | Wavefront продажами MAYA во всей восточной Европе.
На его вопрос, что можно было бы сделать для увеличения объемов продаж MAYA в России, я не
раздумывая ответил: «Уравнять цены MAYA и 3DS МАХ». На что Bart грустно заметил: «Этого не
произойдет никогда».
Итак, MAYA Complete и MAYA Unlimited - это варианты комплектаций MAYA. В состав MAYA
Complete вместе с основными инструментами входит модуль Paint Effects, а также все инструменты,
использующие технологию трехмерных кистей, включая 3DPaint Tool. AAAYA Unlimited - это MAYA
плюс следующие дополнительные модули:
• AAAYA Fur - инструмент для создания меха и шерсти;
• MAYA Hair - средства создания и анимации длинных волос;
• AAAYA Cloth - модуль моделирования и анимации тканей;
• AAAYA Live - инструмент для совмещения трехмерных объектов и живых съемок,
подгоняющий трехмерную камеру под движения реальной камеры;
• AAAYA Fluids - модуль для работы с динамикой сплошных сред, как жидкости или газы.
• MAYA Hair - система анимации и визуализации волос
Кстати, название AAAYA никак не связано с древними цивилизациями Южной Америки
или индейскими племенами. Термин для кодового названия программного продукта был взят из
индийской философии. В соответствии с определением Вивеканады, "майя - иллюзия, скрывающая
истинную реальность". Кодовое название проекта обычно заменяется на что-то более официальное
(как, например, Chicago было кодовым названием Windows95), но харизма имени «AAAYA» была
столь высока, что его оставили для окончательного названия.
...В России же история появления AAAYA такова. Слухи о том, что в застенках элитных
американских компаний происходит секретная разработка программного пакета-убийцы для
производства спецэффектов и анимации (убийцы пакетов-конкурентов, естественно) ходили
аж с 1995 года. Правда, эти же слухи гласили, что мифический суперпакет с названием то ли
«Циклон», то ли «Тайфун», работает только на инопланетной платформе Silicon Graphics, которую
никто в глаза не видел, и что управляться с ним могут только специально обученные люди -
всенепременно трехметровые гиганты с голубыми глазами. (Минимальные требования были -
двухметровые блондины, с серыми глазами, и я тогда тоннами закупал «растишку», чтобы добрать
в росте недостающие сантиметры) Однако, 12 марта 1998 года в Москве несколько российских
компаний совершенно официально получили настоящую AAAYA для операционной системы Irix.
Соответственно, фантазии в умах информированных российских пользователей 3dstudio для
DOS начали приобретать патологические формы. И тут как гром среди ясного неба прозвучало
заявление компании Alias | Wavefront о портировании MAYA на платформу Windows.
Через две недели после исторического заявления я демонстрировал Maya 1.0 на одном
из стендов выставки «Аниграф-98». Вокруг меня толпилось человек сорок молодых и пытливых
умов. Все были чрезвычайно возбуждены и приятно взволнованы. Дело в том, что большинство
этих умов были до зубов вооружены дискеткой с файлом Foundation.dll, который при должном
использовании позволял запустить AAAYA на любом компьютере с операционной системой Win-
dowsNT и 24 мегабайтами памяти. То и дело со всех сторон раздавались восторженные выкрики
«Ну сейчас мы научим весь мир делать компьютерную графику!» и «Все переходим на Майю!».
Настроение было действительно праздничное у всех без исключения, и AAAYA весело и гладко
крутилась на довольно средних компьютерах с процессорами Pentium II.
Прошел год, и на выставке «Аниграф-99» я демонстрировал новоиспеченную вторую
версию AAAYA. Вокруг меня бурлила и кипела толпа из... одного пытливого ума. Некто Коля Рагозин
задавал мне вполне адекватные вопросы про майские частицы. Остальные попиратели мирового
порядка при встрече виновато опускали глаза и роняли скупые фразы: «Как-то сложно там все
устроено... и по-английски», «Спросить не у кого...», «И примитива «чайник» в AAAYA нету..». После
опроса значительной части просвещенных умов выяснилось, что постигнуть AAAYA традиционным
20
Книга Сергея Цыпцына
№
российским методом тыка никак не удается, и что богатый и гибкий набор инструментов
воспринимается как огромный черный ящик с плохо предсказуемым поведением. Действительно,
единственным источником информации была документация, вес которой в виде книжек составлял
16 килограмм (и никакой информации в интернете, там тогда еще не появились статьи или обзоры
MAYA). Именно тогда и родилась идея организовать обучение AAAYA, которому впоследствии я
посвятил семь лет жизни.
История создания этой книги.
Тогда же начала ощущаться необходимость в доступном и достаточно полном источнике
информации о MAYA. Книги, переведенные на русский язык или скомпилированные отечественными
авторами, неустраивали меня и моихстудентовлибоодносторонним подходом, либо эклектичностью
и непоследовательностью. Так что в данном труде я делаю попытку последовательно изложить свое
понимание предмета AAAYA на основе тех лекций, которые мне пришлось читать на прошедшие годы.
Сразу оговорюсь, что стиль изложения несколько отличается от традиционных западных учебников
по программному обеспечению и сильно тяготеет к академическим учебникам российской высшей
школы. Упор я делаю на понимание предмета и принципов использования инструментов AAAYA
в целом, чтобы вы, разобравшись с основными инструментами программы, смогли по аналогии
изучить остальные, неохваченные книгой или вновь появившиеся. Изучив массу литературы и
пообщавшись с сотнями студентов, пришедших на курсы по AAAYA, я выяснил, что большинство из
них уже проделали массу упражнений, описанных в книжках или в интернете. Но это не прибавило
им понимания самого процесса изготовления моделей или постановки анимации - выполнив
последнюю инструкцию упражнений, пользователь, как правило, с вожделением наблюдает
взлетающую ракету, но как превратить её в плывущую торпеду, он не имеет ни малейшего
представления. Дело в том, что обильные подробные инструкции и пошаговые указания (какую
команду применить и в какой последовательности) не дают представления об общих принципах
использования инструментов и о логике программы в целом. Я позиционирую данную книгу как
подробные комментарии к тем или иным инструментам AAAYA, которые позволят использовать их
для решения различных задач, а не только тех, которые описаны в книжках или интернете.
У пользователя выполняющего подробные упражнения зачастую возникает ощущение, что его куда-
то ведут с завязанными глазами, заботливо говоря куда ему повернуться и где убавить скорость.
В процессе такого «перехода» через упражнение, как правило, нет возможности осмотреться на
местности или хотя бы запомнить путь. К тому же в большинстве уроков «Как сделать в MAYA
красивую вещь» редко можно встретить инструкции, поощряющие самостоятельные действия
пользователя типа «поэкспериментируйте с этими атрибутами, чтобы понять их назначение» или
«поиграйте с различными значениями, чтобы почувствовать зависимость..».
Я старался подбирать упражнения и примеры для книги именно с акцентом на
«почувствовать» и «понять». Наверное поэтому они могут показаться кому-то искусственными или
«нехудожественными».
К настоящему времени в интернете уже накоплено большое количество «художественных»
и весьма прикладных упражнений. Некоторые из них являются результатом большого труда и
представляют из себя просто шедевры. Я с удовольствием включу ссылки на эти работы в
соответствующие разделы книги. Включать же в книгу текст аналогичных практических примеров,
о том как, например, сделать законченный автомобиль, я намеренно не стал, хотя бы из-за
ограничений по объему, а также из-за того, что это разрушает академическую концепцию книги.
Кроме того, иногда хочется почитать книгу не переводя глаза с монитора на бумагу и обратно, а в
тихой и спокойной обстановке, например, на работе.
Поэтому книгу я рекомендую читать в промежутках между выкачиванием и выполнением
учебников из интернета. Я бы рекомендовал читать ее перед сражением с очередной порцией
инструкций, но наиболее нетерпеливые могут читать ее и после этого. Это, возможно, придаст
новую окраску уже проделанному практическому опыту.
Чего в книге нет. Или есть, но совсем мало.
Вы не найдете в книге подробных описаний того, «как сделать красиво». Подобная
Не короткое, но и нескучное введение.
21
!Ш_!Ш
субъективная дискуссия явно выходит за рамки книги. Конечно, вы найдете здесь практические
советы, а также описание всяких трюков или ухищрений, касающихся не только технической части
MAYA. Но основная задача книги - научить читателя понимать MAYA. Принципы моделирования
анатомически правильных человеческих голов также останутся предметом другой, более
специализированной литературы, равно как и рендеринг суперфотореалистичных поверхностей.
Приведу лапидарный пример. Вы купили новую машину марки MAYA. Эта книга предназначена
для того, чтобы научить вас управляться с этой машиной, понять, что и где надо покрутить или
нажать, чтобы получить нужный результат, например тронуться с места или включить фары.
Непосредственно инструкций, как водить машину легко и непринужденно, в условиях плохой
видимости или как быстро и без пробок доехать до самой известной трехмерной студии вы здесь
не найдете. Кроме того, по образованию я математик и закончил когда-то мехмат МГУ. Поэтому
некое ощущение антихудожественности может и должно возникать при чтении книги. Это тем
более должно подвигнуть читателя к всяческому совершенствованию своих художественных
способностей, которые окажут бесценную услугу при профессиональной работе с MAYA.
Тем не менее, если у некоторых из вас после прочтения отдельных разделов возникнет
вопрос: «И что дальше, как же, черт возьми, все-таки моделируется реалистичная человеческая
голова?», то на один вопрос я отвечу двумя: «Что значит реалистичная?» и «А вы уверены, что
у вас получится смоделировать реалистичную голову, в том случае, если вы не можете ее
нарисовать?».
Невежливо как-то получилось... Прощу прощения у задетых за живое читателей.
Для кого эта книга предназначена.
Тут, конечно хочется написать - «для всех». Однако, чуда не будет, существует только
одна книга, предназначенная для всех. Как следует из названия, эта книга для тех, кто хочет
работать с MAYA осознанно, то есть выстраивая логику своих действий заранее, на основе своего
понимания различных инструментов и возможностей MAYA.
Можно сказать, что книга предназначена для сильно мотивированных пользователей. Если
вы только собираетесь освоить программу, эта книга может стать вашим постоянным учебным
пособием и дополнением к огромному вороху упражнений, скопированных у друзей. Однако
вы должны быть весьма сильно заинтересованы в том, чтобы, по каким-то причинам, изучить
именно MAYA, так как эта блестящая программа отнюдь не является легкой для освоения, скорее,
наоборот, требует от осваивающего некоторого упрямства.
Это не означает, что книга написана исключительно для новичков. Она будет полезна и всем
тем, кто хочет углубить свое понимание логики MAYA и найти полезные советы или комментарии. В
ходе изложения я выделяю текст в рубрику «Для взрослых», чтобы большим мальчикам тоже было
что поискать и почитать в этой книге.
Для чайников эта книга не предназначена. Для изготовления чайников лучше использовать
альтернативные программы, в которых имеется готовый примитив «чайник».
Я с большой иронией отношусь к заявлениям типа: «прочитав эту книгу вы сможете немедленно
приступит в выполнению реальных работ на профессиональном уровне» или «или эта книга
откроет вам секреты профессионального мастерства». Я выражусь попроще. Эта книга сэкономит
вам время при изучении MAYA.
Конечно, угодить всем невозможно, поэтому очень сильно занятые трудоголики могут не
читать сей объемный труд, хотя потомки им этого не простят.
Как правило, компьютерные книги можно разделить на две категории. Книги из первой
содержат последовательное описание пунктов меню с различной степенью подробности и являются
локализованными справочниками, порой весьма полезными для уже состоявшихся специалистов.
Вторая категория представляет собой учебники типа «делаем проект от начала до конца»,
22
Книга Сергея Цыпцына
№
содержащие подробные упражнения и пошаговые инструкции, с помощью которых пользователь
может проделать немалую работу и получить в конце концов конкретный результат. К сожалению,
книги этой категории описывают столь малую часть возможностей изучаемой программы, что
можно использовать их лишь для введения в предмет и исследования самых базовых процедур.
Я не буду использовать идею «сквозного проекта», поскольку вымышленный проект, использующий
максимум возможностей такого огромного инструмента как MAYA, был бы весьма искусственным
и надуманным. Реальные небольшие проекты, как правило, используют довольно ограниченный
набор инструментов, соответствующий тематике проекта. Я постараюсь комментировать наиболее
полезные и часто используемые инструменты ЛЛАУА, дополняя это небольшими упражнениями,
направленными на понимание логики использования этих инструментов. Дабы не отрываться от
реальности, я буду также дополнять некотрые разделы комментариями специалистов и приводить
примеры использования описанных инструментов в реальных проектах.
Я понимаю, что подобный замысел выглядит угрожающе (хотя бы по объему), и что
смешивание двух стилей, практического и академического, будет выглядеть эклектично, но я не
вижу другого пути помочь читателю ПОНЯТЬ MAYA.
Второе название книги могло бы быть «Играя в MAYA», ведь один из лучших методов
обучения - это игра. Я не играю в компьютерные игры с 1997 года, и прочитав книгу, вы, возможно,
почувствуете почему.
Как читать книгу.
Настоятельно не рекомендую читать эту книгу за рулем или за едой. Наносит осязаемый
вред вашему здоровью, что совершенно не входит в мои планы. Также не следует читать ее в
присутствии любимой девушки, особенно если она ничем не занята, да еще и громко смеяться
при чтении. Это сильно замедлит процесс рендеринга. В остальных случаях книгу можете читать
как хотите, хоть вверх ногами. Начинающим советую читать ее последовательно, остальным - в
любом порядке, изыскивая тот материал, который вам интересен. Единственное, что посоветую
прочитать всем - главу про изнанку MAYA. Значительно облегчит восприятие всех других глав.
Введение, естественно, следует перечитывать ежедневно.
Данную книгу не следует рассматривать как справочник или документацию. К сожалению,
ее нельзя открыть на произвольном месте и быстро прочитать, за что отвечает тот или иной атрибут
объекта. Плоское, линейное изложение материала предполагает последовательное чтение книги
или хотя бы ее отдельных глав. Напомню, что все это - комментарии к AAAYA.
Как правило, книги по программному обеспечению ощутимо скучны. Для облегчения
процесса чтения и лучшего восприятия информации, я вставил в текст некоторое количество
историй из жизни, отнюдь не все из которых связаны с компьютерной графикой. Во-первых,
это необычно. Во-вторых, те, кому сильно не понравится, смогут с отвращением, граничащим
с удовольствием, пропустить подобные фрагменты со словами: «Это же книга по MAYA, а не
автобиография». В-третьих, надо же как-то самовыражаться, а тут такой случай.
Требования к компьютеру.
Вам нужен персональный компьютер, на котором крутится операционная система Win-
dows2000/XP, или Linux, или MacOSX. Видеокарта с поддержкой OpenGL и хорошие драйвера к ней.
Можно пытаться работать с любой видеокартой (владельцам ноутбуков, например, не приходится
выбирать), но если нормальной поддержки OpenGL нет, то MAYA можно только изучать, причем
небыстро. И как можно больше памяти. Минимум 256 мегабайт.(К тому времени, когда книга
дойдет до пытливых умов, наверняка и половины гигабайта начнет не хватать, не зря же у
производителей программного и аппаратного обеспечения существуют негласные соглашения о
повышении требований к железу по мере увеличения номера версии программ.)
Чем больше памяти, тем более комфортно AAAYA будет себя чувствовать на вашем
компьютере. Частота процессора или объем жесткого диска не играют столь значительной роли. И
Не короткое, но и нескучное введение.
23
1ШШ1
самое главное - трехкнопочная мышь! Без нее даже не думайте подходить к MAYA, в лучшем случае
у вас рухнет система. Вообще-то еще вам понадобится лицензия на программное обеспечение. Но
специально для тех, кто еще не успел купить легальную MAYA, на сайте производителя (www.alias.
com) находится Maya Personal Learning Edition. Это специальная версия MAYA, предназначенная
для некоммерческого использования. Она содержит некоторые ограничения - на просчитанных
изображениях будут появляться кое-какие текстовые логотипы. Также она не позволяет подключать
плагины, и для хранения сцен использует формат, несовместимый с коммерческой версией.
Скачивается абсолютно бесплатно и для целей обучения более чем подходит.
Терминология.
Советую прочитать этот раздел внимательно, ибо в нем я заключаю некоторые соглашения
с читателем, а также пытаюсь ввести в шок литредактора (ха-ха! - прим. литредактора). Я прочитал
немало книжек по компьютерной графике, переводных и не совсем. Порой ломал голову над
значением термина «тонировщик» или «гипертонировщик». Мне приходилось в уме переводить
термин «многоугольники» в привычное «полигоны», чтобы понять, что речь идет о полигональном
моделировании, а не о «многоугольниковом».
Моя позиция в этом вопросе экстремальна и проста. Я пять лет провожу семинары
пользователей AAAYA и являюсь свидетелем формирования профессионального жаргона, на
котором общаются между собой абсолютно все майские специалисты. И прекрасно друг друга
понимают. Зайдите в любой русскоязычный форум по MAYA - там все термины как на ладони. Я
лишь обозначу основные из них, чтобы совсем уж новички не пугались необычных буквосочетаний.
Большинство терминов переводиться не будет: фраза «выберите в окне Outliner камеру Тор» должна
восприниматься буквально. Ибо если я напишу: «Выберите в панели Гипертонировщика градиент-
тонировщик», то потребуется изрядная мысленная работа для превращения этой инструкции в
привычное «В панели Hypershade выберите RampShader». Однако некоторые термины требуют
перевода просто потому, что они часто склоняются, и перевод будет, как правило, осуществляться
простой транслитерацией. Самый главный термин в этом списке это Node. Это ключевое понятие
в MAYA и по смыслу оно лучше всего переводится как «элемент» ( или даже как «первоэлемент»...
Прим. Тех. Ред). Правда, если вы залезете в словарь для перевода Node, то ничего подходящего
там не найдете. Некоторые из вас слышали дивный шедевр рекламного творчества: «Архитектура
MAYA, основанная на узлах»! Это перевод фразы « AAAYA node-base architecture», которая просто
означает объектно-ориентированную архитектуру. Все уже давно привыкли к термину «нода»
и употребляют его как обычное слово, поэтому я тоже буду его использовать именно в таком
виде, склоняя по правилам русской грамматики. Термин «скрипт» тоже будет употребляться как
русское слово, а вот переводить expression как «выражение» я не стану. Просто фраза «напишем
выражение 'print $а;' », может толковаться как просто текст написанный в каком-либо окне, а
вот фраза "создадим expression 'print $а;' », однозначно предполагает написание кода в окне
Expression Editor. Далее, термины «материал» и «шейдер» в книге означают одно и тоже, и
являются непереведенным «тонировщиком». Вместе со словом «просчет» я буду употреблять уже
прижившееся «рендеринг» со всеми его глагольными вариантами. Плагины останутся плагинами
и не станут подключаемыми модулями. (Представьте такую фразу: «Я вчера выкачал пару
подключаемых модулей для тонирования стекол»).
По аналогии с нодами термин «констрейн» (Constrain) совсем обрусел и выражение
«приконстрейнить» имеет вполне осязаемый смысл, не совсем отражаемый словом «прикрепить».
«Скининг» (Skinning) также останется без перевода (сами подумайте, что достаточно краткое можно
придумать, ...«Кожинг»?! «Шкуринг»?! Таксидерминг?!). Subdivision surfaces обычно произносятся
по-русски как «сабдивы», и я постараюсь употреблять как русское, так и английское название.
Чтобы совсем не довести литредактора до инфаркта, я не буду использовать уже устоявшийся
термин «навалить шейдер», а буду стараться говорить «назначить материал» (воды! воды!.. -
крик литредактора). По этой же гуманной причине мне придется расстаться с универсальным и
чрезвычайно удобным термином «заколбасить», так часто употребляемым на форумах и в устных
дискуссиях, обозначающим практически все действия, производимые пользователем при работе в
MAYA. Также я буду стараться не говорить «партиклы» и употреблять «частицы».
Договоримся также, что LMB, ММВ, RMB - это левая, средняя и правая кнопка мыши (Left
Mouse Button... etc.).
24
Книга Сергея Цыпцына
В заключение вспомню, как я впервые увидел русифицированную энтузиастами МАУА(это
несложно технически). Все было неплохо, пока я не наткнулся на пункт меню «Правка=>Удалить
по типу=>Пруток"! Что это означало? Вот вам и задание на дом.
Освоение MAYA.
Освоение основ МАУАпохоже на программирование на C++. Сначала вы долго разрабатываете
классы, ругаетесь, бросаете и все переделываете. А потом уверенно и с удовольствием пишете
хорошие программы, используя написанные библиотеки классов.
MAYA непроста. Количество инструментов огромно. Начальный этап освоения MAYA требует
прежде всего терпения и последовательного изучения основных возможностей пакета. Но в какой-
то момент вы почувствуете свободу владения предметом и поймете, что представляете решение
той или иной задачи с использованием уже известных вам инструментов. Это и будет прорыв,
после которого жить вы будете долго и счастливо. (Совет. Купите себе кожаные штаны. Будете
просиживать их по 18 часов перед экраном монитора, напрочь забыв о сне и аппетиных шпикачках.
В глазах появиться нездоровый блеск, на зеленых щеках - лихорадочный румянец. Ваша невеста
выйдет замуж за капитана дальнего плавания, он все-таки чаще бывает дома, а старушки во дворе
будут неистово креститься, завидя вас ...- прим. Тех. Редактора. )
Ваша цель - не изучить все возможности MAYA, а именно ощутить свободу владения
основными инструментами, понять их одинаковую структуру, почувствовать логику использования
различных модулей MAYA.
Традиционное изучение MAYA от простого к сложному зачастую затрудняется тем, что
в программе нельзя четко разграничить инструменты по их «амплуа». Анимационные средства
могут использоваться для построения поверхностей, а операции моделирования позволяют
получать небанальные эффекты, анимируя атрибуты истории. Все средства MAYA очень тесно
переплетаются между собой. Для эффективной работы важно не столько выучить избранные пункты
меню (например, меню Modeling), сколько уметь правильно определить workflow - путь решения
проблемы - для чего знать и понимать возможности пакета в «смежных областях» Парадоксально,
но факт, что чем уже специализация, тем шире должны быть знания. К тому же в MAYA всегда
существует более одного пути решения. И наиболее эффективный путь может пролегать через
области, на первый взгляд не имеющие никакого отношения к формулировке первоначальной
задачи.
Советую вам относиться к освоению MAYA как к игре. Экспериментируйте, ведь MAYA
буквально провоцирует пользователя ставить эксперименты над ней. Соединяйте объекты
различными связями, заставьте твердые тела падать вверх, управляйте цветом при помощи частиц,
дайте волю своим патологическим наклонностям и всегда пытайтесь понять, что происходит.
Играйте! (Не обижайтесь только из-за того, что AAAYA будет иногда «падать». Как говаривал наш
полковник-преподаватель гражданской обороны: «Если в соломорезку засунуть рельсу, то она
сломается». Кто «она» он не уточнял.)
Требования к мозгу.
Как уже упоминалось выше, MAYA - инструмент для взрослых. И умных. Ваш мозг должен
весить не менее двух килограмм. Если вы еще не умеете считать до трех, то вам пока рано
заниматься 3D. Займитесь пока 2D.
При изученииМАУАнаибольшую помощь вамокажет ваше логическоемышление. Техническое
образование является несомненным плюсом при освоении MAYA. Художественное образование,
напротив, мало вам поможет при изучении пакета, но при работе с MAYA художественный опыт даст
вам огромные преимущества. Хотя при освоении инструментов художественный опыт подскажет,
на какие детали и возможности стоит обратить внимание в первую очередь.
Навыки программирования окажут вам большую услугу как во время обучения, так и в
процессе работы. Опыт, приобретенный в 2D, полиграфии, на монтаже - все это облегчит освоение
Не короткое, но и нескучное введение.
25
1ШША
MAYA.
Идеально, если у вас уже есть практика работы в 3ds max или Lightwave. Это существенно
облегчит освоение MAYA, но потребует отказаться от некоторых зловредных привычек. Если вы
используете Softimage3D или XSI, то вряд ли вы держите в руках эту книгу и, если уж и читаете
эти строчки, то никому и никогда об этом не скажете.
И самое главное - терпение. MAYA не осваивается быстро и требует большого количества
вложенных усилий. Но, потратив много сил, вы получите очень большую свободу, которая окупит
все ваши затраты.
Источники знаний о MAYA.
Самый главный ресурс при освоении AAAYA - кнопка F1. Там все написано. Правда, там
совсем нет русских букв и, как правило, не рассказано как решать проблемы. Тем не менее, это
ресурс номер один.
На русском языке книг о AAAYA не так много, и они довольно сильно обезображены
переводом. Для тех, кто уже немного владеет AAAYA, могу порекомендовать книгу «Шонхер М.
ИССЛЕДУЕМ AAAYA 4. 30 УРОКОВ В 3D.», которую отредактировал и довел до приемлемого уровня
Володя Забелин. Благодаря ему, эта книга на русском языке выглядит вполне адекватно.
Про книги отечественных авторов, вышедшие до сих пор, я не скажу ничего. Сколько не
просите.
Из зарубежных книг лучшей на мой взгляд является «Inside Maya 5». Она предназначена
для довольно искушенных пользователей AAAYA и делает упор на практическое использование AAAYA
в условиях реального производства.
Интернет на сегодняшний день буквально кишит информацией о AAAYA, включая
многочисленные статьи, видеоучебники, туториалы и пр. Проблема состоит в том, чтобы отделить
хороший материал от халтуры (звучит как трюизм). Я могу перечислить лишь основные источники,
качество которых меня устраивает. Законодателем в области видеоуроков является компания
Gnomon (www.gnomononline.com). Наибольшее скопление интернетовских учебных материалов
сосредоточено на www.learning-maya.com. Правда количество не означает качество в данном
случае. Хорошие учебники можно найти на www.highend3d.com - там же и лучшие форумы по
MAYA. Достойно отвечают на вопросы на www.cgtalk.com.
Есть также ряд отечественных сайтов, публикующих неплохие материалы по MAYA.
Как уже упоминалось выше, аутентичным источником знаний о AAAYA являются труды Свами
Вивекананды (www.vivekananda.ru).
О чем эта книга
А книга эта об отношениях. Моих отношениях с AAAYA. Заранее прошу прошения за
исключительную субъективность.
26
Книга Сергея Цыпцына
Витрина. Интерфейс MAYA
Принципы построения интерфейса
Для начала приведу небольшую выдержку из компьютернографического эпоса, которая
охарактеризует представителей различных трехмерных конфессий.
Бывают «максисты» - исключительно нервные люди, постоянно срывающиеся на мат,
часто повторяющие «от ламера и слышу», увлеченные разведением чайников. Есть «майщики»
- эти просто маньяки, вечно они куда-то торопятся, на любые обращения отвечают лишь «напиши
скрипт» и сутками настраивают свой интерфейс. Есть «сишники» и «ксишники» - они практически
аутисты, ни с кем не общаются, сознавая, что круче них только «Гудини». «Лайтвейвщики» лишь
блаженно улыбаются, у них «Лайтвейв» всегда с собой, они ставят его на любые включенные
машины со словами: «Какие сплайны? У нас вот рендер лучше всех!». А «гудинисты» невидимы
для обычного глаза, так как про них все только слышали... Они снисходительно-заносчивы: ведь
любую проблему способны решить, пусть в течение года. А от разных «синематографистов»,
«риэлсофтовцев», «труспейсовцев», «брайсистов» слышишь вечное: «Ну, начал я в максе, ничего
не достиг, а как перешел на этот /тут надо подставить по смыслу.../, все и поперло! Поэтому макс
- отстой, майя - отстой, и все вокруг - отстой»1.
Что касается пользователей MAYA, в этой шутке есть изрядная доля правды. Настройка
майского интерфейса похожа на игру - как сделать еще удобнее, как работать еще быстрее. Этот
процесс можно также сравнить с бесконечным тюнингом автомобиля или маниакальным апгрейдом
компьютера. Все это можно делать долго и с большим удовольствием. Главное же - с пользой.
Я не хотел превращать эту главу в устрашающее перечисление кнопок и меню и поэтому
постарался изложить лишь принципы построения основных частей интерфейса AAAYA, а самое
главное: логику его изучения. Так, чтобы в любых версиях AAAYA вы смогли без труда освоить
любые новые и незнакомые элементы. Тем не менее, перечислений при изложении порой не
избежать: все-таки это - интерфейс трехмерной программы, а не скринсейвера. Для «развлечения»
я вставил с текст некоторое количество трюков, примечаний и уловок, чтобы взрослым мальчикам,
не новичкам, тоже было чем заняться, все-таки выуживая из этой главы новую информацию и с
раздражением пропуская знакомые вещи.
Как я уже упоминал, в процессе разработки MAYA были использованы лучшие идеи
и возможности всех ее пакетов-прародителей. Поэтому интерфейс AAAYA, ее рабочая среда,
были адаптированы сразу для трех больших категорий пользователей. Этим объясняется
исключительная гибкость и настраиваемость интерфейса. Если вы привыкли работать при помощи
горячих клавиш, можете создать произвольное их количество, назначив на каждую клавишу целую
последовательность действий. Если вам ближе полки с кнопками, можно создавать их под любой
тип работы, переложив на них любые пункты меню. Если вы экономите экранное пространство и
предпочитаете максимальную скорость работы - к вашим услугам Marking Menu и HotBox. Это все
очень хорошее и нужное разнообразие. Правда, начинающих пользователей часто обескураживает
то, что в MAYA одно и то же действие можно выполнить пятью-шестью разными способами.
Совет для начинающих. Не пытайтесь запомнить ВСЕ способы выполнения той или
иной операции. Выберите один, который более всего подходит вашему характеру.
Иногда вы даже можете сконструировать свои методы работы, не описанные в
документации.
Из истории. Во времена MAYA 1.0 ко мне как-то зашел Саша «Joss» Халявин -
продемонстрировать некоторые примеры майской анимации. Спросил разрешения
установить свои настройки интерфейса, повозился с дискеткой, потом открыл
MAYA и... заиграл, как на пианино. Пальцы его быстро барабанили по клавишам, а на
экране началась бурная жизнь: открывались окна, двигались объекты, крутилась
анимация. Дело в том, что, обладая отличной памятью, он назначил потрясающее
количество инструментов и функций на горячие клавиши - и это позволяло ему
ставить рекорды по скорости взаимодействия с MAYA.
Схема интерфейса AAAYA вместе со списком основных горячих клавиш представлена далее.
1 Ну, для совсем новичков: имеются в виду графические программы 3ds max, Maya, SI
(Softimage), XSI, Houdini, Lightwave3D, Cinemate4D, RealSoft, TrueSpace
28
Книга Сергея Цыпцына
Список основных горячих клавиш
F1 самая горячая клавиша...
F2 режим анимации
F3 режим моделирования
F4 режим динамики
F8 включить/выключить режим выбора компонент
F9 включить режим выбор вертексов
F10 включить режим выбора граней
F11 включить режим выбора ребер
F12 включить режим выбора UV-координат
Ctrl+n новая сцена
Ctrl+o открыть сцену
Ctrl+s сохранить сцену
Ctrl+Shift+s - сохранить сцену с новым именем
Ctrl+q выход
Ctrl-z Undo
z Undo
Shift-z Redo
Ctrl-d дублировать объект
Ctrl-g сгруппировать объекты
Ctrl-h спрятать выбранные объекты
Ctrl-a показать Attribute Editor
или + увеличить размер манипулятора
уменьшить размер манипулятора
Интерфейс
29
q выбор (Select Tool);
w перемещение (Move Tool);
г вращение (Rotate Tool);
s масштабирование (Scale Tool);
t манипулятор (Show Manipulator Tool).
у последний использовавшийся инструмент
g последняя использованная операция
Insert редактирование пивота объекта
Alt-v включить/выключить проигрывание анимации
Esc выключить проигрывание анимации
s поставить ключ
Shift-w поставить ключ на каналы перемещений
Shift-y поставить ключ на каналы вращений
Shift-r поставить ключ на каналы масштабирования
1 низкое качество отображения объектов
2 среднее качество отображения объектов
3 высокое качество отображения объектов
4 каркасное (wireframe) отображение объектов
5 закрашенное (shaded) отображение объектов
6 текстурированное отображение объектов
7 отображение объектов с учетом освещения
8 Paint Effect (поначалу это шокирует)
а наехать камерой на все объекты сцены
Shift-a наехать камерой на все объекты сцены во всех окнах
f наехать камерой на выбранные объекты
Shift-f наехать камерой на выбранные объекты во всех окнах
с временная привязка к сетке
х временная привязка к точкам
v временная привязка к кривым
Alt+стрелка - переместить выбранный объект на 1 пиксель в направлении стрелки
Alt+> кадр вперед
Alt+< кадр назад
Модульность. Метод «тыка»
Основной принцип интерфейса MAYA - модульность. Все элементы, которые вы видите на
экране, могут быть спрятаны и показаны в любой момент и независимо друг от друга. Проделайте
три действия (надеюсь, что запустить MAYA умеют все, кто дочитал до этого места):
Выберите меню Display=>UI Elements=>Hide Ul Elements.
Потом нажмите <Ctrl-m>, а затем <Shift-m>.
То, что вы увидите на экране, вовсе не Expert Mode и не специальный режим, просто вы
убрали с экрана ненужные вам элементы интерфейса.
Верните все обратно: Display=>UI Elements=>Show Ul Elements.
Потом опять <Ctrl-m>, затем <Shift-m>.
Чтобы спрятать только определенную часть интерфейса, можно открыть меню Display=>UI
Elements и в нем, «методом тыка», установить, как называется тот или иной элемент. Для ускорения
процесса можно «оторвать» меню, щелкнув по двойной линии в самом начале меню. Другой, более
30
Книга Сергея Цыпцына
быстрый, но менее познавательный способ состоит в следующем: у каждого элемента интерфейса
есть свой «напильник» (окружен красным слева на рисунке ниже).
Щелкнув по нему мышкой, можно этот элемент спрятать, а нажав над любым «напильником»
правую кнопку мыши, вы опять попадете в список-меню всех элементов интерфейса, где сможете
поставить нужные галочки.
Для взрослых. Если вас «достала» синяя планка над меню (Title Bar), которая в
классической схеме съедает 23040 пикселей на экране (18x1280), можете спрятать
ее с помощью последовательности Windows=>Settings/Preferences=>Preferences...,
где в категории Interface нужно выключить галочку Show Title Bar In Main Window.
Либо выполните в Script Editor команду
window -e -tb 0 MayaWindow;
Глаза и уши MAYA
Теперь рассмотрим элементы интерфейса поотдельности. Если вы уже прилично знакомы с
интерфейсом, вам, возможно, будет все-таки небезынтересно почитать советы и комментарии. Но
я просто вынужден подробно рассказывать здесь про интерфейс, так как именно в этом заложены
основные возможности по оптимизации дальнейшей работы с MAYA.
Самый главный элемент - окно камеры. Если это перспективная камера, то управлять ею
вы можете при помощи кнопок
Alt+LMB - вращение (Tumble)
Alt+MMB - перемещение (Track)
Alt+RMB - наезд-отъезд (Zoom) (или Alt+LMB+MMB)
мыши
Напомню, что здесь и далее LMB означает "левая кнопка мыши", ММВ - "средняя кнопка
, RMB - "правая кнопка мыши" .
Эти комбинации действуют во всех окнах и панелях, которые допускают панорамирование
и увеличение изображения, или «зумирование» (например, в окне HyperShade или даже в Render-
View).
В апреле 2004 года в истории MAYA произошло грандиозное событие. К этому событию все
пользователи MAYA с нечеловеческим терпением готовились шесть лет. Шестая версия AAAYA стала
откликаться на колесо мыши! Теперь во всех окнах и панелях, которые допускают зумирование и
прокрутку, можно неистово вращать колесо, осуществляя наезды-отъезды.
Интерфейс
31
LiI.O.IJi
Фокусы MAYA
Важную роль играет понятие "фокуса" (или "фокуса ввода").
MAYA "слышит" все горячие клавиши через активную камеру или панель. Панелей может
быть несколько и поэтому активная всегда помечена "фокусом" - синей рамкой по краям. (Цвет
рамки, естественно, зависит от настроек интерфейса операционной системы, и синим он будет
только по умолчанию). Если фокус не находится ни в одной из панелей (например, когда вы
вбиваете номер кадра на TimeLine и фокус ввода находится в текстовом поле для номера кадра),
то MAYA просто не воспринимает горячие клавиши.
Поэтому при выполнении любых клавиатурных команд следите, чтобы фокус находился в
одной из панелей, иначе MAYA просто вас не услышит и горячие клавиши не будут работать. Когда
надо вернуть фокус в панель, достаточно щелкнуть правой кнопкой мыши в любом месте этой
панели или камеры.
Некоторые окна так и норовят перетянуть фокус на себя, особенно Attribute Editor,
содержащий много текстовых полей. Поэтому хотя бы первое время будьте внимательны и следите
за тем, «куда» вы вбиваете горячие клавиши.
Горячие клавиши для команды Undo - Ctrl-z или z; для Redo - Shift-z.
Меню MAYA
Следующий элемент интерфейса - главное меню, располагающееся в верхней части окна
MAYA. Оно состоит из семи постоянных пунктов (File, Edit, Modify, Display, Create, Help) и нескольких
наборов остальных пунктов, которые меняются в зависимости от режимов работы с MAYA: ведь
если вывести на экран сразу все меню AAAYA, строка меню превратится в целый «абзац».
Для взрослых. Вы можете сделать это сами, написав две строчки на MEL:
string $it, $list[] = 4slll -m x;
for($it in $list) iffgmatch $it "main*"') menu -e -vis 1 $it;
Примечание. Раскрою один страшный секрет. В команде разработчиков есть один
специально обученный человек, занимающийся тем, что для каждой новой версии
MAYA немного меняет структуру и расположение меню, чтобы у пользователей
было чувство, так сказать, «новизны» от очередных версий. Причем некоторые
изменения являются явно искусственными и жутко бесят пользователей уже
привыкших к определенному расположению меню. Если вы не увидите описанных в
книге пунктов меню на своих местах, поищите их рядом, как правило, они далеко
не «убегают».
Режимы работы
Работа пользователя в AAAYA условно разделена на несколько режимов - с точки зрения
характера выполняемой работы.
Список режимов работы (Animation, Modeling, Dynamics, Rendering ) находится ниже
главного меню в правой верхней части экрана. Переключая режимы работы, получаем только те
пункты меню, которые соответствуют выбранному режиму.
32
Книга Сергея Цыпцына
Горячие клавиши для переключения режимов работы:
F2 - Animation, F3 - Modeling, F4 - Dynamics, F5 - Rendering.
Для тех, кто совсем недавно открыл MAYA, основным рабочим меню в первое время может
быть Create=>NURBS Primitive или Create=>Polygon Primitive, где можно создавать уже готовые
примитивы различной формы. Тренируйтесь на них, изучая различные инструменты и режимы
отображения, и не забывайте, конечно, операцию удаления...
Суперсовет. Когда курсор находится над каким-либо пунктом меню, то внизу, в
строке Helpline у появляется краткое описание того, что может делать это пункт
меню, и, самое главное: что надо выбрать перед тем, как выполнить этот пункт
меню (см. рисунок внизу). Рекомендую читать эту подсказку как можно чаще. Она
избавит вас от необходимости запоминать процедуру применения тех или иных
пунктов меню к выбранным объектам, а также сильно поможет вам при изучении
новых и еще незнакомых пунктов меню.
Почти все выпадающие меню имеют сверху двойную полоску, за которую их можно
"оторвать" (Tear Off) и оставить постоянно на экране.
Интерфейс
33
«Глюк»: Подсказка в HelpLine не работает с «оторванными меню».
Рядом с некоторыми пунктами находятся "коробочки" (Option Box), открывающие доступ
к параметрам, используемым при выполнении этого пункта меню. Заходя в эту коробочку (то есть
выбрав ее как пункт меню), можно изменить параметры и, соответственно, результат выполнения
пункта меню. Например, можно создать примитивную сферу целиком, а можно указать End Sweep
Angle=90 и создать только ее четвертинку. Эта маленькая «коробочка» - очень важный элемент
каждого пункта меню. Я бы посоветовал обратить особое внимание начинающих пользователей на
нее. Набор параметров, скрывающийся за каждым пунктом меню может быть воистину огромным
и, в зависимости от значений параметров, качественно менять результат выполнения команды.
Именно Option Box позволяет MAYA, обладая столь малым (шутка!) количеством пунктов меню,
реализовывать столь богатые инструментальные возможности. Каждый пункт меню превращается,
благодаря Option Box, в целый набор инструментов
В любом окне Option Box кнопка Close просто закрывает окно, кнопка Apply выполняет
действие и не закрывает окно, а крайняя левая кнопка выполняет действие и закрывает окно.
Если вы хотите вернуться к установкам по умолчанию, в любом Option Box есть меню
Edit=>Reset. Помните также, что AAAYA запоминает установки каждого окна Option Box и сохраняет
эту информацию даже после выхода из программы.
34
Книга Сергея Цыпцына
Панели и камеры
По умолчанию MAYA открывается с одним большим окном перспективной камеры. Область
расположения этой камеры вида на экране называется панелью (Panel). Нажав пробел, можно
переключиться в четыре панели с камерами ортогональных проекций. Наведя курсор на любую из
панелей и нажав пробел, можно распахнуть панель обратно на весь экран.
Таким образом, на экране может быть несколько панелей и в каждой из них могут располагаться
камеры (перспективные и ортографические) и другие окна, допускающие панельное представление.
Чтобы изменить содержимое панели (включить другую камеру или вид), надо воспользоваться
меню Panels в верхней части панели.
Совет. Можно перетаскивать камеры средней кнопкой мыши из Outliner прямо
в текущую панель. Это действие соответствует пункту меню Panels=>Look
Through Selected и позволяет смотреть «сквозь» выбранный объект. Аналогичные
действия можно производить и с источниками света, что делает настройку их
расположения весьма удобной.
Layouts. Схемы расположения панелей
Количество и размещение панелей на экране называется Layout.Чтобы изменить размер
панелей, достаточно перемещать их границы мышью.
Чтобы изменить количество панелей и их взаимное расположение, достаточно выбрать нужный
пункт в меню Panels=>Layouts.
Можно также запомнить текущее расположение и размер панелей и создать Saved Layout
для дальнейшей работы.
Это можно сделать через меню Panels=>Saved Layouts=>Edit Layouts..., где также находится
Интерфейс
35
Совет. Если вдруг у курсора вашей мыши неожиданно появился «прицеп» типа
полосатого прямоугольника, значит в данном месте экрана по нажатию правой
кнопки мыши выскочит контекстное меню, связанное с элементом интерфейса,
который находится непосредственно под курсором мыши.
Режимы представления геометрических
объектов на экране
Объекты в окне камеры могут быть представлены в различном виде. Самое "легкое"
представление - каркасное (wireframe), но можно также включать закраску (Shaded)
объектов, показывать на них текстуры (Textured) или отображать действие источников
света.
To или иное представление выбирается независимо для каждой камеры или панели
при помощи меню Shading. Если ваша видеокарта поддерживает качественное отображение
материалов, вы можете включить режим высококачественного аппаратного рендеринга
(Shading=>High Quality Rendering).
Для изменения режима отображения геометрии на экране удобно пользоваться горячими
36
Книга Сергея Цыпцына
набор предустановленных по умолчанию схем размещения панелей.
К услугам совсем ленивых в левой части окна MAYA находятся иконки для уже
предустановленных схем размещения. Не забудьте нажать также правую кнопку мыши над ними.
№.
клавишами, не забывая про то, в какой панели находится фокус.
Горячие клавиши для переключения режимов представления объектов таковы:
4 - wireframe; 5 - smooth shaded; 6 - textured; 7 - lights
Если вы случайно нажали клавишу 8, нажмите ее скорее еще раз и никому не говорите, что
вы увидели панель PaintEffects.
Качество отображения объектов
Объекты на экране могут быть также представлены с различной степенью детальности.
Это справедливо для кривых и поверхностей NURBS и Subdivision Surfaces. Изменить качество
отображения любого выбранного объекта можно через меню Display или воспользовавшись
горячими клавишами.
Горячие клавиши для изменения качества отображения поверхностей таковы:
1 - грубое (Rough); 2 - среднее (Medium); 3 - высокое (Fine).
Качество отображения никак не меняет саму геометрию объекта и его внешний вид на
финальном изображении.
Примечание. Даже идеально гладкие поверхности отображаются на экране в виде
набора полигонов. Дело в том, что видеокарта, функция которой состоит в
прорисовке объектов, умеет работать только с полигональными объектами и
ничего не знает про сплайны или сабдивы. Поэтому при выводе на экран эти объекты
тесселируются, то есть разбиваются на полигоны. Качество отображения как
раз и задает количество полигонов, на которые разбиваются гладкие объекты. (В
случае кривых - количество прямых отрезков, аппроксимирующих кривую). Раньше,
когда видеокарты были слабыми и дорогими, а программное обеспечение стоило
десятки тысяч долларов, у пользователей просто не оставалось средств на
мощные видеоускорители, и они (пользователи), разоренные покупкой программ,
были вынуждены вращать свои модели на экране с минимальным качеством
отображения. Именно поэтому до пятой версии MAYA режим Rough (грубое качество)
являлся режимом по умолчанию. Сейчас видеокарты стали мощными монстрами,
цена на программы упала в десять раз, поэтому по умолчанию сплайновые объекты
отображаются с высоким качеством.
Но уж если вы не смогли удержать себя в руках и насоздавали такое большое количество
объектов, что даже ваша мощная видеокарта предлагает Вам попить кофейку, прежде чем
отрисует всю вашу сцену, то с помощью меню Shading можно переключиться в совсем уж в простое
отображение объектов: bounding box или points.
Удобно также запрещать или разрешать показ различных типов объектов независимо для
каждой камеры при помощи меню Show. В двух соседних панелях можно работать только с кривыми
или только с поверхностями соответственно, редактируя кривые и контролируя проходящую через
них поверхность.
Интерфейс
37
Терминологический комментарий
В русскоязычном майском сообществе сложились названия режимов отображения на
основе горячих клавиш, соответствующих им. Выражение «переключись в шестерку» соответствует
команде включения текстур, а заявление «в тройке тормозит» означает тяжелую сцену, которая
еле поворачивается, если для всех объектов выбран режим Fine.
Наезды, подъезды и отъезды.
Есть несколько полезных приемов управления камерой в любой панели. Если вам нужной
быстро наехать на один или несколько объектов, выберите их и нажмите клавишу f. Shift-f сделает
это во всех видимых панелях. Клавиши а и Shift-a сделают наезд на все видимые объекты в сцене,
а не только на выбранные. При наезде происходит не только перемещение камеры к выбранному
объекту, но также точка, вокруг которой камера вращается при нажатии Alt+LMB, устанавливается
в центр выбранного объекта (или объектов). Поэтому дальнейшие повороты камеры в окне будут
происходить вокруг выбранных объектов. (Вышеуказанным горячим клавишам соответствуют
пункты меню View=> Frame Selection /All в панели камеры.)
С помощью мыши можно производить наезды-отъезды, нажимая Ctrl-Alt и рисуя левой
кнопкой мыши прямоугольник вокруг некоторой области на экране. Причем если вы будете
рисовать контур слева направо, то изображение в прямоугольнике будет увеличиваться и камера
будет как бы наезжать на выделенный контур. Если рисовать контур справа налево, то будет
осуществляться отъезд от выделенной области.
Все эти трюки можно использовать не только в панелях камер, но и в других окнах типа
HyperGraph или RenderView.
Совет. Поэкспериментируйте с Ctrl-Alt и средней и правой кнопками мыши. И не
пытайтесь запомнить все способы и пользоваться ими. Используйте наиболее
понравившийся - он и есть самый лучший.
Глюк, который не глюк: В режиме «наезда-отъезда» (Alt+RMB) наезд происходит
при движении мыши слева-направо или сверху-вниз. Поэтому при диагональных
движениях мыши с левого верхнего угла в правый нижний наезд происходит, а с
правого верхнего в левый нижний - нет...
Пункты меню View=> Previous /Next View и, соответственно, горячие клавиши «]» и «[»
позволят вернуться к предыдущему или перейти к следующему положению камеры. А если вы
хотите, чтобы все перемещения камеры попадали в очередь Undo, включите в меню камеры
View=>Camera Settings =>Undoable Movement.
38
Книга Сергея Цыпцына
№
Инструменты на каждый день
Слева от основной панели находится ToolBox - панелька для доступа к основным
инструментам (Tools) программы MAYA:
Иконки инструментов говорят сами за себя.
Select Tool - выбор;
Lasso Tool - тоже выбор;
Move Tool - перемещение;
Rotate Tool - вращение;
Scale Tool - масштабирование
Soft Modification Tool - пропорциональная трансформация
Show Manipulator Tool - секретный манипулятор.
В последнюю клетку на ToolBox попадает последний использованный инструмент (Tool),
который отличается от вышеперечисленных. Об этом позже еще поговорим.
Легко запомнить горячие клавиши для основных инструментов:
q - выбор (Select Tool);
w - перемещение (Move Tool);
г - вращение (Rotate Tool);
e - масштабирование (Scale Tool);
t - манипулятор (Show Manipulator Tool);
у - последний использовавшийся инструмент.
Примечание. В седьмой версии MAYA появился дополнительный Универсальный
Манипулятор, умеющий делать ВСЁ! Не буду лишать вас удовольствия освоить
его самостоятельно, тем более, что «метод тыка» делает этот процесс весьма
азартным. Не забывайте только нажимать Shift или Ctrl, работая с масштабом,
и оцените возможность вбивать значения трансформаций прямо на экране.
Интерфейс
39
К сожалению, этот манипулятор не работает с компонентами, а только с
объектами. Горячая клавиша для него Ctrl-t.
Перемещение, вращение, масштабирование называются трансформациями (или линейными
преобразованиями, в отличие от деформаций, или нелинейных преобразований) и осуществляются
при помощи соответствующих манипуляторов для выбранных объектов.
Для взрослых. К трансформациям, или линейным преобразованиям, также
относится преобразования сдвига (shear), но в силу сравнительно редкой
необходимости их использования манипуляторов для сдвига нет. Да и сами
атрибуты сдвига (по умолчанию) можно обнаружить, лишь открыв Attribute
Editor для соответствующей трансформационной ноды.
Концептуально режимы перемещения, вращения и масштабирования включают в себя
инструмент Select и позволяют не только трансформировать объекты, но и выбирать их, не
переключаясь в режим выбора. Сейчас это воспринимается как само собой разумеющееся, но
если вы хотите почувствовать, как люди работали до 1998 года, выберите один из нескольких
объектов и нажмите кнопочку с изображением замка, находящуюся наверху на StatusLine.
Это заблокирует возможность выбора объектов при использовании инструментов Move,
Rotate и Scale (и других). Чтобы перемещать остальные объекты, вам придется переключиться
сначала в инструмент Select, выбрать нужный объект и затем вернуться к режиму перемещения.
Совет. Когда вы работаете в MAYA, у вас в руках (а точнее в курсоре мыши) всегда находится
какой-нибудь инструмент. Помните об этой концепции.
Манипуляторы имеют общую идеологию: перемещать/вращать/масштабировать объекты
относительно нужных осей можно при помощи соответствующих стрелок/колец/кубиков. Цвет осей
или колец манипуляторов соответствует осям XYZ и легко запоминается по аналогии с XYZ=RGB:
Х-красный, Y-зеленый, Z-синий.
Центр манипулятора действует по-разному. С масштабированием все понятно, а вот
перемещение за центральный квадратик в Move Tool сдвигает объект перпендикулярно линии
взгляда, то есть в плоскости экрана. Аналогично внешнее кольцо Rotate Tool поворачивает объект
вокруг линии взгляда.
40
Книга Сергея Цыпцына
Совет. Не используйте центр манипулятора Move Tool в панели перспективной
камеры. Особенно на первых порах. Объект будет перемещаться весьма
непредсказуемо для вас.
Чтобы перемещать или масштабировать объект только в одной плоскости, надо нажать Ctrl
и перемещать ось, перпендикулярную этой плоскости.
Совет. Если вас смущает, что манипулятор Move Tool остался перпендикулярным
к использованной оси надо, нажав Ctrl, щелкнуть по центру манипулятора.
Совет. Используйте активно горячие клавиши «+» и «-» для изменения размера
манипуляторов, особенно в тех случаях, когда последние сливаются с геометрией.
Для тех, кто хочет поиздеваться над манипуляторами со вкусом, в окне
Windows=>Settings/Preferences=>Preferences... есть категория Manipulators, где вы
можете дать волю своим скрытым желаниям.
Совет. Перемещать выбранный объект можно и «попиксельно» (примерно как
это делается в 2D пакетах, таких как Photoshop) с помощью комбинации горячих
клавиш: Alt+стрелка соответствующего направления.
Проблема выбора.
При работе с инструментами MAYA важно знать не только количество выбранных объектов,
но и зачастую порядок их выбора. Поэтому я остановлюсь на методах выбора объектов и
компонентов подробнее. Визуально выбранные объекты окрашены либо в белый, либо в зеленый
цвет. Зеленый - это последний выбранный объект (leading object). Для некоторых операций важно
выбрать объект определенного типа последним (например, выбор кривой при создании анимации
по пути). Цветовое выделение позволяет визуально контролировать порядок выбора объектов.
Если вы хотите дополнительно выбрать еще несколько объектов (то есть добавить объекты к
списку выбранных ), нажмите Ctrl-Shift и выделяйте объекты прямо в окне. Если хотите снять
выделение с некоторых объектов нажмите Ctrl и также отмечайте объекты мышкой.
Примечание. Если вы натягиваете рамку выделения, отмечаются все объекты,
попадающие (хоть немного) в эту рамку. Если вы просто щелкаете мышкой по
объекту, то выделяется только один объект, находящийся под курсором мыши.
Например, если вы поместили десять одинаковых конусов в одно место и щелкните
над ними мышкой, то выделится только один конус, тогда как в случае выделения
рамкой будут отмечены все десять.
Совет. Если вы хотите, чтобы MAYA вас спрашивала, какой из объектов под
курсором мыши выбирать, зайдите в Windows=>Settings/Preferences=>Preferences...
и включите галочку Popup Menu Selection в категории Selection. Правда, от такой
навязчивости вы вскоре, по-видимому, занервничаете, но все равно попробуйте.
Интересно же себя проверить.
Если вы нажимаете Shift и отмечаете объект, то этот объект выбирается (если он еще не
был выбран) или, наоборот, с уже выбранного объекта выделение будет снято. Shift действует как
переключатель «выбранности». Удобно инвертировать «выбранность» множества объектов, нажав
Интерфейс
41
Shift и обведя их рамкой. Для всех видимых в сцене объектов существует пункт меню Edit=>lnvert
Selection, позволяющий изменить текущее выделение на противоположное.
Маски выбора
Иногда важно иметь возможность интерактивно выделять только объекты определенного
типа и запрещать выбор остальных типов объектов. (Подразумевается, на интуитивном уровне,
что объекты бывают разных типов.) Для этих целей служат маски выбора (Selection Masks, от слова
«маскировать» - скрывать от выбора типы объектов). Маски выбора располагаются в центре Sta-
tusLine в виде синих кнопочек, символически представляющих категории объектов.
Если кнопочка не нажата, объекты данного типа нельзя выбрать мышкой на экране.
Копочки не простые, а составные. Если надавить правую кнопку мыши над любой из них, откроется
меню, где можно включить/выключить дополнительные подкатегории типов объектов, а заодно
выяснить, что скрывается под каждой кнопочкой.
Иногда очень полезно запомнить текущий выбор, то есть список выбранных объектов и
компонент (!), чтобы позже не выбирать их заново, а восстановить из сохраненного списка. Такие
списки выбора называются Quick Selection Sets. Запомнить текущий набор выбранных объектов
можно через Create=>Sets=>Quick Selection Set... Вернуться к нему позже можно при помощи
Edit=>Quick Selection Sets.
Примечание. Существует также система приоритетов выбора. Если вы выбираете
мышкой область на экране, в которой находятся, например, кривая и часть
скелетона, то будет выбран только скелетон, так как у него более высокий
приоритет выбора. Если вы имеете смелость и желание сменить приоритеты,
можете сделать это в Windows=>Settings/Preferences=>Preferences...=>Selection.
Инструменты и операции: Tools и Actions
Идеологический комментарий. Все действия, соответствующие пунктам меню MAYA, можно
разделить на две категории: инструменты (Tools) и операции (Actions).
Совершенно формальный признак следующий: если в названии пункта меню присутствует
слово Tool - это инструмент, если отсутствует - это операция. Неформально рассуждая, для
выполнения операции, как правило, необходимо сначала выбрать один или несколько объектов и
просто применить к ним нужную команду меню. Для использования инструмента обычно ничего
выбирать не нужно, но от пользователя требуются некоторые действия в процессе применения
этого инструмента, причем порой довольно изощренные. Примеры Actions: Duplicate, Loft, Delete
History. Например, Display=>Grid - тоже операция, но не требующая никакого выбора. Иногда для
экономии времени перед использованием инструмента тоже можно выбрать некоторый объект
(например, для Trim Tool), но это лишь экономит один шаг дальнейших пользовательских действий.
Select Tool или CV Curve Tool - примеры инструментов, которые требуют активных пользовательских
действий.
42
Книга Сергея Цыпцына
Для взрослых. Если вы искушены в сплайновом моделировании или искалечены
работой в Power Animator, можете превратить большинство операций сплайнового
моделирования в инструменты. Либо глобально: Windows=>Settings/Preferences=>P
references... = >Modeling=>Everything As Tool. Либо локально: для каждой операции в
Option Box надо выбрать Edit=>As Tool.
Разница между Tools и Actions также заключается в следующем: для Actions подсказку
в HelpLine следует читать до применения операции(там будет написано, что именно следует
предварительно выбрать), тогда как для Tools следует читать HelpLine в процессе применения
инструмента (там будет написано, что нужно делать в данный момент).
Как все собаки попадают на небеса, так же и каждый последний использованный инструмент
(Tool) попадает в последнюю клетку панельки ToolBox, которая называется адекватно: Last Tool
Used. Горячая клавиша для последнего применявшегося инструмента - 'у' (в соответствии с
концепцией qwerty). Последняя использованная команда никуда не попадает, но горячая клавиша
по умолчанию для нее имеется: это 'g\ Хотя вы можете также разыскать список последних
операций в Edit=>Recent Commands.
Для взрослых. Если вы хотите чтобы последняя использованная команда тоже
попадала в Toolbox, надо модифицировать файл toolbox.mel, который находится
в X:\Prosram Files\Alias\MayaN.O\scripts\startup. Для этого, скопируйте его в свой
каталог scripts и добавьте туда следующий код (например, после манипулятора).
toolButton
-doubleClickCommand toolPropertyWindow
-tool SgshowManip
-imagel "showManip.xpm"
showManipTool;
// добавляем здесь
iconTextButton
-imagel "redo.xpm"
recentAction;
string $rbbMenu = 'popupMenu -b 1 MyRCMeniT;
menu -e -pmc ( "HotboxRecentMenu " + SrbbMenu ) -visible 1 MyRCMenu;
He забудьте также добавить клетку в ToolBox, изменив 8 на 9 во второй строке.
SgToolBox = xgridLayout
-numberOfRowsColumns 9 1
-autoGrow false
-width 34
-cellWidthHeight 34 34х;
Модифицированная версия, как пример для изучения, находится на диске.
Кроме того, во время использования какого-либо инструмента, курсор, как правило,
принимает довольно выразительную форму, которая призвана заставить вас подумать, как дальше
поступать, и опустить глаза на HelpLine (если это незнакомый инструмент).
Различие между Tools и Actions состоит еще и в том, что при открытии в меню настроек
OptionBox для инструментов появляется панель Tools Settings вместо обычного окошка OptionBox
для операций.
Настройки инструментов
Интерфейс
43
Возникает резонный вопрос - а как добраться до настроек основных инструментов из Tool-
Box? Можно пойти «легальным» путем, то есть через меню Modify=>Transformation Tools=>Move Tool
и т.д. Но быстрее сделать это двойным щелчком мыши на иконке нужного инструмента прямо в
ToolBox.
Настройки инструмента Select Tool не представляют особого интереса.
В настройках Rotate Tool бывает весьма полезно включить Snap Rotate и установить Step
Size равным 5 или 10, чтобы вращения вокруг осей были кратными 5 или 10 градусам. Опция
Relative позволяет прибавлять Step Size к текущим углам поворота.
Rotate Mode задает вращение объекта либо вокруг локальных осей объекта, либо вокруг
осей мировой системы координат.
Примечание. Опция Component Use Object Pivot в настройках Rotate и Scale Tool
позволяют поворачивать/масштабировать выбранные компоненты относительно
pivot*а объекта. Это бывает очень удобно, так как по умолчанию при выборе
компонент создается временный pivot, совпадающий с геометрическим центром
выделения.
В настройках Move Tool также можно установить дискретный шаг перемещения объектов,
а также выбрать систему координат, в которой происходит движение объектов. По умолчанию,
объекты с помощью Move Tool перемещаются в мировом пространстве (World), то есть вдоль
глобальных осей XYZ. Можно задать перемещения в пространстве объекта (Object), то есть
вдоль локальных осей самого объекта. Опция Local, однако, задает перемещения в пространстве
родительского (parent) объекта, с которым связан выбранный объект. Если у объекта нет parent'a,
родителем для него является мировое пространство (World). Опция Normal действует только для
компонент, позволяя перемещать их параллельно нормали к поверхности.
44
Книга Сергея Цыпцына
№.
Опция Retain Component Spacing позволяет при перемещении компонент сохранять
расстояние между ними, если в этот момент включена одна из привязок (Snap). При выключенной
опции и включенной привязке компоненты стягиваются либо в точку, либо в отрезок прямой.
Подробнее о пространства и системах координат я расскажу в главе про начинку MAYA.
Настройки Scale Tool и Lasso Tool легко осваиваются «методом тыка».
Совет. В процессе работы часто возникает необходимость изменять параметры
используемого инструмента, например, переключаться из мировой системы
координат в локальную или наоборот. Самый быстрый способ сделать это -
вызвать Marking Menu, нажав и удержав w, у или г и щелкнув левой кнопкой мыши
Глюк, который не глюк. Если вы работаете в локальных координатах, не удивляйтесь,
что привязка (snap) к линиям сетки «не работает». Просто переключитесь в мировую систему
координат.
Мягкие модификации
Soft Modification Tool используется в основном при работе с компонентами. На мой взгляд, его
расположение в ToolBox абсолютно незаконно, так как он относится к инструментам деформаций.
Кроме того, он сохраняет историю моделирования и, следовательно, создает новые объекты в
сцене, поэтому если вы случайно выберете его в ToolBox, вам срочно придется жать Undo, так как
на выбранном объекте появится новый деформер, вцепившийся в ваш объект мертвой хваткой.
Для врослых. Если наличие Soft Modification Tool заставляет вас нервничать,
воспользуйтесь методикой модификации ToolBox, изложенной выше, чтобы
удалить эту кнопку. Вы всегда сможете получить доступ к инструменту через
меню Deform=> Soft Modification.
Этот инструмент позволяет перемещать множество выбранных компонент или объектов в
«распределенной манере»: компоненты, находящиеся ближе к центру выделения, перемещаются
более интенсивно, в то время как компоненты с «окраин» выделения получают меньшие
перемещения.
В настройках Soft Modification Tool можно задать кривую распределения перемещений в
зависимости от удаленности от центра выделения (Falloff Curve), а также "область захвата" (Fal-
loff Radius).
Интерфейс
45
Этот инструмент сохраняет историю деформации и поэтому может быть использован
для анимации формы объектов. Soft Modification Tool может также применяться не только к
компонентам, но и к объектам.
Правая часть окна MAYA
По умолчанию настройки инструмента открываются как панель в правой части окна MAYA
и остаются там до тех пор, пока вы принудительно не поместите ChannelBox или Attribute Editor
в эту область окна при помощи маленьких кнопочек, расположенных в правом верхнем углу окна
MAYA.
Кроме того, при этом размер панели перспективы или текущей камеры скачком меняется,
экран перерисовывается в другом масштабе и т.д. Меня, например, это донельзя раздражает,
и я предпочитаю открывать настройки Tool Settings и панель Attribute Editor в отдельном окне.
Это можно сделать с помощью Windows=>Settings/Preferences=>Preferences...=>lnterface, где надо
включить галочки Open Attribute Editor In Separate Window и Open Tool Settings In Separate Window.
Тем более, что при помощи кнопочек в правом верхнем углу вы всегда можете открыть их в виде
панели справа.
46
Книга Сергея Цыпцына
Точка опоры
Каждый объект обладает своим центром вращения (масштабирования), то есть точкой,
вокруг которой он будет поворачиваться (растягиваться) при использовании инструмента Rotate
или Scale. Такая точка называется pivot (или опорной точкой), а ее положение относительно
объекта устанавливается с помощью горячей клавиши Insert. Выберите объект и какой-нибудь
инструмент трансформации (Move, Rotate, Scale), нажмите Insert и при помощи появившегося
манипулятора переместите опорную точку (pivot) в новое место. Да, и не забудьте нажать Insert
снова, чтобы вернуться в исходный инструмент.
Если вы выбрали некоторое количество компонент, то после нажатия Insert вычисляется
временный pivot, совпадающий с геометрическим центром выделения в пространстве, и
дальнейшие вращения будут происходить вокруг него, а при смене выделения pivot переместится
в новую усредненную позицию. Таких перескоков можно избежать, если вы хотите вращать все
последующие выделенные компоненты вокруг одной и той же точки. Для этого служит круглый
голубой манипулятор над точкой pivot. Чтобы закрепить или «прибить» pivot к данной позиции,
достаточно щелкнуть по этому манипулятору. Соответственно, чтобы освободить pivot, надо
щелкнуть еще раз.
Примечание. Формально говоря, центр вращения и центр масштабирования не
обязаны совпадать для одного объекта. Поэтому в Attribute Editor можно задать
точные значения для координат обоих pivot-центров. На практике порой проще
сгруппировать объект сам с собой и получить таким образом новый pivot.
Для взрослых.
Во-первых, пивот - это не принадлежность объекта, а три атрибута
трансформ-ноды. Из этого становится понятно, почему, группируя объект сам с
собой, мы получаем еще один пивот - потому что добавляем еще одну трансформ-
ноду со своим пивотом. Но тут не все так просто, поскольку трансформ-ноды,
появляющиеся после группировки объекта самого с собой, образуют иерархическую
цепочку «родитель»-«потомок» и, следовательно, трансформации, примененые к
разным трансформ-нодам в этой иерархии в разном порядке, будут приводить к
разным результатам. В качестве примера достаточно взять кубик, сгруппировать
его сам с собой и после этого проделать простой эксперимент. Повращаем кубик и
помасштабируем группу. Потом помасштабируем кубик и повращаем группу. Ну,
и как вам результат? Вообще говоря, группировка объекта с самим с собой - это
один из базовых принципов иерархической анимации, и об этом еще немало будет
сказано.
Во-вторых, можно сказать, что каждая трансформ нода обладает, формально
говоря, двумя опорными точками - одна по вращению, вторая по масштабированию.
Просто по умолчанию они «склеены» друг с другом, но формально их все-таки две.
Редактировать их можно не только с помощью клавиши Insert, но и перейдя в
компонентный режим (F8) и выбрав нужную маску (Pivots, кружочек с точкой). Как
раз в компонентном режиме пивоты легко отделить друг от друга (о компонентах
будет говориться ниже...)
Ну и последнее. Раз у пивотов есть координаты (то бишь у трансформ-ноды
Интерфейс
47
есть соответствующие атрибуты пивотов) и их можно изменять, задавая
численные значения, а значит пивоты могут быть проанимированы. Например,
можно покатать кубик. Часто переменный пивот используют при настройке
стопы и т.д.
Компоненты и объекты
Похоже, уже пора поговорить про компоненты, тем более, что обилие методов выбора
компонент иногда сбивает с толку начинающих пользователей. Начнем с контекстного меню. Для
тренировки можно открыть файл ObjectTypes.mb, в котором представлены разные типы (далеко
не все) объектов в MAYA.
Если нажать правую кнопку мыши над любым объектом, появится контекстное меню,
соответствующее типу объекта. Соответственно, для разных типов объектов появляются разные
меню. Такие звездообразные меню называются Marking Menu и о них пойдет речь ниже.
48
Книга Сергея Цыпцына
Примечание, Контекстное меню соответствует объекту, находящемуся
непосредственно под курсором мыши, даже если выбран другой объект. Однако,
если под курсором нет объектов, то меню соответствует выбранному объекту.
Это невыносимо полезно в густонаселенных сценах.
В центральной части контекстного меню расположены по кругу основные компоненты
объекта. «Основные» - это, как правило, предназначенные для редактирования формы объекта.
Выбрав какой-нибудь тип (например, Vertex для полигонов или Isoparm для сплайнов), вы можете
переходите в режим индивидуального редактирования компонент, в котором можно выбирать их
обычными методами и применять к ним стандартные инструменты трансформаций (некоторые
компоненты - типа Surface Point или Isoparm - предназначены только для выбора и не допускают
перемещений или масштабирования). Чтобы вернуться обратно к ситуации, когда выбран
весь объект целиком, проще всего выполнить в контекстном меню пункт Select. Можно также
попробовать пункт Object Mode, но выделение объекта будет при этом потеряно. Также можно
воспользоваться советом из многих книжек и произвести магический ритуал - нажать два раза
кнопку F8. Если с пунктом Select все понятно, то про магию F8 и Object Mode стоит поговорить
подробнее.
F8F8
Если вы позовете контекстное меню над объектами типа камеры или источника света, то не
увидите никаких компонент вообще. Это не означает, что они отсутствуют у выбранных объектов.
Дело в том, что pivot или локальные оси вращения (и многое другое) тоже являются компонентами
и имеются у всех видимых на экране объектов (DAG-objects). Но все имеющиеся у объекта
типы компонент просто не поместятся в контекстное меню, поэтому для их выбора существует
специальный режим «общего» выбора компонент (в противоположность «индивидуальному»
контекстному режиму для правой кнопки мыши). Этот компонентный режим вызывается клавишей
F8 или нажатием кнопочки Select By Component Туре на Status Line в верхней части окна MAYA.
В этом режиме вы вольны выбирать любой тип компонент, с которым вы хотите работать.
Для этого можно воспользоваться уже известными Selection Masks, которые в компонентном
режиме выглядят следующим образом:
Интерфейс
49
По умолчанию включен только выбор компонент типа точек или вершин, поэтому для
объектов не имеющих, например, контрольных вершин, вы ничего сначала выбрать не сможете.
Не забывайте про правую кнопку над Selection Masks, и вы сможете увидитеть pivot как компонент
объекта и многое другое.
Вернуться в режим выбора объектов можно, повторно нажав F8 или кликнув в Status Line
на кнопочку Select By Object Туре, которая дополнительно служит индикатором и подсказывает, в
каком режиме вы работаете: объектном или компонентном. Тот же результат вы получите, выбрав
Object Mode в контекстном меню.
И последнее. Когда вы используете правую кнопку мыши и контекстное меню и выбираете
в нем компоненты, с которыми хотите работать, то вы все равно остаетесь в режиме выбора
объектов (судя по Status Line), поэтому можете индивидуально выбирать компоненты только
одного объекта. Отсюда и магия F8F8: вы лишь заходите в компонентный режим и тут же из него
выходите обратно, в объектный режим.
Примечание. Передвижения камеры, осуществляемые при помощи Alt и суетливых
движений мышью, тоже соответствуют конкретным инструментам со своими
настройками. Можете найти их в меню View=>Camera Tools. Там же находятся
альтернативные и весьма интересные инструменты управления камерой.
Привязки И ОТВЯЗКИ
Существует возможность привязать (Snap) курсор мыши или манипулятор инструмента,
например, к сетке. Судя по иконке на Status Line, лучше даже сказать «примагнитить». Такое
«примагничивание» осуществляется нажатием соответствующих кнопочек на Status Line.
При выбранной привязке манипулятор любого инструмента (будь то Move Tool, CV Curve
Tool или редактирование pivot) будет цепляться (прилипать) либо к точкам сетки (Snap to Grid),
либо к кривым на экране (Snap to Curves), либо к компонентам-точкам (Snap to Points).
Индикатором того, что включена какая-нибудь привязка, может служить окружность (вместо
квадратика) в центре манипулятора Move Tool.
Привязки удобнее включать временно, при помощи нажатия и удерживания горячих
клавиш х, с, v соответственно. В данном случае горячие клавиши действуют аналогично Shift, то
50
Книга Сергея Цыпцына
№
есть только в нажатом состоянии. При отпускании привязки выключаются, в чем можно убедиться,
глядя на Status Line.
При работе с перемещениями и привязкой к кривым необходимо сначала подтащить
объект (или манипулятор) к кривой, отпустить его, а затем потащить снова, тогда произойдет
«приснапливание». Либо сразу щелкнуть по кривой средней кнопкой мыши. Радиус чувствительности
естественно регулируется. (Windows=>Settings/Preferences=>Preferences...=>Snapping)
Существует еще один тип привязки - к поверхности объекта. Для этого надо выделить
нужную поверхность и нажать самый большой магнит в Status Line (ему соответствует пункт
меню Modify=>Make Live). После этого поверхность окрашивается в темно-зеленый цвет и служит
магнитом для инструментов перемещения или построения кривых. Не забудьте повторно нажать
на магнит, чтобы выключить привязку к объекту.
Про команду MakeLive еще пойдет речь в главе про сплайновое моделирование.
Дублирование и размножение
Хотя привычные пользователям MS WORD сочетания Ctrl-C и Ctrl-V на первый взгляд
нормально работают с выделенными объектами, ими удобно пользоваться скорее при обмене
данными между сценами, нежели для копирования объектов. Дело в том, что при операциях
Edit---'-'-'-'---'-'=>Copy и Edit=>Paste происходит экспорт, а затем импорт сцены с выбранными
объектами, что приводит к созданию новых групп и странному именованию объектов.
Для копирования объектов используется команда Edit=>Duplicate. Она позволяет не только
копировать выбранные объекты в нужном количестве, но и производить в процессе размножения
различные трансформации новых объектов. Потренируйтесь:
Создайте квадрат: Create=>Nurbs Primitives=>Square.
Не забудьте нажать f, выделите любые три стороны и удалите их.
Выделите оставшийся отрезок и откройте Option Box команды Edit=>Duplicate°.
Введите 0.1 во вторую клетку строки Translate и 30 во вторую клетку строки Rotate, задайте
Number of Copy = 50. Это означает, что в процессе копирования каждая новая копия объекта будет
сдвигаться по вертикали (вторая клетка - это ось Y) на 0.1 и поворачиваться на 30 градусов вокруг
оси Y относительно предыдущей копии.
Интерфейс
51
Нажмите кнопку Duplicate и не забудьте отъехать (клавиша f).
Перейдите в режим Modeling (F3). Выполните Surface=>Loft. У вас готова спираль ДНК.
Чтобы получить обычную спираль в виде кривой, нажмите правую кнопку мыши где-нибудь
над поверхностью и выберите в контекстном меню Isoparm. Затем выделите край поверхности (то
есть крайнюю изопарму).
Выполните EditCurves=>Duplicate Surface Curves. Сдвиньте немного получившуюся кривую.
Теперь у вас есть примитив «спираль», которого нет в меню Create.
52
Книга Сергея Цыпцына
Поэкспериментируйте. Вернитесь обратно к одному отрезку. Попробуйте вбить
дополнительно 0.95 в первую и третью клетки строки Scale в параметрах Duplicate. Если запутались
в параметрах, в Option Box всегда есть пункт Edit=>Reset Settings.
Channel Box или коробка передач
Правую часть окна MAYA контролируют три конкурирующие группировки: Channel Box,
Attribute Editor и Tool Settings. Их появление (или пропадание) там задается кнопочками в верхнем
правом углу окна MAYA.
Работу с Tool Settings мы уже разобрали. Посмотрим, для чего нужен Channel Box.
По умолчанию панель Channel Box состоит их двух частей: собственно Channel Box и Layer Editor.
Их взаимное расположение тоже контролируется кнопочками в верхней части в этой панели.
Если вы не работаете со слоями в данный момент, то для удобства можно выключить Layer
Editor, чтобы максимально использовать рабочее пространство Channel Box.
Как только вы выбираете какой-нибудь объект, в Channel Box появляются цифры в клетках.
Пристально вглядевшись, можно выяснить, что клетки Translate, Rotate и Scale отражают ваши
безумные действия с инструментами Move, Rotate и Scale Tool. Справедливо и обратное: если
вводите числовые значения в эти клетки, то выбранный объект (или объекты) реагируют на это
соответствующим образом. Названия клеток в Channel Box соответствуют названиям атрибутов
объекта.
Одна из основных концепций MAYA состоит в том, что каждый объект имеет некоторое
количество (весьма немалое) атрибутов, полностью описывающих не только его положение, но и
внешний вид, положение pivot'a, видимость и массу других свойств объекта. Об этом мы подробнее
поговорим в следующей главе, а пока ограничимся лапидарной сентенцией: «чтобы что-то сделать
с объектом, надо изменить его соответствующие атрибуты». Поэтому, когда вы крутите кольца
манипулятора Rotate Tool, то реально изменяются только атрибуты rotate выбранного объекта.
Слово каналы (channels), встречающееся при работе с Channel Box, можно рассматривать как
синоним для «атрибутов, предназначенных для анимации или для связи с другими атрибутами».
Если такое определение вызывает у вас горячий протест или непонимание, не делайте разницы
между атрибутами и каналами. Это одно и тоже...
Атрибуты в Channel Box можно выделять (используйте Ctrl для несоседних атрибутов).
После это становится доступным основное меню Channel Box, выпадающее по правой кнопке
мыши. (Это же меню скрывается под надписью «Channels» в верхней строке Channel Box'а.)
Интерфейс
53
Основные пункты этого меню используются главным образом для анимации. При помощи
пунктов Lock/Unlock Selected можно заблокировать изменение атрибута пользователем, и как
следствие, сделать невозможным, например, его перемещение или вращение. (Слово Selected
относится здесь к выбранному атрибуту, а не объекту).
Примечание. Если вы блокируете уже проанимированный атрибут, то анимация
никуда не денется и не заблокируется.
В Channel Box видны, естественно, не все атрибуты выбранного объекта, а только их
«хитпарад», в зависимости от частоты использования.
Примечание. Этот «хит-парад» носит название Keyable-атрибутов, и прямой
перевод этого термина способен запутать кого угодно. Следует четко себе
представлять, что keyable и, соответсвенно, non-keyable означает лишь
отображаемость или не отображаемость этого атрибута в Channel Box, но
никак не возможность (или, соответсвенно, невозможность) анимирования этого
атрибута. Вы можете сделать все атрибуты поп keyable, однако не потеряете
возможности двигать, поворачивать или масштабировать объект и ставить на
него ключи. Просто делать это вы будете не в Channel Box .
Если вы хотите добавить в Channel Box дополнительные атрибуты (например, координаты
точки pivot), можете воспользоваться окном Windows=>General Editors=>Channel Control... До него
можно также добраться через меню Channel Box.
54
Книга Сергея Цыпцына
В правой части окна находится список неотображаемых в Channel Box атрибутов.
Выберите атрибуты rotatePivotX, rotatePivotY, rotatePivotZ и нажмите кнопку <<Move.
Теперь вы можете редактировать координаты pivot'a непосредственно в Channel Box.
Для взрослых. Если вы хотите узнать полное число атрибутов выбранного
объекта, выполните команду size(' UstAttr).
Если выбрано несколько объектов, в Channel Box будут отображены только атрибуты
последнего выбранного объекта. Однако введенные числовые значения изменяют атрибуты всех
выбранных объектов. Таким образом, если ввести число 5 для атрибута translateY, все выбранные
объекты займут одинаковое положение по вертикали, вне зависимости от того, где они находились
до этого. Чтобы задать «относительное» изменение значения атрибута, можно ввести в нужную
ячейку +=5. Тогда соответствующий атрибут всех выбранных объектов просто увеличится на 5.
Комбинации «-=», «*=» и «/=» также работают в ячейках Channel Box и Graph Editor.
Совет. С помощью меню Object в верхней строке Channel Box можно изменить
пресловутый «последний выбранный объект», то есть поменять порядок выбора
объектов.
Атрибуты объекта в Channel Box разбиты на разделы с фиксированными названиями: shapes,
inputs и outputs. Забегая вперед, скажу, что в Channel Box отображаются не только атрибуты
выбранного объекта, но и всех объектов, связанных с ним исторически, то есть с помощью History.
Кроме того, как будет рассказано далее, сам объект представляет из себя некоторое количество
подобъектов, у каждого из которых имеются свои уникальные атрибуты.
Манипуляторы и невидимые слайдеры
При помощи манипуляторов для основных инструментов Move, Rotate и Scale можно плавно
менять значения соответствующих атрибутов. Часто бывает удобно использовать среднюю кнопку
мыши, с помощью которой можно перемещать объект вдоль выбранной (желтой) оси манипулятора,
при этом среднюю кнопку можно нажимать в любом месте окна камеры, а не над манипулятром. Это
удобно, когда манипулятор либо находится за границами окна, либо сливается с геометрией. Как
же тогда выделить нужную ось, если манипулятор невидим? Если выбрать какой-нибудь атрибут
в Channel Box, например rotateX, то по умолчанию активным тут же становится инструмент Rotate
Tool и кольцо оси X подсвечивается желтым. Далее можно вращать объект средней кнопкой мыши
вокруг этой оси, даже не тядя на манипулятор. Оказывается, этот принцип распространяется
не только на трансформационные атрибуты, но и на все остальные атрибуты, видимые в
Channel Box. Если выделить любой числовой атрибут в Channel Box и нажать среднюю кнопку мыши в
окне камеры, то курсор примет форму стрелок прокрутки и вы сможете плавно изменять значение
выделенного атрибута.
Интерфейс
55
Если вы хотите запретить использование таких невидимых слайдеров или если вас
раздражает смена инструмента при выделении атрибута, можете отключить такое поведение,
нажав первую кнопочку в правой верхней части Channel Box.
Нажав ее еще раз, можно отрегулировать скорость реакции невидимых слайдеров на
перемещения мыши при помощи второй и третьей соседних кнопочек.
Для атрибутов некоторых объектов предусмотрены индивидуальные манипуляторы,
облегчающие интерактивную настройку атрибутов.
Создайте источник света Create=>Lights=>Spot Light и нажмите предпоследнюю кнопку bTooI-
Вох, которая называется Show Manipulator Tool. Не забудьте нажимать маленький переключатель,
и вы увидите различные манипуляторы, помогающие визуально настраивать различные атрибуты
источника света. Посмотрите, за какие атрибуты отвечает тот или иной манипулятор.
Такие манипуляторы есть не у всех типов объектов, обычно это объекты Construction
History, источники света и частиц, камеры, деформеры и др.
56
Книга Сергея Цыпцына
Фиксация и сброс: Freeze и Reset
Для того, чтобы быстро вернуть трансформационные атрибуты в их значения по умолчанию
(О - для Translate и Rotate, 1 - для Scale) существует пункт меню Modify=>Reset Transformations.
При этом MAYA возвращает объект в «нулевую позицию». Иногда требуется сделать так, чтобы
после многочисленного редактирования (например, кривой) текущее положение и размер объекта
стали «нулевой позицией». Другими словами, нужно сбросить атрибуты в ноль, но так, чтобы
объект остался на месте. Это операция называется фиксированием (freeze) и находится она в
Modify=>Freeze Transformations. Естественно, в Option Box этих операций можно выбрать лишь
нужные атрибуты. Кроме того, операция Freeze Transformations изменяет расположение локальных
осей объекта, располагая их параллельно мировым осям. Об этом читайте подробнее в главе про
изнанку AAAYA.
Совет. Быстро определить расположение локальных осей объекта можно, просто
включив инструмент Scale, манипулятор которого направлен, как правило, по
этим осям.
Слои
В нижней части Channel Box располагается редактор слоев (Layer Editor). Его идея состоит
в разбиении объектов сцены на слои с точки зрения видимости, для быстрого включения/
выключения наборов объектов на экране. Работа со слоями интуитивно понятна, при этом буква
V соответствует видимости слоя (аналог глаза в Photoshop'e), а буквы Т и R превращают объекты
слоя в Template или Reference, о которых речь пойдет ниже.
Через Option Box пункта меню Create Layer можно сделать так, чтобы при создании нового
слоя все выбранные объекты помещались в новый слой. Впрочем, их можно перенести в любой
слой позже, использовав меню Layers или правую кнопку мыши над именем слоя.
Двойной щелчок на имени слоя позволит не только переименовать его, но и задать цвет
сетки объектов, входящих в слой. Удобно также использовать слои для быстрого выбора всех
объектов, входящих в слой: Layers=>Select Object in Selectes Layer(s).
Совет. Включите Shading=>Shade Options=> Wireframe on Shaded в меню панели
камеры, чтобы видеть цвета слоев в закрашенном режиме.
Attribute Editor
Если в Channel Box представлены лишь наиболее популярные атрибуты объекта, то в
Attribute Editor (Windows=>Attribute Editor, горячая клавиша Ctrl-a) представлено полное «досье»
объекта.
Интерфейс
57
В Attribute Editor можно отредактировать практически все атрибуты объекта: от положения
pivot'a до цвета или прозрачности материала. На первый взгляд, атрибуты разбиты на группы,
располагающиеся в разных закладках, которые объединяют атрибуты, так сказать, одного свойства.
Реально же в Attribute Editor отображаются не только закладки, представляющие данный объект,
но и все объекты, имеющие связь с выбранным объектом. О том, что любой объект представляет
из себя набор элементов (нод) и что эти элементы (представленные закладками в Attribute Editor)
могут зависеть друг от друга посредством связей между атрибутами, мы поговорим в следующей
главе.
По умолчанию, в Attribute Editor автоматически появляются атрибуты выбранного (точнее,
последнего выбранного) объекта. Можно изменить такое поведение (List=>Auto Load Selected
Attributes) и загружать атрибуты в Attribute Editor вручную (кнопка Load Attributes).
В отличие от Channel Box, изменение атрибутов в Attribute Editor влияет только на
последний выбранный объект, поэтому если вы хотите одновременно изменять атрибуты, не
представленные в Channel Box, сразу для нескольких объектов, воспользуйтесь Windows=>General
Editors=>Attribute Spreadsheet...
Невидимые слайдеры в Attribute Editor устроены следующим образом: в ячейке с числовым
значением достаточно нажать Ctrl и любую кнопку мыши, после чего движения мыши вправо-влево
будут плавно изменять значение атрибута, а скорость прокрутки определяется нажатой кнопкой
мыши (левая - медленно, правая - быстро).
Напомню: появление Attribute Editor в отдельном окне, а не в правой части окна, задается
последовательностью Windows=>Settings/Preferences=>Preferences...=>lnterface=>Open Attribute
Editor In Separate Window.
58
Книга Сергея Цыпцына
Невидимые объекты. Игра в прятки
По правилам игры, требуется найти как можно больше способов скрыть объект на экране.
Приведу несколько таких способов спрятать выбранный объект в АЛАУА.
1. Нажать Ctrl-h.
2. Меню Display=>Hide=>Hide Selection.
3. В Channel Box установить off для атрибута visibility.
4. В Attribute Editor в первой закладке в разделе Object Display выключить галочку Visibility.
5. В командной строке напечатать hide и нажать Ctrl-Enter.
И это еще не все способы... Не пугайтесь, все эти действия делают одно и тоже - прячут
выбранный объект. А если говорить формально, они устанавливают на ноль значение атрибута
visibility, определяющего видимость объекта на экране. Повторюсь: не надо запоминать все способы
сделать конкретное действие, выберите тот, который вам больше по вкусу.
Чтобы показать спрятанный объект, надо прежде всего его выбрать, а потом сделать одно
из таких действий:
1. Нажать горячую клавишу (Shift-h).
2. Меню Display=>Show=>Show Selection.
3. В Channel Box установить on для атрибута visibility.
4. В Attribute Editor в первой закладке в разделе Object Display включить галочку Visibility.
5. В командной строке напечатать showHidden и нажать Ctrl-Enter.
Но как же выбрать объект, скажете вы, если он спрятан?!
А для этого и нужен список всех объектов в сцене.
Outliner и Hypergraph
Два основных окна (Windows=>Outliner и Windows=>Hypergraph) позволяют выбирать все
объекты в текущей сцене и работать с ними. В Outliner объекты представлены в виде списка, в
Hypergraph - в виде графов или иерархических деревьев. Среди пользователей АЛАУА существует две
конкурирующие группировки: одна исповедует применение Outliner'a, а другая - Hypergraph'a. Я
принадлежу к первой, a Hypergraph использую только для внутренних расследований и определения
связей между объектами и атрибутами. Но если у вас очень большой монитор (или даже два) и,
как следствие, много рабочего пространства на экране, вы можете а приори примкнуть ко второй
группировке, с возмущением пропустив оставшуюся часть этой главы.
Объекты в Outliner выбирают аналогично атрибутам в Channel Box или файлам в Windows
Explorer: с помощью Ctrl и Shift.
Первые четыре объекта - неудаляемые камеры, которые есть в любой сцене.
Для взрослых. Вы можете спрятать два последних навязчивых объекта в Outliner
(defaultLightSet, defaultObjectSet) при помощи команды:
setNodeTypeFlag -dsp 0 'objectType -tt defaultObjectSetх;
А навсегда убрать их оттуда можно командой:
optionVar -iva "minorNodeTypes" 'objectType -tt defaultObjectSet';
В меню Outliner можно задать отображение ошеломляющего списка всех атрибутов объекта:
Display=>Atributes(Channels).
Можно также выключить опцию Display=>DAG Objects Only и увидеть список всех объектов,
составляющих сцену (тут детям до шестнадцати просмотр воспрещен). Об этих объектах поговорим
позже.
Интерфейс
59
Десять способов переименовать объект
Продолжим играть в национальные игры народов MAYA.
Чтобы переименовать объект, надо прежде всего его выбрать, а потом сделать что-либо из
следующего:
Два раза щелкнуть по имени объекта в Outliner.
В Hypergraph: нажать Ctrl и два раза щелкнуть по имени объекта.
В Hypergraph: в контекстном меню на правой кнопке мыши над объектом.
В Hypergraph: войти в меню Edit.
В Channel Box: просто щелкнуть по имени объекта.
В Attribute Editor: изменить имя объекта в первой закладке, в первом же текстовом поле.
В командной строке напечатать rename NewName и нажать Enter.
Два раза щелкнуть по имени объекта в Graph Editor
В правой части Status Line есть поле для быстрого выбора объектов или ввода значений. В
Этот способ, кстати, позволяет переименовать целый набор выделенных объектов, присваивая им
имена с увеличивающимся номером в конце имени.
10. Десятый способ найдите сами, ибо, как известно, существует десять способов
переименовать объект в MAYA.
Меню Display.
Нет смысла разбирать каждый пункт этого меню, поэтому разберем
его основную логику.
Первые три пункта включают/выключают показ сетки, статистики и
элементов интерфейса, то есть не зависят от выбранных объектов.
Пункты Hide/Show позволяют прятать или показывать объекты по
типам или в зависимости от выбора.
Остальные пункты в основном переключают видимость компонент
у объектов разных типов, так что компоненты объектов присутствуют
на экране всегда, а не только в режиме выбора или редактирования
компонент.
Названия последних пунктов меню говорят сами за себя и управляют
параметрами отображения конкретных типов объектов.
60
Книга Сергея Цыпцына
Шаблоны
Пункт Display=>Object Display =>Template позволяет «не до конца» спрятать объект (или
объекты). При этом объект окрашивается в серый цвет, его нельзя выбрать (без дополнительных
усилий), и привязки к нему не работают, то есть он служит исключительно для контроля взаимного
расположения с другими объектами. Если выбран только один объект, то аналогичного результата
можно достичь в Attribute Editor в разделе Object Display, включив/выключив галочку Template.
Или с помощью контекстного меню на правой кнопке мыши над объектом, где можно выбрать
Actions=>Template.
Совет. Используйте пункт Select контекстного меню для быстрого выбора
Template-объекта.
Примечание. Превратить в Template можно все объекты в любом слое через
соответствующую опцию в Layer Editor. Опция Reference похожа на Template, с
той разницей, что объекты в слое Reference закрашиваются в режиме Shaded и к
ним можно осуществлять различные привязки (snapping) - плюс они появляются на
финальном рендеринге.
Группировка и парентинг.
Если выбрать несколько объектов (для упрощения тренировки выберите два) и выполнить
операцию Edit=>Parent, то перемещение последнего выбранного объекта, влечет за собой
перемещение всех остальных. Этот объект становится «родителем» (parent), и подчиняет себе
перемещения остальных объектов, которые являются его «потомками», «детьми» (child). Это не
запрещает потомкам иметь собственные перемещения, но перемещение родительского объекта
всегда вызывает перемещения всех подчиненных объектов.
Отличие операции группировки (Edit=>Group) от операции parent состоит в том, что в
процессе группировки создается новый пустой объект (группа), который становится родителем
(parent) всех выбранных объектов. Выбрав группу, можно перемещать объекты как единое целое.
Так как группа представляет собой просто пустой объект, то выбрать ее на экране можно только в
окне Outliner или Hypergraph, либо переключившись в режим выбора иерархий на StatusLine.
Сгруппировав объекты, вы не превращаете их в один большой объект, как думают
некоторые начинающие пользователи. Все объекты остаются независимыми друг от друга и могут
иметь собственные перемещения. Группа служит лишь для перемещения целой иерархии объектов
и никак не влияет на форму объектов.
Глюк, который не глюк. Создадим десять полигональных кубиков. Сгруппируем их и
сожмем группу (именно группу!) по вертикали этак раз в десять. Получим 10 плоских плиток
или, по-научному, прямоугольных параллелепипедов. А теперь выберем какой нибудь из этих
параллелепипедов и попробуем поставить его «на попа», развернув на 90 градусов вокруг одной
из горизонтальных осей... Результат обескураживающий, не правда ли? А если перед вращением
«плитки» выполнить для группы операцию freeze transformation?..
Подробнее, я расскажу о концепции parent-child в следующей главе про изнанку MAYA, где
вопросам группировки посвящен значительный кусок материала. Настоятельно советую вникнуть
в эту концепцию, так как практически вся анимация в MAYA построена на принципе иерархической
организации объектов и возможности независимо анимировать объекты на каждом уровне
иерархии.
Временная шкала (timeline)
Про TimeLine и Range Slider поговорим в главе, посвященной анимации. Если вам уже
сейчас не терпится увеличить диапазон проигрываемой анимации, введите нужное число в третью
клетку слева на Range Slider.
Интерфейс
61
Промежуточный итог
До сих пор мы говорили об «информационных» элементах интерфейса MAYA: это панели,
окна, меню. Подвести итог можно следующими выводами:
1. Одевать и раздевать MAYA можно до любой степени приличия, вплоть до Hide Ul Elements.
2. Основные настройки внешнего вида MAYA находятся в Windows=>Settings/Preferences=>Pre
ferences...=> Interface.
3. Если вы хотите подрегулировать также поведение MAYA (длину очереди Undo, рендер по
умолчанию, приоритеты выбора) также ищите все это в категориях Windows=>Settings/Preferen
ces=>Preferences... Настройки неплохо разбиты на разделы, и даже если вы забыли и просто не
знаете, где расположена нужная опция, вы быстро ее найдете.
4. Не забывайте про меню Display, которое дополняет соответствующую категорию в
Preferences... и работает, как правило, с выбранными объектами.
5. Внешний вид объектов и режимы отображения их на экране можно отрегулировать через
меню, находящиеся в панелях камер.
Ускорение и оптимизация работы в MAYA.
Посмотрим теперь, как можно ускорять работы при помощи «активных» элементов - таких
как горячие клавиши (HotKeys), полки (Shelves) и Marking Menu. Это, кстати, весьма азартное
занятие, и так как предела совершенству нет, оно может превратиться в навязчивую идею. Так
что не увлекайтесь.
Горячие клавиши
С моей точки зрения, у системы горячих клавиш MAYA есть три больших преимущества.
1. Они полностью переопределяемы.
2. Клавиатурная комбинация может быть назначена не только в соответствие любому пункту
меню, но и в соответствие любой последовательности действий, производимой пользователем
или самой MAYA.
3. Горячие клавиши могут быть назначены не только на нажатие, но и на отпускание, что
позволяет использовать их как временные модификаторы действий пользователя, например, это
привязки (snapping).
Назначать горячие клавиши можно через меню Windows=>Settings/Preferences=>Hotkeys.
62
Книга Сергея Цыпцына
Список Categories окна Hotkey Editor представляет собой просто основное меню AAAYA,
расположенное вертикально и дополненное служебными категориями. Таким образом, чтобы
назначить горячую клавишу на любой пункт меню, достаточно разыскать его в соответствующей
категории , ввести в ячейку Key нужное сочетание и нажать кнопку Assign. Если сочетание
уже используется, MAYA предупредит вас об этом, но позволит перезаписать существующее
назначение.
Переключатель Direction позволяет назначить различные действия как на нажатие
клавиши, так и на ее отпускание. Например, если вы назначите Display=>Toggle Face Normals на
нажатие Alt-n (Direction=Press), а потом еще раз назначите это же действие на отпускание Alt-
n (Direction=Release), то для выбранных объектов вы сможете временно показывать нормали,
нажимая и удерживая Alt-n.
Не все действия описываются пунктами меню, поэтому если вы хотите назначить горячие
клавиши на последовательность команд, лучше это сделать в категории User (но можно и любой
другой), где надо нажать кнопку New, затем ввести имя последовательности команд в поле Name
и сами команды на языке MEL в поле Command. Нажав Accept, вы получите пункт в категории User,
на который можно назначать горячие клавиши обычным путем.
Совет. Если не нажимать кнопку Save в Hotkey Editor, а сразу нажать Close, то
новые горячие клавиши будут временными, то есть будут работать, пока вы не
выйдете из MAYA.
Совет. Горячие клавиши удобно назначать не только для пунктов меню, но и для
нужных Option Box. Использование модификатора Alt позволяет легче запоминать
такие горячие клавиши. Например, по умолчанию Ctrl-d назначена на Edit= >Duplicate,
поэтому разумно назначить Crtl-Alt-d на Edit=>Duplicate Option Box и т.д.
Совет. Не стоит переназначать комбинацию горячих клавиш Ctrl-Alt-Del... Просто
не стоит.
Совет. Замечено, что MAYA работает гораздо стабильнее, реже падает, рендерит
быстрее, если назначить клавишу "о" на вызов окна Out И пег. Помимо всего
вышеперечисленного, это еще и невероятно удобно.
Полки (Shelves)
Другим видом «ускорителей» работы в MAYA являются полки. По аналогии с горячими
клавишами, их можно было бы назвать «горячими щелчками мыши», так как они также позволяют
быстро вызвать любую команду меню или произвольную последовательность действий.
Примечание. От майских полок, кстати, и пошла известная в среде майщиков
фраза: «Молодец! Возьми с полки пирожок...»
Преимущество полок состоит в их наглядности и возможности быстрого доступа в любой
момент к необходимым инструментам: всего за один-два щелчка мышью.
General | Curves Surfaces j Polygons | Subdivs j Defamation] Animation j Dynamics] Rendering) PaintEffects j Cloth j Fluids j Fur j Custom j 9
IE 3i H A
j Channels Object
В отличие от горячих клавиш, которые назначают «всерьез и надолго», полки создают
зачастую только для работы с конкретной сценой или для определенного этапа производства.
Интерфейс
63
Ly.IJ.Ji
Кроме того, поместив на полку определенную последовательность действий, можно переслать
ее на другой компьютер, обмениваясь таким образом инструкциями или руководствами при
выполнении коллективных задач. Таким образом, у полок следующие преимущества:
1. Быстрый доступ к операциям, всего в один-два щелчка мышью.
2. Возможность быстро создавать и удалять необходимые кнопки и полки, организуя
временные наборы инструментов.
3. Гибкость и прозрачность в настройке внешнего вида и расположения полок.
4. Наглядность и дружественность, особенно к людям с короткой памятью (а иконки просто
незаменимы для неграмотных пользователей).
5. Всплывающие подсказки и подписи, помогающие детям осваивать MAYA уже с трех лет.
6. Возможность переносить полки с компьютера на компьютер или обмениваться ими между
пользователями.
Рассмотрим основные приемы работы с полками.
Чтобы «положить» любой пункт меню на полку, необходимо нажать магическое сочетание
клавиш (Ctrl-Shift для Windows, Ctrl-Shift-Alt для Linux, Option Key+RMB для MacOSX), а затем
щелкнуть по нужному пункту меню, как будто вы собираетесь его выполнить. Вместо выполнения
пункт меню «сваливается» на текущую полку, где вы можете его выбрать в любой момент.
Экспериментировать лучше с полкой под именем Custom, либо создать новую полку. Для этого
нужно показать «полковОе» меню, нажав на черный треугольник слева от полок, и в нем выбрать
New Shelf.
Примечание. Ортодоксальные моделлеры быстро увидят в «полкиных ушах»
(закладках-подписях) реальную угрозы своему рабочему пространству. «Уши»
можно убрать, отключив в полковом меню опцию Shelf Tabs, а между полками
переключаться можно с помощью одного «уха», находящегося слева от полок.
На полки также удобно складывать не только пункты меню, но и их соответствующие
Option Box (аналогичным способом, при помощи магических клавиш). В случае же использования
инструментов (Tools) и соответствующих им Tool Settings, можно создавать на полках разные копии
одного и того же инструмента, но с различными установками. Для этого используется панелька
Toolbox и средняя кнопка мыши.
Например, чтобы создать на полке две копии CV Curve Tool, рисующие гладкие кривые
(третьей степени) и ломаные кривые (первой степени), надо выбрать Create=>CV CurveTool=>Option
Box, в появившемся окне Tool Settings задать нужную степень кривой, нажать кнопку Close, а
затем, даже ничего не рисуя, Enter.
В панельке Toolbox появится иконка CV Curve Tool в ячейке последнего использованного
инструмента, которую нужно оттащить средней кнопкой мыши на полку. Далее можно проделать
эту процедуру еще раз, но задать другую степень кривой и снова воспользоваться средней
кнопкой мыши. Дело в том, что инструменты запоминают свои установки при попадании в Toolbox
и переносят их на полки со всеми соответствующими параметрами.
Чтобы удалить кнопку с полки, нужно перетащить ее средней кнопкой мыши в маленькую
корзину в правом верхнем углу панели с полками. Средней кнопкой мыши можно также менять
порядок расположения кнопок на полке, перетаскивая и бросая кнопки как внутри одной полки,
так и на другие полки.
Но добраться до содержимого полок и произвести революцию в их внешнем виде и
64
Книга Сергея Цыпцына
внутреннем содержании можно, вызвав Shelf Editor в вышеупомянутом меню.
В Shelf Editor можно выстраивать полки в нужном порядке, изменять подписи и иконки
на кнопках, редактировать содержимое каждой кнопки (код на языке MEL). Все это делается в
интуитивно понятном интерфейсе, однако тут необходимо сделать несколько замечаний.
В меню Option можно выбрать стиль отображения кнопок и подписей к ним.
В поле Label & Tooltips (в закладке Shelf Content) находится имя кнопки или комментарий,
который появляется во всплывающей подсказке при наведении курсора мыши на кнопку. Включить/
выключить всплывание подсказок можно в основном меню AAAYA: Help=>Popup Help.
Иконки для кнопок могут быть в формате хрт или bmp, причем различных размеров. (32x32,
48x48, 64x64). Размер и стиль кнопок может быть задан через Script Editor командой
setShelfStyle "iconOnly" "Large"; // "Small" "Medium"
Для взрослых. Любители лаконичного стиля и командной строки могут перевести
полки в текстовый режим командой.
setShelfStyle "textOnly" "Small";
Примечание. MAYA не позволяет использовать русские буквы или спецсимволы (типа
двоеточия) в именах и подписях к кнопкам. Однако это легко можно исправить,
отредактировав вручную текстовые файлы, в которых MAYA хранит информацию
о полках. О том, где и как MAYA хранит все настройки интерфейса мы поговорим
позже, а сейчас, чтобы узнать, где располагаются файлы с полками, выберите
в полковом меню пункт Save All Shelves, а затем откройте Windows=>General
Editors=>Script Editor и посмотрите в верхней части окна путь к файлам полок.
Открыв любой такой файл в текстовом редакторе, вы легко поймете, как
исправить подписи к кнопкам. Не забудьте сделать копию файла перед исправлением.
Найдя «неправильную» полку, MAYA может отказаться запускаться. В текстовом
редакторе вы также можете изменить текст всплывающих подсказок для кнопок.
Для этого надо исправить строку, содержащую флаг - annotation.
Совет. Отличные иконки для кнопок получаются, если отрендерить смысловой
фрагмент сцены в разрешении 32*32.
Интерфейс
65
Я еще вернусь к полкам позже, при описании Script Editor, чтобы рассказать о возможности
создавать кнопки, выполняющие произвольную последовательность действий.
Script Editor и командная строка
В нижней части окна MAYA можно углядеть белую и серую полоски, одна из которых служит
для ввода команд, а другая отображает результат выполнения основных операций в АЛАУА. Эта
часть интерфейса называется командной строкой (Command Line). В правой части командной
строки находится маленькая кнопочка, разворачивающая эти две полоски в окно ввода команд,
которое называется Script Editor.
Подробнее про Script Editor будет рассказано в главе, посвященной MEL, а сейчас лишь
рассмотрим заложенные идеи и основные приемы работы с командами.
Верхняя, нередактируемая часть окна Script Editor представляет собой журнал событий,
своего рода «кондуит», куда записываются практически все события, происходящие в АЛАУА. Можно
также сказать, что там протоколируются все действия, производимые пользователем. Запись
такого протокола ведется на соответствующем языке, который дословно назван «Встроенный
язык программы MAYA» (Maya Embedded Language). Журналом событий или действий удивить
кого-нибудь трудно, но концепция использования MEL заключается в том, что можно взять часть
«протокола», перенести ее в нижнюю половину Script Editor, отредактировать и выполнить, как
набор команд, мгновенно повторяющих бестолковые действия пользователя. Более того, общую
схему взаимодействия пользователя с АЛАУА достаточно грубо можно представить следующим
образом:
Интерфейс АЛАУА переводит все действия пользователя в соответствующие команды на
языке MEL и отсылает их ядру АЛАУА.
Ядро АЛАУА пересчитывает нужные матрицы и прочие умные вещи и сообщает интерфейсу
об успехе операции и просит перерисовать экран, а пользователь, естественно, гордится, что он
все сделал сам...
Таким образом, зная основы языка и научившись отсылать команды ядру, можно заставить
MAYA мгновенно выполнять или повторять нужные последовательности действий. При помощи
таких инструкций можно эффективно автоматизировать работу или даже выполнять операции,
недоступные через стандартное меню (например, изменение весов контрольных точек для
сплайновых кривых).
Более того, если сохранить сцену в формате .ma (AAAYAASCII) и открыть ее затем в текстовом
66
Книга Сергея Цыпцына
№
редакторе, то можно увидеть длинный список MEL-команд, с помощью которых MAYA создает эту
сцену.
Совет. Сохраняйте свои сцены в формате MAYA ASCII. Формат MAYA Binary лишь
немного сжимает информацию, подобно архиватору, экономя место на диске.
Однако отредактировать или починить сломавшуюся сцену можно только в
формате MAYA ASCII. Кроме того, сохранение в текстовом формате позволяет
загрузить сцены, созданные в более поздних версиях MAYA на компьютере с более
ранней версией. Для этого надо открыть такую сцену в текстовом редакторе и
изменить все строки, ссылающиеся на номер версии: обычно это первые десять
строк.
Нижняя частьБсп^Ес^огслужит для ввода, редактирования и отладки последовательностей
команд. Команды вводятся как обычный текст и выполняются нажатием на серую кнопку Enter на
цифровой клавиатуре справа (или Ctrl+Enter).Чтобы выполнить только часть набранных команд,
необходимо предварительно выделить их левой кнопкой мыши, а затем нажать серую кнопку
Enter. Можно также перетаскивать мышью выделенный текст из верхней части Script Editor в нижнюю
часть.
Потренируемся в создании кнопок на полках, типа «сделать красиво».
Сперва создадим пасхальное яйцо:
Создайте сферу: Create=>NURBS Primitives=>Sphere.
Выберите Move Tool и сдвиньте ее немного вверх по оси Y, примерно на 0.5.
Выберите Scale Tool и растяните ее слегка по оси Y, раза в полтора.
Выберите Rotate Tool и поверните примерно на °45 градусов вокруг оси Z.
Сделайте все это в три уверенных действия, и вы увидите в верхней части Script Editor
примерно следующие строки
move -г 0 0.568211 0 ;
scale-г 1 1.478791 1 ;
rotate -г -os 0 0 45.2296 ;
Выделите их и перетащите в нижнюю часть Script Editor средней кнопкой мыши.
Отредактируйте их там , чтобы задать «круглые» значения трансформаций.
move-г 0 0.5 0 ;
scale -г 1 1.5 1 ;
rotate -г -os 0 0 45 ;
Выделите эти команды и нажмите серый Enter. Объект смещается в соответствии с заданными
Интерфейс
67
значениями. Выделите снова эти команды в нижней части Script Editor, перетащите и бросьте их
на любую полку. Появится кнопка с надписью mel, которая делает из сферы пасхальное яйцо.
Теперь создайте полигональный куб (а лучше: сразу несколько примитивов) и при выделенном
объекте нажмите на новоиспеченную кнопку. Получится пасхальный куб, над которым можно
продолжать измываться, нажимая кнопку до полного изнеможения. Принцип проделанных и
несколько примитивных действий, я думаю, понятен. Как изменить надпись и иконку на кнопке,
было рассказано выше.
Также можно перетаскивать кнопки с полок обратно в Script Editor, используя среднюю
кнопку мыши. Обладатели особо пытливых умов могут складывать на полку интересующие их
пункты меню, а затем перетаскивать эти кнопки в Script Editor для исследования соответствия
между пунктами меню и MEL-командами. (Хотя эту же информацию можно получить в Hotkeys
Editor.)
Про устройство команд и разделение их на флаги и значения я расскажу позже, но для тех,
кто жаждет экспериментов, прямо сейчас сообщу, что все строчки, начинающиеся с двух косых
черт (//), являются комментариями и игнорируются при выполнении команд. Точка с запятой (;)
отделяет одну команду от другой. Если в команде присутствует имя объекта, то объект должен
существовать в сцене (это обычно первая проблема начинающих экспериментировать).
Информацию о документированных командах вы можете получить через Help=>MEL Command
Reference... , где содержится описание более чем тысячи MEL-команд.
HotBox
Моделлеры-«экстремалы», сражающиеся за каждый свободный пиксель своего рабочего
пространства, будут невыносимо рады убрать навязчивые элементы интерфейса (с помощью
Display=>UI Elements=>Hide Ul Elements). Самые бескомпромиссные избавятся также и от полосок
меню (<Ctrl-m> и <Shift-m>). Специально для таких самураев существует HotBox, всплывающая
система меню, позволяющая получить доступ к любому пункту меню MAYA в любом месте рабочего
окна. Для того, чтобы вызвать HotBox (на рисунке ниже), надо нажать и удерживать клавишу
пробела в любой панели камеры.
С помощью HotBox можно мгновенно добраться до любого пункта меню в любом режиме
работы. Если вас раздражают некоторые планки меню, типа меню MAYA Live, можете отключить их
через меню HotBox Controls. Там же можно установить и другие параметры отображения HotBox
на экране.
68
Книга Сергея Цыпцына
Совет. Если вы еще не привыкли к HotBox, то не отпускайте пробел синхронно со
щелчком мыши, удерживайте его до последнего, пока не завершите все операции
с меню.
Кроме того вся область экрана при вызванном HotBox разбита на пять зон (Center илиАИаБ,
North, West, South, East). Если нажать мышь в одной из этих зон, то появится звездообразное
меню (Marking Menu). Такие меню предоставляют исключительно быстрый доступ к наиболее часто
употребляемым командам и пунктам меню.
Например, чтобы быстро изменить перспективную камеру в окне основного вида на одну из
ортографических камер, нажмите мышью в центре HotBox (в прямоугольнике Alias) и выберите Тор
View. Чтобы вернуться обратно, проделайте аналогичную операцию, причем нет необходимости
ждать появления HotBox и Marking Menu на экране, достаточно нажать пробел и "чиркнуть" мышью
в нужном направлении.
Marking Menu
По степени ускорения работы в MAYA Marking Menu успешно соперничают с горячими
клавишами. Можно также сказать, что они являются своеобразным расширением функциональности
горячих клавиш, так как могут быть назначены не только на зоны HotBox, но и на любые клавиши.
Например, удерживая кнопки h или d нажмите левую кнопку мыши, чтобы увидеть некоторые
предустановленные Marking Menu.
Совет. Используйте Marking Menu, назначенные на клавиши w, е, г для быстрого
доступа с параметрам инструментов трансформаций.
Интерфейс
69
Примечание, Многие пользователи (но только не адреналиновые моделлеры)
используют только центральную зону HotBox для создания и использования
своих Marking Menu, так как эта зона мгновенно появляется при нажатии на
пробел всегда под курсором мыши, поэтому выбор нужного пункта Marking Menu
не требует перемещения мыши или перевода глаз на клавиатуру и становится
просто моторной привычкой.
Все настройки Marking Menu осуществляются через меню Window=>Settings/
Preferences=>Marking Menus...
В качестве упражнения и для ускорения работы назначим вызов Script Editor и Hypergraph
на правую кнопку мыши в центральной зоне HotBox.
Сначала положите Windows=>General Editors=>Script Editor и Windows=>Hypergraph на любую
полку.
Затем откройте Window=>Settings/Preferences=>Marking Menus... и нажмите кнопку Create
Marking Menu. Возникнет окошко с девятью квадратами, схематично представляющими вакантные
места для пунктов нового меню.
Перетащите с полки кнопки Script Editor и Hypergraph в нужные квадраты средней кнопкой
мыши.
Внизу окна есть «поляна», на которой можно потренироваться и увидеть создаваемое
меню. В поле Menu Name надо ввести название для нового меню (например MyEditors) и нажать
кнопки Save и Close.
70
Книга Сергея Цыпцына
После этого в окне Marking Menus появится новая строка MyEditors. Осталось назначить
это меню либо на горячую клавишу, либо на зону HotBox. В списке Use Marking Menu In: выберите
HotBox. Задайте HotBox Region: Center, Mouse Buttons: Right.
Нажмите кнопки Apply Settings и Close, вызовите HotBox и нажмите правую кнопку мыши
в центральной зоне. Далее, можете самостоятельно дополнить новое меню нужными пунктами
меню или MEL-командами.
Настройка цветов интерфейса
Не никакого смысла описывать интуитивно понятный процесс настройки цветов различных
частей интерфейса. Идите в Windows=>Settings/Preferences=>Preferences...=>Colors... и дайте
наконец выход своим фантазиям.
Сохранение настроек интерфейса
Если вам удалось повторно запустить MAYA после всех этих чудовищных экспериментов
с интерфейсом, то вы заметили, что все настройки сохраняются после выхода из AAAYA. Хорошо
бы еще знать, где и в каком виде они хранятся, и иметь возможность переносить свои настройки
между различными компьютерами. Есть подозрение, что все настройки сохраняются в текстовых
файлах, содержащих MEL-команды и допускающих редактирование. По поводу места сохранения
этих настроек поговорим подробнее.
Когда AAAYA запускается в первый раз, она автоматически ищет место, где хранить свои
настройки. Самым подходящим местом является домашний (home) каталог пользователя2. В этом
каталоге AAAYA при первом запуске создает папку "maya" (если таковая отсутствует), размещая в
ней все настройки, и там же создает новый проект. Такой механизм позволяет хранить настройки
каждого пользователя при работе с AAAYA отдельно и загружать их в зависимости от того, под
каким именем вы зашли в операционную систему. Заглянув в эту папку вы можете увидеть
каталог с номером версии - именно там хранятся настройки интерфейса для каждой версии AAAYA,
установленной на компьютере. Поэтому, если вы хотите перенести все свои настройки интерфейса
на новое рабочее место, скопируйте папку с номером версии и перенесите ее в каталог «maya» на
другом компьютере.
2. Для Unix-систем это понятие (home) изначально определено при входе в систему. Для
Windows-систем это обычно папка My Documents, также определяемая для каждого пользователя
индивидуально. - Примечание автора.
Интерфейс
71
Размер этой папки ничтожен, вы можете носить ее с собой, если ваше рабочее место часто меняется.
Содержимое папки легко идентифицируется методом тыка. Также очень невредно, для общего
развития, посмотреть на содержимое каждого файла из этой папки в текстовом редакторе.
Для взрослых. Как быть, если хочется хранить настройки не в стандартной папке
по умолчанию, а в совершенно другом месте, например, на сервере? Для этого надо
сообщить MAYA, где при запуске она должна искать свою папку. Сообщить об этом
нужно, естественно, перед запуском, поэтому эта информация должна храниться в
памяти операционной системы. Для этого служит механизм переменных окружения,
с помощью которого можно создать переменную MAYA_APP_DIR и указать в ней
нужный путь. Такие переменные могут быть заданы либо из командной строки
командой set, либо для Windows-систем через Control Panel=>System=>Advanced=>En
vironment Variables.
Если создать новую переменную с именем MAYA_APP_DIR, а в качестве значения указать
папку на любом диске, то MAYA при запуске будет читать и сохранять все настройки в этой папке.
MAYA_APP_DIR является не единственной переменной, сообщающей MAYA служебную информацию,
однако остальные переменные удобнее задавать в файле Maya.env, который можно разыскать с
папке с майскими настройками. Про некоторые другие переменные я расскажу в главе про язык
MEL
Настройки проекта
Большую часть информации о трехмерной сцене MAYA хранит в соответствующем файле:
формата .та или .mb. Однако часть информации хранится отдельно, например, файлы с
растровыми текстурами, кэш для частиц и др. Удобно хранить все файлы, необходимые для работы
над конкретным проектом в одном месте, то есть каталоге. Такой каталог называется в майской
терминологии проектом и представляет собой просто папку на любом диске с подкаталогами, в
которых хранятся данные, необходимые для какого-то определенного объема работ. Естественно,
наиболее важным подкаталогом является папка scenes, где хранятся файлы сцен. Находясь в
MAYA, вы всегда работаете с каким-либо проектом (даже если не позаботились об этом). Создать
новый проект можно через File=>Project=>New...
А окне New Project следует задать имя проекта и место его расположения на диске. В
остальных полях рекомендуется задать имена подкаталогов, в которых будут сохранены файлы,
возникающие при работе с этим проектом. Для ленивых внизу имеется кнопка Use Defaults,
заполняющая все поля по умолчанию. После нажатия кнопки Accept, на диске в указанном месте
просто возникнет каталог с именем проекта, включающий в себя дерево подкаталогов, и MAYA
автоматически переключится на работу с этим проектом.
72
Книга Сергея Цыпцына
Важно понимать, что проект - это всего лишь каталог, который не накладывает ограничений
на то, где будут храниться ваши данные - вы можете открывать сцены с любых дисков, сохранять
их где угодно и ссылаться на текстуры, лежащие в сети. Единственное, что определяется проектом
- это где будут сохраняться данные, возникающие при работе с проектом, например, просчитанные
изображения, IPR-файлы, сконвертированные процедурные текстуры или кэш флюидов и частиц.
Соответственно, после того, как вы установили, с каким проектом будете работать, вам не надо
думать, куда будут записаны просчитанные кадры анимации после запуска Batch Render. Если
проект не был указан корректно или если вы задали в качестве проекта каталог, не содержащий
стандартных подкаталогов, ваши новые файлы будут сохранены в одной большой куче в этом
каталоге.
Переключиться в другой проект можно через File=>Project=>Set, где нужно всего лишь
указать каталог на диске, с которым MAYA будет дальше работать, как с проектом.
Еще раз о пользе подсказки Help Line
В заключение напоминаю: при работе с MAYA, особенно на стадии освоения пакета, как
можно чаще опускайте глаза на подсказку в HelpLine, чтобы не вспоминать мучительно, что надо
выбрать перед применением той или иной операции. Правда, там зачастую болтаются свернутые
окна, полностью перекрывая обзор. На этот случай вы можете воспользоваться следующим
набором команд, который немного приподнимет HelpLine от края окна. (Вы можете скопировать
эти строки из файла на прилагаемом диске в Script Editor и нажать Ctrl-Enter).
global proc tweakHelpl_ine(int $mode) {
global string SgTimeSliderForm;
global string SgPlaybackRangeForm;
global string SgCommandLineForm;
global string SgHelpLineForm;
global string SgMayaLiveControlForm;
global string SgMainWindowForm;
setParent SgCommandLineForm; setParent ..;
string $commandLine = xsetParent ./;
setParent SgTimeSliderForm; setParent..;
string StimeSlider = лsetParent ./;
setParent SgPlaybackRangeForm; setParent ..;
string SplaybackRange = SetParent ./;
setParent SgHelpLineForm; setParent ..;
string ShelpLine = 'setParent ./;
setParent SgMayaLiveControlForm; setParent ..;
Интерфейс
73
string SmayaLive = xsetParent./;
string $tmp;
if($mode>0) {$tmp=$helpLine; $helpLine=$commandLine; $commandLine=$tmp;}
if($mode==2) {$tmp=$commandLine; $commandLine=$playbackRange; $playbackRange=$timeSlider;
$timeSlider=$tmp;}
formLayout -edit
-attachNone SmayaLive
-attachForm SmayaLive
-attachForm SmayaLive
-attachControl SmayaLive
"top"
"left" 0
"right" 0
"bottom" 0 StimeSlider
-attachNone StimeSlider
-attachForm StimeSlider
-attachForm StimeSlider
-attachControl StimeSlider
"top"
"left" 0
"right" 0
"bottom" 0 SplaybackRange
-attachNone SplaybackRange
-attachForm SplaybackRange
-attachForm SplaybackRange
-attachControl SplaybackRange
"top"
"left" 0
"right" 0
"bottom" 0 ScommandLine
-attachNone ScommandLine
-attachForm ScommandLine
-attachForm ScommandLine
-attachControl ScommandLine
"top"
"left" 0
"right" 0
"bottom" 0 ShelpLine
-attachNone ShelpLine "top"
-attachForm ShelpLine "left" 0
-attachForm ShelpLine "bottom" 0
-attachForm ShelpLine "right" 0
SgMainWindowForm;
}
tweakHelpLine 1; // use also 0 and 2
Практические замечания по поводу интерфейса MAYA
Еще раз повторюсь - даже не пытайтесь запомнить все возможности и способы настраивания
интерфейса, а лишь выберите «под себя» наиболее понравившийся принцип и следуйте ему.
Для быстрого создания «временных» ускорителей работы (например, на несколько дней
для рутинной работы по моделированию) используйте полки, туда можно быстро «набрасывать»
часто используемые именно в данный момент операции. Полки легко «чистить», создавать или
удалять.
Для более «долгоиграющих» настроек используйте горячие клавиши. Открытие основных
редакторов типа Attribute Editor или HyperShade - это, как правило, назначается на горячие
клавиши.
Marking Menu требуют наибольшего времени для настройки, но и обеспечивают наивысшее
ускорение и удобство работы. К ним надо лишь немного привыкнуть.
Забросив на полку новую кнопку, не поленитесь выполнить File=>Save Preferences. Иначе,
в случае неожиданного падения MAYA, все новые кнопки на полках будут утеряны. То же самое
относится к вновь созданным горячим клавишам или Marking Menu.
Майский интерфейс бесконечно гибок и может быть изменен в любом направлении. Как вы
уже заподозрили, он практически полностью написан на MEL и поэтому может быть модифицирован
74
Книга Сергея Цыпцына
пользователем. Все исходные файлы лежат в папке X:\Program Files\Alias\Maya7.0\scripts и
доступны для изучения и редактирования. Единственный совет: не редактируйте их на месте,
а скопируйте в папку scripts, располагающуюся в папке maya, создаваемой в вашем домашнем
каталоге. Подробнее об этом и о том, как модифицировать интерфейс MAYA читайте в главе про
MEL.
Воспоминания автора...
Однажды я посмотрел фильм «На гребне волны» (Point Break), где Патрик Суэйзи
и Киану Ривз на фоне калифорнийских пляжей ловко гоняют на досках между волн,
а в перерывах успевают заниматься любимой работой. После этого покой был
утрачен. Настроение свободы оказалось передано столь убедительно, что желание
съехать с волны в тех местах, где есть настоящий сёрфинг, превратилось для
меня в навязчивую идею. Я смотрел фильм снова и снова, запоминая мельчайшие
детали, касающиеся освоения техники сёрфинга (интернет тогда не мог служить
источником информации - его просто не было в Москве). Я мысленно проделывал
безумные движения и мечтал о возможности испытать это наяву. При этом с
трудом вспоминал, как в детстве удавалось съезжать с рахитичных крымских
волн на утлом надувном матрасике, довольно долго цепляясь за одну и ту же
волну.
Потом я успел лет десять откататься на горных лыжах, освоить сноуборд,
разобраться с монолыжей, научился гонять на скейте и чуть не утонул, осваивая
водные лыжи. Это лишь усугубляло неуемное желание испытать квинтэссенцию
всего вышеперечисленного. Тщательное географическое расследование принесло
мало результатов: кто-то слышал, что где-то в Португалии, кажется, есть
места для серфинга, но где конкретно и как туда добраться, никто не знал. Жизнь
постепенно теряла свой смысл...
Помогла любимая работа: компьютерная графика. В 1997 году я попал на
выставку Siggraph, которая проходила в Калифорнии, в небольшом таком, вполне
провинциальном городке по имени Los Angeles. Выставочные дни пролетели
незаметно, но в глубине сознания пульсировала мысль, что всего лишь в десяти
километрах отсюда люди «делают ЭТО». В последний день перед отлетом я уговорил
Диму Озерца, с которым мы были на выставке, отвезти меня куда-нибудь, где
могут быть волны. Дима привез меня в Сан-Диего, в бухту Ла-Хойя, где не только
накатывали волны из просторов Тихого океана, но даже был прокатный пункт
досок для сёрфинга! Я не мог поверить, что все это в самом деле происходит со
мной. Дальше все было практически так же, как в знакомом наизусть кино. Я тут
же попросил доску напрокат и все пытался уговорить девушку из проката дать
мне хотя бы один урок. Но был будний день, и девушка, ослепительно улыбаясь,
безжалостно отказалась давать уроки, ввиду исключительной занятости и
нехватки персонала. Зато я на целый день стал обладателем огромной, точь-в-
точь как в кино, трехметровой доски. (Единственно, она была не розовая, как в
фильме, а истошно-желтого цвета.)
Помня, что до отлета на родину остались всего сутки, я ринулся на берег,
срывая по дороге остатки одежды и хрипя от избытка адреналина. А волны в
тот день были более чем хороши. Двух-трехметровые сугробы выгибались, как
кобры перед броском, и хлестко падали вниз метрах в сорока от берега. Потом
упавшие сугробы превращались в метровые белоснежные буруны и весело бежали
к берегу по песчаной отмели. То тут, то там в них виднелись головы каких-то
животных. Моржи? Котики? Да, нет - серферы! Первым ощущением был шок, а
затем недоумение: как же все эти ловкие люди пробрались туда, к волнам? У берега
каждый жизнерадостный метровый бурун сбивал меня с ног, а при попытке лечь
на доску и грести вперед, меня либо просто смывало с доски, либо переворачивало
кувырком назад. Подсмотрев, как взрослые мальчики, вцепившись в края доски,
ловко переворачиваются кверху дном перед буруном, я попробовал поступать
точно так же, но мой непотопляемый дредноут сразу же вырывался из рук, и
только фал, привязанный к левой ноге, напоминал мне, что я еще жив. В конце
Интерфейс
75
концов я стал просто соскакивать с доски перед каждым буруном и нырять под
него, как тюлень, оставляя доску волочиться за собой на веревке. Между бурунами
я неистово греб, как колесный пароход на урановом топливе, и так, минут через
пятьдесят, понял, что прорвался за линию падения волн. Вокруг было тихо, и
лишь проползающие снизу волны приподнимали мое безжизненное тело поближе к
солнцу. Хотелось спать.
В уголке сознания, однако, четко сохранилась инструкция о том, что надо
делать дальше. «Ловить свою волну» - вот жизненное кредо любого серфера.
Я уже ощущал себя невыносимо бывалым и, соответственно, взялся за ловлю.
Ключевое для анимации понятие «тайминг» является основополагающим и для
сёрфинга. Главное - это быть в нужной позиции в нужном кадре и двигаться при
этом с нужной скоростью. Все это я отлично помнил. Но ни в кино, ни в книжках
по анимации ничего не говорилось о том, что в нужный момент надо повернуть в
нужном направлении!..
Поэтому, когда, я наконец поймал свою волну и многократно изученным по
фильму движением вскочил на ноги на самой её вершине, путь мой к блаженству
был не дольше пяти кадров. Размахивая рукам, вращая глазами и набрав отличную
скорость, я врезался в основание волны, нос доски ушел под воду, следом впечатался
я, а сверху рухнула двухметровая волна. Хорошо, что я успел набрать воздуха, а
инстинкт самосохранения подсказал мне сжаться. Как можно компактнее... Меня
вращало, трясло, закручивало в спираль, бесконечно долго тащило вперед. Рядом
тащило и мой желтый снаряд, о чем я догадывался по его дружеским ударам. По
моим ребрам.
Когда, наконец, я встал на ноги, то осознал: до берега - метра два. Руки
тряслись, голова кружилась, но я понял главное - нужно же поворачивать! И все
началось с самого начала - борьба с бурунами, неистовая гребля, прорыв сквозь
линию падения.
Часа через четыре я выполз на песок, кое-как нашел свои вещи и, рухнув на
доску лицом вниз, уснул от полного истощения сил. Но сон мой был недолог, ибо,
вернувшись из забытья, я обнаружил, что снова плыву на доске. Будучи в первый раз
на океане, я и не предполагал, что приливы могут быть столь высоки. Очередная
приливная волна приподняла меня и мои вещи, мягко переставив все метра на три
вперед.
Это был уже явный вызов, и потому, оставив вещи сохнуть на кустах, я
снова ринулся ловить свою волну. Подводя итог, скажу лишь, что за семь часов,
проведенных в океане, мне удалось два раза проехать довольно приличное
расстояние на не очень больших волнах. При этом я извивался, как червяк на
крючке, пытаясь устоять на доске, бешено вращал руками, поднимая ветер, но
зато я катился - катился! - и притом со своей волны!
Трудно передать словами это ощущение. Ты, вроде, стоишь на месте,
потому что высота почти не меняется, но в то же время несешься куда-то с
дикой скоростью, а вокруг всё бурлит, свистит и грохочет. При этом адреналин
поступает в организм прямым, воздушно-капельным путем.
Мечта была исполнена, никакого разочарования не последовало - только желание
делать то же самое, снова и снова...
Для тех, кто вдруг неосторожно посмотрит вышеупомянутое кино и
почувствует аналогичную патологическую зависимость от желания поймать
волну, дам некоторое количество советов в соответствии с обучающей концепцией
этой своей книги - которая, казалось бы, совсем о другом...
Первое. Доска действительно должна быть как можно больше. Это существенно
экономит силы по удержанию равновесия.
Второе. Учитесь кататься на упавшей волне, то есть на пенном буруне,
бегущем к берегу.
Третье. Самое главное - научитесь плавать. Точнее: научитесь очень хорошо
плавать3. Без этого вы будете просто самоубийцей.
3 А это значит: научитесь не дышать, когда надо, и дышать, когда можно, то есть в
короткий миг, когда ваше лицо не во власти воды. И еще это значит: научитесь контролировать
положение своего тела, чувствовать струи, токи воды вокруг него. - Примечание редактора...
76
Книга Сергея Цыпцына
т
Четвертое. Не пожалейте денег - купите гидрокостюм. Я никак не мог взять в
толк, зачем в такую жару все эти безумные люди одели на себя резиновые «майки».
А дело в том, что девяносто пять процентов времени, особенно в процессе
самообучения, вы проводите, лежа на доске. После семи часов пребывания в такой
позе в соленой воде, да еще под палящим солнцем, передняя часть моего тела
превратилась в большую ссадину, а «заднее лицо» (backface) - в огромный, сплошной
ожог. Соответственно, двенадцатичасовой перелет на родину на следующий день
доставил мне массу незабываемых впечатлений.
И последнее. Когда будете фотографироваться для девушек, не ставьте доску
вертикально рядом с собой: это может существенно снизить вашу значимость
в глазах девушек, на фоне огромной, символической доски. Лучше взять доску
подмышку.
Про остальные тонкости и дальнейшие свои серфовые приключения расскажу
позже.
Интерфейс
77
«Изнанка» программы.
Архитектура MAYA
НИША
Архитектура MAYA
Обращаю ваше внимание: здесь я изложу свое понимание архитектуры MAYA. Причем
будет оно не столько техническим, сколько интуитивным. За годы преподавания мне приходилось
рассказывать о ней десятки, если не сотни раз, поэтому в конце концов я решил: лучше всего
излагать этот вопрос «на пальцах», то есть так, как понимаю его сам, как рассказываю о нем в
устном общении.
Ниже придется объяснить ряд ключевых моментов, необходимых для понимания MAYA.
Всем тем, кто уже достаточно плотно работает с MAYA, я бы все равно посоветовал прочитать
эту главу. Более того, она написана в первую очередь для таких пользователей. Даже если вы
считаете, что MAYA вам уже известна вдоль и поперек, давайте просто сравним наши представления
о ней. Читателей с чисто гуманитарным образованием эта глава, возможно, отпугнет своей
«искусственностью» и «абстрактностью». Но надеюсь, что лапидарность примеров и упражнений
позволит сконцентрироваться на понимании принципов функционирования инструментов MAYA и
даст возможность любому читателю почувствовать логику их использования.
Всем тем, кто начал работать с MAYA совсем недавно, я бы настоятельно рекомендовал
прочесть эту главу, хотя многое может показаться непонятным или слишком сложным. Но если
вы просто дочитаете эту главу до конца, какие-то ключевые моменты осядут в вашем сознании
(или подсознании), и это поможет вам в будущем. Методы нейро-лингвистического кодирования,
зашитые в текст, обязательно сработают, и позднее вы время от времени будете обнаруживать,
что уже знаете вещи, о которых ранее и не догадывались.
Я также рекомендую периодически перечитывать эту главу по мере накопления опыта
работы - вы увидите, что ваше понимание MAYA будет меняться в прямой зависимости от времени,
проведенного с ней.. Некоторые упражнения этой главы, возможно, трудноваты для новичков. Не
отчаивайтесь, пропустите такие «страшные места» или, прочитав необходимые разделы книги,
вернитесь к этой главе. (Но предупреждаю: ни в коем случае не читайте разделы «Для взрослых»,
дабы не травмировать вашу, еще не окрепшую трехмерную психику.)
В принципе можно совсем пропустить эту главу, чтобы скорее перейти к менее скучным
разделам, стремясь заняться полигональноым моделированием человеческих конечностей.
Но если, например, у вас мало свободного времени, я бы как раз посоветовал пропустить все
остальные главы и прочесть только эту. С моей точки зрения, пользы вам от этого будет гораздо
больше.
Перевод node-based architecture как «архитектуры, основанной на узлах» до сих пор меня
сильно забавит, и некоторые пользователи до сих пор ищут узлы, которые можно развязать или
разрубить, чтобы обрести понимание MAYA. Если перевод кому-то все-таки необходим, то можно
сказать, что архитектура MAYA базируется на концепции дерева зависимостей или связей между
объектами. Но это будет лишь формальным определением. Всё, чем я буду заниматься в этой
главе - это создавать новый объект и смотреть на его внутренности: из чего он состоит и в каких
связях участвует.
Объект как список атрибутов. Основная концепция MAYA
Откроем новую сцену и создадим, естественно, полигональный куб (только NURBS-сфера
может изредка соперничать с ним по популярности).
80
Книга Сергея Цыпцына
Для начала посмотрим в Attribute Editor созданного куба. Все атрибуты объекта разнесены
по различным закладкам и сгруппированы по своему, так сказать, назначению. Прежде всего
стоит хорошенько усвоить: положение, размер, поведение, внешний вид и прочие конкретные
свойства объекта полностью определяются значением его атрибутов. Можно сказать просто
и точно: объект - это список атрибутов, полностью определяющих всю его жизнь. Положение
объекта определяется цифрами в первой закладке (pCubel), количество вершин - во второй
закладке (polyCubel), цвет объекта - значениями атрибутов в последней закладке (Lambertl). Всё,
что происходит с объектом в процессе работы с ним в AAAYA - это изменение его атрибутов. Если
объект анимирован и движется, значит один из атрибутов translate меняется в зависимости от
времени. Если вы меняете форму сплайновой кривой вручную, то меняются значения атрибутов,
определяющих координаты контрольных вершин кривой и т.д.
Но атрибуты, оказывается, можно использовать не только для изменения свойств объекта,
но и для создания связей между разными объектами. Прежде, чем создавать такие связи самим,
посмотрим, как это же делает MAYA, и разберемся, как можно исследовать внутреннюю структуру
объекта.
Однако еще разок повторю основную концепцию MAYA, то, что надо «зарубить себе на
носу»:
Объект - это набор атрибутов, определяющих его свойства.
Изучение внутренностей. Работа с Hypergraph.
Исследовательская кнопка. Дерево зависимостей.
«Нода» как новое слово в русском языке.
Терминологические муки
Инструмент изучения внутренностей объекта называется Hypergraph. Выделив объект
(pCubel) и открыв Windows=>Hypergraph, следует нажать «исследовательскую» кнопку (четвертая
справа) или выбрать в меню пункт Graph=>lnput and Output Connection в окне Hypergraph.
Операция Input and Output Connection предназначена для отображения в окне Hypergraph
выбранного объекта, а также всех его связей со своими составляющими и другими объектами.
Формально говоря, она отображает дерево зависимостей (Dependency Graph) для выбранного
объекта.
Как следует из содержимого окна Hypergraph, наш куб не представляет из себя единого
целого объекта, а распадается на элементы (pCubel, pCubeShapel, polyCubel).
Такие элементы называются в MAYA нодами (nodes). Каждая такая нода определяет четко
определенные свойства объекта (через соответствующие атрибуты, естественно). Таким образом,
практически любой видимый в окне камеры объект - это набор нод, каждая из которых имеет
свои собственные атрибуты, определяющие конкретные свойства объекта. Именно эти ноды (а
точнее, их имена) видны в закладках Attribute Editor, что делает концепцию разложения объекта
на составляющие ноды еще более наглядной. Таким образом, уточним предыдущее определение:
«объект - это набор составляющих его нод, каждая из которых ответственна за определенные
Архитектура
81
шиш.
свойства объекта и является просто набором атрибутов, определяющих эти свойства». Если для
кого-то такое определение звучит угрожающе, то попробуйте представлять себе объекты как
молекулы, состоящие из атомов-нод, количество и заряд которых определяют свойства молекулы-
объекта.
Закладки в Attribute Editor, прямоугольники в Hypergraph, разделы в Channel Box - все это
визуальные представления нод в интерфейсе MAYA.
Терминологический комментарий. Термин «нода» давно и прочно прижился в устном
«майском» жаргоне. Честно говоря, в печатном виде он выглядит не так «естественно». Но пока что
мне не удалось иначе передать сложившуюся терминологию, вводя при этом новые, искусственные
термины. Нода - это не узел, не вершина, не подобъект. Попробуйте сами рассказать кому-нибудь
про нодовую структуру, применяя, например, термин «часть объекта». Так что привыкайте, будет
легче общаться с майщиками всех народностей мира
Володя Забелин как-то предложил мне переводить node как «первоэлемент». Соглашусь,
это неплохо: и звучит несколько мистически и в то же время выпукло отражает суть понятия. Жаль
только, что в техническом тексте такой термин будет выглядеть несколько громоздко. Но при
попытках осмыслить природу, суть «ноды» он подходит, на мой взгляд, лучше всего.
Чтобы ноды составляли конкретный объект, а не просто были заготовками в конструкторе,
между ними должны существовать связи. Такие связи четко видны в окне Hypergraph, и если
навести курсор мыши на любую из них, можно увидеть дополнительную информацию об этой
связи.
В случае с кубом (объект pCubel) читать эту информацию следует так: атрибут output ноды
polyCubel присоединен к атрибуту inMesh ноды polyShapel. Здесь очевидно, что эти атрибуты не
просто одиночные числа, а представляют собой целые наборы данных. Впрочем, о типах атрибутов
и о Construction History узнаем чуть позже. А сейчас я лишь отмечу, что при помощи Hypergraph
и «исследовательской» кнопки можно всегда увидеть все связи между атрибутами выбранных
объектов. Очень полезно также представлять себе «майскую» сцену как поток данных, который
движется по стрелкам-связям, по пути формируя нужные объекты.
Вы можете проделать следующее упражнение: выделяйте все ноды, которые появляются в
окне Hypergraph после очередного нажатия кнопки Input and Output Connection, и снова нажимайте
эту кнопку. Таким образом, в окне будут появляться все новые ноды, связанные с атрибутами уже
выбранных объектов, пока вы не увидите полное дерево объектов, описывающих текущую сцену.
Режимы работы в Hypergraph.
Иерархия сцены и дерево зависимостей. Дело вкуса
Однако в нашем случае с кубом одну связь не удастся увидеть:- это связь между нодами
pCubel и pCubeShapel. Чтобы увидеть ее в Hypergraph нужно переключиться в режим просмотра
иерархии сцены: Graph=>Scene Hierarchy. И дополнительно включить отображение нод типа Shape:
Option=>Display=>Shape Nodes. Тогда связь появится, но без направляющей стрелки и без подсказки
при наведении курсора мыши.
Рассмотрим ее подробнее, сделав сначала несколько замечаний по поводу режимов работы
в Hypergraph.
82
Книга Сергея Цыпцына
Работу в Hypergraph можно разделить на два режима. Режим Scene Hierarchy - это работа со
списком объектов в сцене, так же, как в окне Outliner. В этом режиме в рабочей области Hypergraph
отражаются видимые объекты, с которыми вы работаете в окне текущей камеры. Он предназначен
для выбора, удаления, группировки объектов и является альтернативой выполнения аналогичных
действий в окне Outliner. Для переключения в этот режим используется меню Graph=>Scene
Hierarchy или соответствующая кнопка на панели Hypergraph.
Другой режим (Dependency graph) отсутствует в окне Outliner и служит для отображения и
исследования как связей между объектами, так и внутренней структуры объектов. В этот режим
можно всегда попасть, выбрав Graph=> Input and Output Connection или нажав соответствующую
кнопку.
Примечание. Использовать Hypergraph в режиме Scene Hierarchy или Outliner -скорее
дело вкуса, однако это напрямую связано с размером монитора по диагонали. Но
в целом ясно: кто привык к спискам и таблицам, предпочтет Outliner, тогда как
все пользователи, имеющие склонность к визуальному представлению данных,
наверняка выберут Hypergraph.
Transform и Shape. Положение и форма.
Родители и потомки. Неразрывная связь
Вернемся к Hypergraph и рассмотрим подробнее отношение между pCubel и pCube-
Shapel. Связь между ними не является связью между атрибутами и представляет собой особый
тип отношений между объектами, а именно: иерархическое отношение parent-child (родитель-
потомок).
Дело в том, что практически любой объект, видимый на экране (точнее, в окне камеры),
всегда состоит из двух составляющих. Первая составляющая - это нода типа transform, которая
определяет, где находится объект в пространстве, каков его размер, где располагается его pivot, то
есть представляет собой как бы оболочку или мини-пространство, в котором живет объект. Но она
ничего не говорит о форме или внешнем виде объекта. За форму отвечает вторая составляющая:
нода типа shape. (У источников света и камер тоже имеется нода shape, однако если говорить о
форме камеры, имеется в виду не геометрическая форма, а внутренние свойства объекта, такие,
как фокальное расстояние, апертура и др.)
Действительно, если выбрать любой объект на экране и открыть Attribute Editor, то
первые две закладки всегда будут представлять ноды transform и shape. Аналогичные разделы,
представляющие эти же две ноды, появляются и Channel Box.
Данная концепция распространяется на все объекты, видимые в окне камеры (позже мы
назовем их DAG-объектами).
Архитектура
83
Можете представлять себе объект, форма которого определяется атрибутами ноды shape,
сидящим внутри оболочки, определяемой нодой transform. Он поворачивается и перемещается с
этой оболочкой, меняет свой размер вместе с ней, как единое целое. По-другому можно сказать,
что нода transform определяет только точку в пространстве, в которой находится объект, плюс его
ориентацию и размер.
Любой вновь созданный объект хотелось бы перемещать в пространстве, поэтому он
просто обязан иметь ноду transform, которую (точнее: «за которую») мы будем его двигать или
вращать. Если выражаться банально, надо сказать: «изменяя атрибуты ноды transform, мы будем
трансформировать объект».
Если изменяется интенсивность или цвет источника света, это осуществляется с помощью
атрибутов ноды shape этого источника света. Эти атрибуты определяют как бы внутренние свойства
объекта, не зависящие от его трехмерного положения.
Если перемещать, например, вершины полигонального куба, это также приведет к
изменению атрибутов ноды shape - просто имена таких атрибутов не видны в Attribute Editor, а
их тип не позволяет отобразить их адекватно для всего объекта целиком. О таких атрибутах я
расскажу подробнее в разделе, касающемся Construction History.
По умолчанию, вновь созданные объекты появляются в Outliner (и в Hypergraph в режиме
Scene Hierarchy), при этом они не разделены на transform и shape, а представлены как один целый
объект: это лишь подчеркивает, что объект всегда создается как неделимая пара transform-shape.
Чтобы увидеть ноды shape в Outliner, надо включить их отображение через меню Display=>Shapes
(для Hypergraph: Option=>Display=>Shape Nodes).
84
Книга Сергея Цыпцына
В таком режиме видна связь между transform и shape, которая, как упоминалось выше, не
описывается зависимостью атрибутов, а является отношением parent-child (родитель-потомок).
Как говорят психоаналитики, поговорим об этом подробнее.
Отцы и дети. Начальники и подчиненные.
«Припарентивание» и прочие термины.
Наследование трансформаций
Как описано выше, для того, чтобы подчинить один объект другому, надо выбрать два
объекта и выполнить операцию Edit=>Parent. После этого перемещение второго объекта влечет за
собой перемещение первого. Второй объект становится «родителем» (parent) и подчиняет себе
перемещения первого, который отныне стал его потомком, «ребенком» (child). Перемещение
родительского объекта всегда вызывает перемещения подчиненных объектов, хотя последние
могут иметь свои собственные перемещения, если их выбрать независимо от родителя. Разберемся,
как это устроено с точки зрения майской архитектуры и деления объектов на transform и shape.
Мы только что выяснили: transform-нода полностью управляет положением объекта в
пространстве и как бы подчиняет себе shape-ноду. А нельзя ли сделать так, чтобы один объект
подчинял себе перемещения другого объекта? (Точнее, чтобы один transform подчинял себе не
только свой shape, но и другой transform.) Вышеописанная операция называется parent и служит
для организации перемещения подчиненного объекта-потомка вместе с объектом-родителем. По-
русски прижилось название «припарентить», то есть как бы привязать один объект к другому.
Терминологический комментарий. Термин «привязать» один объект к другому при работе
с MAYA был бы крайне неудачен, так как связать движения двух объектов можно различными и
концептуально разными способами. Для операции parent принято говорить «припарентить». Если
объекты связываются с помощью операций из меню Constrain, то в устном изложении это звучит как,
пардон, «приконстрейнить». В тексте выглядит, конечно, чудовищно, но сразу понятно о чем речь.
Если движение объектов синхронизируется с помощью связывания соответствующих атрибутов,
то профессиональный термин звучит как «приконнектить атрибуты». Все эти нецензурные, по
мнению литредактора, термины означают «привязку» одного объекта к другому, произведённую
совершенно разными способами.. Увы, пока что лучше не скажешь...
Создайте два любых примитива, выберите их, выполните Edit=>Parent.
Включите Display=>Shapes в окне Outliner и разверните все плюсы напротив имен
объектов.
Схематическое представление иерархии говорит само за себя. Нода transform
родительского объекта (parent-объекта) включает в себя свой shape и transform подчиненного
объекта, содержащего свой shape.
fci! -lalxi
Display Show Help
iS* j
Ш JSP persp
Ш Щ top
Ш Ш front
Щ ffl side
В О PCubel
^> pCubeShapel
]E3 CJ ruirbsSpherel
JJ nutbsSphereShapel
Luj M
Теперь все перемещения «верхнего» объекта наследуются «нижним» объектом. Более того,
все значения атрибутов перемещений, задаваемые, например, в Channel Box для подчиненного
объекта, определяют теперь его перемещения не в мировом пространстве, а лишь в пространстве
Архитектура
85
lilOJli
родительского объекта. Поверните «верхний» объект и посмотрите, как влияют значения атрибутов
translate «нижнего» объекта на его положение в пространстве.
Для взрослых. Интересно, что наследование трансформаций можно отключить, сняв
галочку Inherit Transform (в Attribute Editor в закладке transform для подчиненного объекта).
После этого он будет только выбираться вместе с родительским объектом, а перемещаться вместе
ним не будет.
Таким образом, в ходе операции parent для подчиненных объектов, все мировое
пространство (мировая система координат) заменяется на пространство родительского объекта
(локальную систему координат объекта).
Интерактивный способ, позволяющий «припарентить» один объект к другому, тоже очень
нагляден. В окне Outliner можно потащить средней кнопкой мыши нужный объект и бросить его
прямо на другой объект. «На» означает, что вокруг объекта (на который мы бросаем первый
объект) появляются две горизонтальные черты: бросаемый объект как бы «проваливается» в своего
родителя и становится подчиненным. Одна черта обозначает вставку или изменение положения
объекта в списке других объектов(геогс)ег).
Очень показательна реализация команды unparent - если выбрать любой подчиненный
объект и выполнить Edit=>Unparent, то можно углядеть в Script Editor команду "parent -w[orld]".
Это означает, что, освобождая объект от родителя, мы просто «припарентиваем» его к мировой
системе координат, в которой изначально создаются все объекты.
I Display Show Help II
Аналогичные действия средней кнопкой мыши можно производить и в Hypergraph.
Очевидно, подчиненных объектов может быть сколько угодно, а вот родитель всегда один.
Также очевидно, что одного родителя можно сделать подчиненным другому родителю, то есть
организовать иерархию какой угодно глубины. Главное, о чем стоит помнить: отношения parent-
child устанавливаются именно между transform-нодами.
Для взрослых. Пытливые умы конечно спросят, а можно ли разорвать «родовую»
связь между transform и shape, и «припарентить» shape одного объекта к transform-
ноде другого? Ответ, конечно, подкупает новизной - при помощи соответствующей
MEL-команды можно всё. Создайте, например, полигональную сферу и источник
света (spot light). В Outliner или Hypergraph выберите сначала shape сферы (pSphere-
Shapel), а затем transform источника света. В Script Editor выполните команду
parent -add -s;
86
Книга Сергея Цыпцына
Эта команда добавит shape сферы «под» transform источника света, (Исходную
сферу можно выбрать в Outliner, а потом удалить.) В итоге получится весьма
странный объект, похожий на группу, но в нем ни сферу, ни источник света нельзя
перемещать по отдельности.
Кстати, данный трюк позволяет осуществлять операцию combine для NURBS-
объектов. В некоторых случаях это помогает существенно сократить размер файла
сцены, сэкономить толику памяти и ускорить перерисовку экрана.
Некриминальные группировки.
Пустые группы. Умение группироваться
Посмотрим, что происходит в процессе группировки объектов. Если выбрать несколько
объектов и выполнить операцию Edit=>Group, то и в Outliner и в Hypergraph сначала просто
будет создана пустая нода типа transform с именем типа groupl, а затем все выбранные объекты
«припарентиваются» к этой группе, то есть задача сводится к только что описанной выше. Если в
предыдущем случае один объект выступал в роли родителя, в процессе группировки такой родитель
искусственно создают в виде пустого transform-объекта и потом назначают «начальником» («отцом
родным») для всех выбранных объектов. Если выбрать группу в Outliner и открыть Attribute Editor,
вы увидите, что у группы всего одна закладка - для transform-ноды. Так как у группы нет ноды
shape, то у нее не может быть формы, и, следовательно, без специальных ухищрений ее нельзя
выбрать на экране.
Архитектура
87
Показателен один из способов создать пустую группу. Надо ничего не выбрать (то есть
снять выделение со всех объектов), а затем выполнить команду Edit=>Group. Создается пустая
группа, включающая в себя «ничто». Для тех, кто не привык мыслить столь радикально, в меню
существует «официальный» пункт Create=>Emtpty Group, который делает абсолютно то же самое.
Операция разгруппировки Edit=>Ungroup, выполняемая над выбранной группой, аналогична
операции Edit=>Unparent, произведенной над каждым членом группы. Расформированные члены
группы попадают в подчинение к вышестоящему объекту, если такой существует. Хотя в Option
Box можно задать операции ungroup, чтобы объекты расформированной группы попадали не к
вышестоящей группе, а в мировую систему координат (опция World).
Следовательно, вытащив любой объект из иерархии и бросив его на пустое пространство
в Outliner, мы просто произведем операцию unparent, так как мы бросаем объект как бы в мировое
пространство.
Навигация по группам. Работа с клавиатурой
Клавиатурная навигация по группам и иерархиям в Maya весьма продуманна. Выбрав
объект и нажав стрелку вверх, мы попадаем на родителя этого объекта. Если объект в группе,
то попадаем (а «попадаем» значит «выбираем») на группу, так как она является родителем. Если
же у объекта нет родителя, он просто остается выбранным. Это удобно визуально наблюдать в
Outliner и Hypergraph. Если нажать стрелку вниз, то мы попадем на первый подчиненный объект
(child), то есть "проваливаемся" внутрь группы или иерархии. С большой вероятностью после
нажатия стрелки вниз будет выбрана нода shape объекта (если она у него есть), так как она всегда
подчинена своей ноде transform.
Если же вы хотите перебирать объекты внутри одной группы, не подымаясь на уровень
выше, используйте правую и левую стрелки. Для изменения порядка следования объектов внутри
группы, используйте в Outliner перетаскивание средней кнопкой мыши и бросайте объект в нужное
место между другими объектами. (В Hypergraph используйте среднюю кнопку мыши + Ctrl.)
Так как основным примером иерархии являются скелетоны, то стрелки вверх и вниз
оказывают незаменимую помощь при работе с такими объектами.
Порядок поворотов.
Сделайте небольшое упражнение, чтобы почувствовать смысл и устройство иерархии
объектов.
Создайте три сферы любого типа.
Сделайте первую размером побольше и оставьте в начале координат.
Вторую переместите по оси X, например, в точку (9,0,0), а третью сожмите немного и
88
Книга Сергея Цыпцына
№.
передвиньте в (12,0,0).
Назовите их Sun, Earth и Moon, соответственно (то есть Солнце, Земля и Луна).
Теперь в Outliner перетащите средней кнопкой Moon и бросьте на Earth, затем перетащите Earth
и бросьте на Sun.
Получится иерархия, представляющая из себя простую планетарную систему.
Выберите Sun и покрутите округ оси Y.
Затем нажмите стрелку вниз (попадете на уровень SunShape), а затем стрелку вправо
(будет выбрана Earth, контролируйте выбор в Outliner или Hypergraph).
Также покрутите Earth вокруг любой оси.
Еще одно нажатие на стрелки вниз и вправо приводит к выбору объекта Moon, который
поворачивается вокруг своей оси.
Если еще раз нажать стрелку вниз (чего делать не стоит или не имеет смысла), выбранным
окажется нода shape объекта Moon.
Если вы запутались в стрелках, выбирайте объекты прямо на экране, но перемещение
по иерархии при помощи стрелок с одновременным контролем выбора в Outliner или Hypergraph
поможет вам лучше понять устройство иерархии.
Любители быстрой езды, то есть скоростной анимации, могут выбрать Sun, открыть
Attribute Editor и в первой закладке, в ячейке для rotateY (вторая сверху, вторая слева), написать
=frame/2, а затем нажать Enter.
Теперь выберите Earth и для rotateY напишите =frame*3.
Для Moon.rotateY можно ничего не писать, но если очень хочется, пусть будет =frame*7.
Запускайте анимацию и смотрите на результат. Смысл произведенных заклинаний будет
раскрыт в главе про анимацию. Соответствующие файлы на диске названы planetStart.ma и plan-
etFinal.ma.
Обратите внимание также на следующий момент: если выбрать Sun и повернуть его вокруг
оси X, то результат, возможно, вам не будет интуитивно понятен, ведь плоскость вращения Земли
останется горизонтальной. Чтобы повернуть всю систему целиком, надо использовать ось Z, так
как поворот вокруг мировой оси Z производится после поворота вокруг Y, а поворот вокруг X перед
ним. Чтобы изменить порядок поворотов, можно изменить атрибут Rotate Order в Attribute Editor
в закладке для ноды transform.
Архитектура
89
Самогруппировка. Слоеная иерархическая анимация
В MAYA часто применяется группировка объекта с самим собой, то есть выбирается объект
и выполняется операция Edit=>Group. Зачем? Прежде всего для удобной иерархической анимации.
Дело в том, что в MAYA нет понятия «стэк анимации» в том виде, в котором его используют в
альтернативных конфессиях. Группируя объект сам с собой, вы, попросту говоря, добавляете
объекту новый pivot, вокруг которого или «за который» вы сможете анимировать объект параллельно
с анимацией самого объекта. Таких самогруппировок может быть сколь угодно много, и каждый
раз, к объекту добавляется дополнительная нода transform (с именем Group#), с помощью которой
можно добавлять к объекту очередной «слой» анимации. Надо лишь хорошо представлять себе,
как эти «слои» анимации будут складываться в результирующее движение и заранее планировать
адекватную иерархию. Например, если вы планируете запустить по пути лихорадочно трясущийся
объект, то разумно будет сгруппировать объект сам с собой и группу запустить по пути, а потом
выбрать сам объект и хорошенько потрясти его при помощи expression.
Наглядно говоря, группируя объект или объекты, вы заключаете их в дополнительную
оболочку (которую можете анимировать как угодно), эту оболочку можете заключить еще в одну
оболочку и т.д.
Инстансирование или подстановки.
Поверхности с общей формой. Один потомок у семи родителей
При дублировании объектов по умолчанию создается копия как ноды transform, так и ноды
shape, то есть дублируется вся иерархия; в случае группы дублируется вся группа.
В свете вышеизложенного возможен вопрос: а можно ли скопировать только transform, a shape
оставить как бы один на двоих?
Geometty Туре С Сору & Instance
Graupundef (* Patent С World <~ Ni^ Group
Г" Smart Transform
Действительно, в Option Box операции Duplicate для параметра Geometry Type можно
выбрать вместо Сору опцию Instance (подстановка).
Если при такой установке Geometry Type скопировать, например, полигональный куб,
то, изучив Outliner или Hypergraph, можно определить, что скопировался только transform,
определяющий положение копии объекта, а вот shape-нода, определяющая форму объекта,
осталась «одна на двоих», то есть не скопировалась, а присутствует, одна и та же, в каждом из
объектов.
90
Книга Сергея Цыпцына
Парадоксальная ситуация - у одного потомка несколько родителей! Тем не менее, это
так, и в разных местах пространства, определяемых атрибутами различных transform-нод,
визуализируется одна и та же форма, описываемая атрибутами одной ноды shape. Если вы
попробуете изменить форму куба, например, перетаскивая его за вершины, то увидите, что набор
точек у двух кубиков один на двоих, и он просто визуализируется в разных местах. Такие копии
объектов принято называть инстансами, подчеркивая их зависимую от оригинала форму.
Очевидно, что если отредактировать на экране форму одного из кубов, то форма второго
тут же изменится. Более того, выделив вершины на одной поверхности, вы увидите, что на другой
они тоже выделены. Это еще раз подчеркивает, что положение в пространстве (transform) у
объектов разное, а форма (shape) - одна.
Примечание. Никакой галочки или кнопочки типа «Превратить инстанс в
нормальную копию» не существует. Можете просто скопировать объект в режиме
по умолчанию и удалить исходный объект.
Длинные и короткие прозвища.
Полный путь к объекту. Уникальные имена
Внутри разных групп объекты могут иметь одинаковые имена. Это действительно удобно,
когда у вас есть, например, набор персонажей, и у каждого из них конечности называются
одинаковыми «человеческими» именами (типа «left_hand» или «right_foot»). В таком случае надо
уточнить понятие «имя объекта». Если два объекта имеют одинаковые имена в разных группах,
уникальное имя объекта включает в себя полный «путь» до объекта по иерархии, то есть имя
самого объекта и имена всех его родителей.
Например, если создать полигональную сферу, потом сгруппировать ее (Ctrl-g), а затем
сдублировать (Ctrl-d), то получится две группы, внутри каждой из которых находятся объекты с
одинаковыми именами pSpherel. Выбор на экране любой из этих сфер приводит к появлению в
Script Editor команд
select -г group21 pSpherel ;
или
select -г groupl | pSpherel .
Архитектура
91
Вертикальная черта «|» является разделителем между именем объекта и «путем» до
объекта по иерархии.
MAYA сама отслеживает формирование нужных имен и путей, однако в некоторых случаях
необходимо учитывать наличие одинаковых имен объектов в сцене. Например при написании
expression для вышеописанной сцены необходимо писать
groupl |pSpherel.ty = sin(time)+ .. ;
так как обращение «pSpherel.ty» вызовет ошибку, связанную с неоднозначным обращением сразу
к двум объектам.
Также об этом необходимо помнить при создании элементов интерфейса (например,
кнопок на полках), выбирающих объект или ставящих ключи на определенные атрибуты.
В нашем случае команда
select -г pSpherel ;
// Error: More than one object matches name: pSpherel //
также приводит к сообщению об ошибке, и должна выглядеть как
select -г groupl | pSpherel ;
Чаще всего одинаковые имена возникают при дублировании групп объектов и это вполне
разумно. Однако иногда хочется избежать появления одинаковых коротких имен в сцене (например,
при экспортировании в другие программы). Для этого в Option Box операции Duplicate существует
галочка Assign Unique Name to Child Node.
Г Duplicate Input Graf
Г" Duplicate Input Connections
Г" Instance Leaf Nodes
P [Assign Unique Name to Child Nodes:
N """
Для быстрого переименования всей иерархии целиком также будет полезна операция
Modify=>Prefix Hierarchy Names, позволяющая быстро добавить к именам всех объектов в группе
одинаковый префикс.
Sets и Partitions. Фиктивные наборы и эксклюзивные партии.
Списки для быстрого выбора.
Иногда вы можете столкнуться с понятием сета (set) и раздела (или партиции, partition).
Можно представить сет не как объект, а как список входящих в него составляющих (хотя, как вы
понимаете, сет представлен в сцене нодой собственного типа, objectSet).
Можно выбрать в сцене некоторое количество объектов и /или компонент (например,
вершин полигона или точек латтиса) и объединить их в сет. В отличие от группы, при создании
сета не создается новой ноды transform, новый сет никак не меняет иерархию сцены, его нельзя
двигать или вращать. То есть сет - это формальный список компонент или объектов. Более того,
при удалении сета удаляется только список, сами же объекты из списка остаются в целости и
сохранности.
92
Книга Сергея Цыпцына
Чаще всего сеты создаются самой MAYA для своих служебных целей. Например, при
создании деформера автоматически появляется новый сет, содержащий список компонент,
на который этот деформер действует. Если вы назначаете материал на некоторое количество
объектов или, к примеру, граней поверхности, то создается новый сет, хранящий имена этих
объектов/граней, который MAYA будет в дальнейшем использовать. При изменении материала
объекты просто переносятся в другой список, то есть сет. (Те самые, загадочные Shaging Groups,
появляющиеся в Attribute Editor - это просто специальный тип сетов).
Точно так же, когда вы редактируете количество точек, подверженных влиянию какого-
либо деформера с помощью Edit Membersip Tool, вы просто переносите компоненты из сета в
сет.
Иногда вам захочется создавать сеты самому. Например, для быстрого выбора некоторого,
иезуитски расположенного набора вершин, который проще запомнить в сет один раз, а потом уже
выбирать одним махом.
Именно для выбора существуют специальные списки-сеты по названием Quick Selection
Sets. Создать их можно через меню Create=>Sets=>Quick Selection Set... Быстро выбирать созданные
таким образом сеты можно с помощью меню Edit=> Quick Selection Sets.
Для взрослых. Quick Selection Sets отличаются от остальных сетов только
значением атрибута annotation. А в остальном, это такие же сеты, создаваемые
через меню Create=>Sets=>Set. Вы можете легко убедиться в этом, посмотрев, что
тип ноды для всех сетов - это objectSet.
Иногда необходимо, чтобы члены двух сетов не пересекались между собой. Например, на
один объект не может быть назначено два материала. В этом случае MAYA предусматривает создание
разделов, или partitions (мне представляется, что проще говорить: «партиций»). Партиции могут
содержать в себе только сеты, и при этом, если два сета входят в одну и ту же партицию, то это
гарантирует, что они не будут иметь общих членов. (Именно для этого существует, например,
глобальная renderPartition). В этом случае сеты называются эксклюзивными. При создании
любого деформера в Option Box в закладке Advanced есть галочка Exclusive, позволяющая сделать
так, чтобы компоненты, на которые деформер будет влиять, не подвергались влиянию других
деформеров. Для этого создается partition, указанная в поле Partition То Use.
Еще раз подчеркну, что сеты - всего лишь списки, удаляя которые вы не трогаете сами
объекты или компоненты.
Примечание. Если речь идет об объектах, а не о компонентах, то вместо сетов
для быстрого выбора (Quick Selection Sets) удобно использовать слои (layers). Они
также позволяют быстро выбирать объекты, входящие в слой, прятать их,
выделять другим цветом и т.д. Кроме того, слои находятся всегда под рукой, в
Channel Box.
Архитектура
93
Отредактировать содержимое сетов и партиций можно через соответствующий
отношений», находящийся по адресу Windows=>Relationship Editors.
«редактор
О пространствах. И локальных осях
Если вы откроете настройки Move Tool, то увидите, что объект можно передвигать в
различных пространствах (spaces) (или в различных системах координат, и пусть в рамках этой
книги это будет одно и то же). С мировым пространством все понятно - передвигаем объект вдоль
мировых осей координат, и в Channel Box появляются соответствующие значения атрибутов
translate, соответствующие смещению вдоль мировых осей.
Интуитивно понятно, что внутри объекта тоже существуют некие оси координат
(соответствующие, например, осямусповной симметрии), «вмороженные» в объект и определяющие
«пространство объекта» (object space). Если объект слегка развернут и в настройках Move Tool
выбрано Object Space, то перемещение вдоль одной из этих осей (то есть в пространстве объекта)
вызывает изменение всех трех атрибутов translate в Channel Box. Из чего можно заключить, что
в Channel Box всегда отображаются координаты в мировом пространстве. Строго говоря, это
не совсем так, потому что атрибуты translate содержат координаты в пространстве «родителя»
94
Книга Сергея Цыпцына
№
(которое называют локальным пространством, или local space). Но если объект не находится
в группе (то есть у него нет родителя), то формальным родителем для него является мировое
пространство, поэтому атрибуты translate в Channel Box содержат мировые координаты. Термин
«локальное пространство» для обозначения пространства вышестоящего объекта, на мой взгляд,
не слишком удачен, так как ассоциативно путается с пространством самого объекта («parent
space» было бы субъективно удачнее). Таким образом, опция local в Move Tool Settings имеет
смысл только тогда, когда объект находится внутри иерархии, в противном случае локальное
пространство (local) совпадает с мировым (world).
Внутри объекта существуют еще и локальные оси вращения (Local Rotation Axes), которые,
однако, не задают никакой системы координат, а просто определяют оси внутри объекта, вокруг
которых будут производиться вращения с помощью Rotate Tool. Эти оси могут не совпадать с осями
координат «объектного пространства», и представляют из себя просто компоненты объекта (или
атрибуты transform-ноды), которые можно выбрать и повернуть в режиме выбора компонент.
;| Subdivsj Deformation | Animation | Dynamics] Rente И Local Relation Axes I j(j$
— 1 D Image Planes [—
J mel в md , >
ph head *W U^
els
В настройках Move Tool в новых версиях MAYA появились дополнительные опции,
разворачивающие манипулятор перемещения в различных направлениях, в том числе вдоль
«вращательных осей» или вдоль выбранного ребра.
Итак, для любого объекта всегда существует мировое пространство (world space),
пространство объекта (object space) и локальное пространство (local space, или пространство
родительского объекта). Есть еще параметрическое пространство, определенное для NURBS-
кривых и поверхностей, но о нем мы поговорим в соответствующей главе.
Сброс и заморозка (Reset и Freeze).
Новое место рождения объекта. Разворот локальных осей
Любой объект где-то рождается, то есть создается. Если в результате безумных
перемещений и поворотов, вы «угнали» объект в какое-нибудь экзотическое положение и хотите
его быстро вернуть в место рождения и к прежним размерам, можно выполнить операцию Mod-
ify->Reset Transformations. Это аналогично «вбиванию» в Channel Box нулей для атрибутов
translate и rotate и единиц для атрибутов scale. (В Option Box операции Reset Transformations есть
соответствующие галочки для каждого из этих атрибутов.)
Архитектура
95
Операция Modify->Freeze Transformations тоже «вбивает» нули и единицы в Channel Box, но
при этом не меняет положение объекта. Иначе говоря, Freeze Transformations определяет текущее
положение (плюс повороты и размер), как новое место рождения объекта. В результате выполнения
этой операции объект остается на месте, в Channel Box у него появляются одни нули и единицы,
а локальные оси смотрят вдоль мировых осей, то есть как будто объект только что был создан на
этом месте, так что он будет возвращаться в это положение после Reset Transformations. Операция
Freeze Transformations часто используется для разворота локальных осей в нужном направлении
(в Option Box этой операции также есть соответствующие галочки для translate, rotate, scale).
Связи между атрибутами. Работа с Connection Editor.
Полное имя атрибута. Типы атрибутов. Совместимые атрибуты.
Красивые и настоящие имена атрибутов
После того, как мы рассмотрели «родовую» связь между transform и shape, можно с
облегчением вздохнуть и поговорить о «нормальных» связях, то есть о связях между атрибутами
объектов.
Создайте несколько цилиндров, разбросайте их в пространстве или откройте файл train-
Start, та. Попробуем соединить вращения двух колес.
Для связывания между собой атрибутов объектов чаще всего используется Connection
Editor. Откройте Windows=>General Editors=>Connection Editor. Две панели открывшегося окна служат
для отображения атрибутов объектов. В отличие от Attribute Editor, объекты надо загружать в
Connection Editor вручную.
96
Книга Сергея Цыпцына
Выберите первое колесо (wheeM) и нажмите кнопку Reload Left, затем выберите второе
колесо (wheel_2) и нажмите кнопку Reload Right.
В обеих панелях Connection Editor появятся атрибуты объектов. Количество отображаемых
по умолчанию атрибутов может слегка подавлять неподготовленных исследователей...
Весьма разумно спрятать огромное количество служебных атрибутов, для этого в меню
Connection Editor снимите галочки Left Display=>Show Non-Keyable и Right Display=>Show Non-Key-
able. Это приведет к тому, что в панелях останутся только анимируемые атрибуты, которые нас
как раз и интересуют.
Раскройте с обеих сторон аттрибуты Rotate, нажав на плюс рядом с именем атрибута.
Выберите слева RotateX, а затем RotateX справа.
В момент выбора RotateX справа произошло связывание атрибута rotateX объекта wheel_2
с атрибутом rotateX объекта wheeM.
Отвязать атрибут (то есть «отсоединить» его, сделать независимым) можно, снова нажав
на RotateX справа. Повторное нажатие как бы переключает состояние «связанности».
Проделайте операцию связывания для атрибутов rotateY и rotateZ обоих цилиндров. При
выборе атрибутов слева в правой панели подсвечиваются атрибуты, связанные с ними.
Курсивом в Connection Editor выделяются атрибуты, имеющие связи с другими атрибутами.
Кроме того, нажав правую кнопку мыши над именем атрибута, можно увидеть список связанных с
ним атрибутов.
Архитектура
97
Совет. Взрослые мальчики вместо Connection Editor могут использовать MEL-
команду connectAttr. Тогда не понадобится открывать окна, выбирать нужные
объекты, загружать их в соответствующие части Connection Editor - достаточно
выполнить всего одну команду и получить тот же результат! Нужно только знать
точные имена объектов и атрибутов. Для случая описанных выше вращений колес
команда будет выглядеть следующим образом:
connectAttr -f wheeM .rotateX wheel_2.rotateX;
Покрутив первое колесо, можно увидеть, что второе вращается синхронно с ним. Попытка
покрутить второе колесо будет безуспешной, так как атрибуты rotate второго колеса теперь
несвободны и намертво связаны с атрибутами первого колеса. Об этом также свидетельствует
желтый цвет значений атрибутов в Channel Box. (Желтый обозначает прямую связь с атрибутами
другого объекта.)
Это ключевой момент для понимания сути происходящего: мы связали не два объекта, а
атрибуты объектов. Можно сказать, что вращение второго колеса связано с вращением первого,
но нет смысла говорить, что второй объект присоединен к первому, если не уточнять, каким
способом и через какие атрибуты он связан с ним.
Не закрывайте Connection Editor, выберите оба колеса и откройте Hypergraph, в меню
которого выполните Graph=>lnput And Output Connection.
Для того, чтобы быстро наехать на выбранные объекты, нажмите клавишу f. Отъехав
немного, вы увидите оба колеса, связанные стрелками-связями.
Наведя курсор мыши на любую из этих стрелок, можно прочитать «расшифровку» этой связи.
Слева всегда обозначен «источник» (в данном случае wheeM .rotateX), а справа - «принимающий»
атрибут (в данном случае wheel_2.rotateX).
98
Книга Сергея Цыпцына
Напомню, что wheel_2.rotateX - это полное имя атрибута, состоящее из имени объекта и
имени атрибута, однозначно определяющее значение атрибута в сцене.
Связь можно выбрать, щелкнув по ней мышкой, а затем удалить, нажав клавишу Delete. Это
равносильно разъединению атрибутов в Connection Editor. Выбирать много связей одновременно
нельзя, поэтому придется щелкать и удалять каждую из них.
Совет. Двойной щелчок по связи вызывает Connection Editor с загруженными в него
соответствующими объектами.
Вернемся в Connection Editor. Опытным путем можно установить, что атрибут Scale слева
нельзя присоединить к атрибуту ScaleX или TranslateY справа. Дело в том, что эти атрибуты
несовместимы. Оказывается, атрибуты объектов могут быть разных типов. В данном случае scaleX
или translateY - это простые числовые атрибуты (double), a scale - это «тройной» атрибут, то есть
набор из трех чисел (double3). Атрибуты могут быть простыми числовыми, составными (compound,
то есть содержащими наборы данных), строковыми (string, то есть содержащими текст), матрицами
и пр. Количество типов атрибутов исчисляется десятками, и их можно найти в описании команды
setAttr.
Как нетрудно убедиться, в Connection Editor можно соединить только совместимые между
собой атрибуты. К типам атрибутов мы еще вернемся, а сейчас нас интересуют простые числовые
атрибуты, или атрибуты, содержащие три числа.
Для взрослых. Можно всегда посмотреть тип атрибута с помощью команды getAt-
tr с флагом -type, например:
getAttr -type wheeM .scaleX;
// Result: double //
getAttr -type wheeM.scale;
// Result: double3 //
getAttr -type phongl .color;
// Result: float3 //
getAttr -type phongl.colorR;
// Result: float //
Попробуйте сейчас соединить совместимые атрибуты Translate слева и справа, но тогда
второе колесо «прилипнет» к первому, поскольку позиция первого колеса просто будет копироваться
в позицию второго.
Отсоединение не поможет вернуть колесо на место, так как разъединится только связь
между атрибутами, но последние значения атрибутов останутся неизменными. Для отмены
неудачных экспериментов лучше воспользоваться Undo. Можете соединить между собой атрибуты
Scale и убедиться в Hypergraph, что цвет связи в Hypergraph зависит от типа соединяемых
Архитектура
99
атрибутов.
Примечание. Составные атрибуты (compound attributes) - например, Rotate -
содержат в себе простые атрибуты RotateX, RotateY, RotateZ. Такая организация
сделана для удобства соединения групп атрибутов между собой. То есть
соединение атрибутов Rotate двух объектов между собой почти равносильно
последовательному соединению пар атрибутов RotateX, RotateY, RotateZ этих
же объектов. «Почти» означает, что соединение «тройных» атрибутов Rotate
имеет более высокий приоритет, чем попарное соединение RotateX, RotateY и
RotateZ. Проверьте сами.
Некоторая чехарда с маленькими и большими буквами в названиях атрибутов связана с тем,
что реальные имена атрибутов всегда начинаются с маленькой буквы (rotateY, visibility). Но в
Connection Editor, Attribute Editor и даже в Channel Box имена атрибутов отображаются в «эстетичном»
стиле, то есть с большой буквы. Сильного вреда это не приносит, однако при использовании MEL-
команд, работающих с атрибутами, необходимо использовать реальные имена, так как применение
«красивых» имен, запомненных при работе с интерфейсом, приводит к сообщениям об ошибке.
Настоятельный совет. Установите в Channel Box режим отображения реальных
длинных имен атрибутов, чтобы глаз привыкал к настоящим именам, «как у
взрослых»: Channels=>Channel Names=>Lonsi.
Чтобы быстро соединить вращение первого колеса со всеми остальными, загрузите в левую
панель первое колесо, если оно еще не там.
Потом выберите все остальные колеса и нажмите Reload Right.
Далее, выбрав Rotate слева, прощелкайте все Rotate справа.
Покрутите первое колесо, остальные должны вращаться синхронно с ним.
В Hypergraph снова выполните Graph=>lnput And Output Connection. Теперь от первого
колеса исходят несколько связей с остальными объектами. Интуитивно понятно, что от одного
атрибута могут исходить несколько связей, но входящая в него связь может быть только одна.
100
Книга Сергея Цыпцына
Дяя взрослых. В некоторых случаях (например, при использовании Set Driven Key),
возникает ситуация, когда несколько атрибутов влияют на один атрибут. В этих
случаях автоматически создается нода blendTwoAttr (смеситель атрибутов), на
вход которой подаются значения входящих атрибутов, а выход присоединяется
к зависимому атрибуту. Тем не менее, входящая в атрибут связь всегда может
быть только одна.
Непрямые связи. Функция Set Driven Key.
Определение интеллектуальных зависимостей между
атрибутами без программирования. Расширение сознания.
Понятно, что соединять можно не только атрибуты с одинаковыми именами, но в принципе
любые атрибуты, лишь бы они были совместимы по типу. Проделайте еще одно упражнение,
расширяющее сознание.
Создайте полигональную сферу.
Откройте Connection Editor и загрузите ее в левую панель.
Допустим, что вас мучает параноидаьная идея, состоящая в том, что размер сферы должен
влиять на ее же цвет. Цвет сферы определяется атрибутами материала, который ей присвоен. В
нашем случае это материал по умолчанию lambertl. Осталось загрузить его в правую часть
Connection Editor.
Проще всего это сделать через Attribute Editor, в котором нужно выбрать последнюю
закладку, соответствующую материалу сферы, и нажать внизу кнопку Select. Так как в Attribute
Editor отображаются закладки для всех объектов, связанных с выбранным объектом какими бы то
ни было связями, то эта кнопка позволяет выбрать конкретный объект, а точнее - ноду (в данном
случае материал), соответствующую данной закладке.
Нажмите Reload Right в Connection Editor, чтобы справа появились атрибуты материала.
Затем слева выберите Scale, а справа Color.
Готово! Теперь осталось лишь выбрать Scale Tool и неистово менять размер сферы, наблюдая
наличие очевидной зависимости между размером и цветом объекта. Изменение размера вдоль
Архитектура
101
каждой оси может дать интересную трехмерную интерпретацию цветового пространства. Но вот
проблема: все это работает в диапазоне размеров от нуля до единицы, а при больших масштабах
сфера пересвечивается и становится одинаково белой. Встает вопрос, как сделать связь между
атрибутами не такой, мягко говоря, прямолинейной и, грубо выражаясь, не такой тупой?
Представьте, что сфера - это брюхо комара, которое должно при увеличении в размере
одновременно краснеть, и даже, быть может, становиться более прозрачным. По-человечески
сформулировать задание можно так: если сфера небольшая (например, scale=0.5, то есть «комар
голоден»), то цвет ее должен быть темно-коричневый, а если сфера огромная (scale=3.0, то есть
«комар сыт»), то цвет ярко-красный.
Чтобы создать такую интеллектуальную связь, быстро воспользуемся функцией Set Driven
Key и посмотрим, как это все выглядит в Hypergraph.
В Connection Editor (или в Hypergraph) разорвите связь между Scale и Color.
В Attribute Editor сделайте цвет сферы темно-коричневым.
Нажав правую кнопку на атрибуте Color, выберите в выпавшем меню Set Driven Key.
Откроется окно Set Driven Key, которое похоже на вертикально расположенный Connection
Editor. В нижней части, где должен находиться управляемый (driven) или зависимый объект, уже
загружен материал larnbertl и даже выбран атрибут colorR.
Выберите сферу и нажмите кнопку Load Driver.
Когда наверху появятся атрибуты сферы, выберите scaleX - именно он и будет «рулить»
цветом. В отличие от Connection Editor, никого соединения еще не произошло.
Смысл функции Set Driven Key состоит в том, чтобы не только выбрать соединяемые
102
Книга Сергея Цыпцына
№
атрибуты, но и задать их значения, а потом «зафиксировать связь» в таком положении (то есть
если pSpherel .scaleX=0.5, то lambertl .colorR=0.1), затем изменить значения этих атрибутов и снова
«зафиксировать связь» в новом положении (если pSpherel.scaleX=3.0, то lambertl.colorR=0.95).
После этого MAYA будет сама пересчитывать значения scale в значения для color в соответствии с
заданной зависимостью.
Подробнее мы поговорим о Set Driven Key в главе про анимацию.
А сейчас установите scaleX сферы равным 0.5, убедитесь, что в верхней части окна Set
Driven Key выбран scaleX, а в нижней colorR, и нажмите кнопку Key (зафиксировать).
Теперь сделайте scaleX равным 3.0, а цвет материала ярко-красным (именно в такой
последовательности), а потом снова нажмите кнопку Key.
Все! Можно снова выбрать Scale Tool, чтобы изменить размер сферы. Теперь цвет сферы
меняется только при изменении scaleX в диапазоне от 0.5 до 3.
Поскольку цвет пока что зависит только от scaleX, пытливые умы могут сами проделать
установку Set Driven Key для scaleY и scaleZ, причем выбирая в нижней панели не только colorR,
но и colorG, и colorB. А неутомимые исследователи могут повторить эту процедуру еще и для
прозрачности материала, то есть для атрибута transparency.
Дальше. Выберите сферу и тут же идите в Hypergraph.
Выполните Input And Output Connection.
Проанализируйте следующую картину: между сферой и материалом теперь находится
некая нода (lambertl_colorR), которая «корректирует» зависимость между pSpherel.scaleX и
lambertl.colorR.
pSpherel.scaleX сначала попадает на вход (input) этой ноды, которая проводит некоторые
вычисления с этим атрибутом, а результат, то есть выход (output) пойдет уже на lambertl .colorR.
Помните, что «майскую» сцену можно представить себе как поток данных, бегущий
по стрелкам-связям в Hypergraph. При изменении атрибутов где-нибудь в середине потока
(например, pSpherel.scaleX ) происходит автоматическое обновление всех данных, находящихся
«ниже по течению», как указано стрелками. Формально говоря, обновляется нижняя часть дерева
зависимостей (downstream graph).
Если выбрать ноду lambertl_colorR прямо в Hypergraph, то, естественно, ее можно
рассмотреть в Attribute Editor. Это просто анимационная кривая, которая также является объектом
в MAYA, и она ничем не лучше и не хуже остальных объектов. У нее свой набор атрибутов,
определяющих ее свойства и свое представление в Attribute Editor. Любопытствующие умы могут
рассмотреть ее подробнее в Window->Animation Editors->Graph Editor...
Архитектура
103
Функция Set Driven Key является мощнейшим средством для задания нужных связей
между атрибутами объектов, так как позволяет задавать практически любые зависимости, не
прибегая к программированию формул или сложным вычислениям. Более того, эти связи между
атрибутами имеют прекрасное визуальное представление в Graph Editor и могут быть интерактивно
отредактированы в любой момент.
Результаты проделанных выше действий сохранены в файле sdk.ma.
Анимация. Связь атрибутов с временем.
Анимационные кривые как объекты сцены.
Анимация и деформация времени
Продолжим работу с деревом зависимостей. Посмотрим, что происходит при анимации.
Выберите сферу, встаньте в первый кадр и нажмите shift-r - это поставит ключ на атрибуты
scale. Встаньте в двадцатый кадр, измените размер сферы и снова нажмите shift-r.
Встаньте в сороковой кадр, еще раз измените размер сферы и снова нажмите shift-r.
Проиграйте анимацию и обратите внимание, что меняется не только размер объекта, но и цвет
материала, хотя от времени зависит только атрибут scale, на который мы ставили ключи.
Вернемся в Hypergraph. Как обычно, нажимаем кнопку Input And Output Connection. Видим,
что в наше дерево добавились еще три ноды, которые присоединяются к атрибутам scale сферы.
Это анимационные кривые, задающие зависимость атрибутов scale от времени.
104
Книга Сергея Цыпцына
Таким образом, анимационные кривые - посредники между временем и объектами. Это
просто ноды, имеющие один входной атрибут и один «выходной» атрибут. На входе они получают
значения времени, потом проводят вычисления результата на основе формы кривой (которая,
как можно догадаться, определяется набором атрибутов этой кривой) и передают результат на
выходной атрибут, который присоединен к атрибутам анимируемого объекта.
Если вы пока еще ориентируетесь в этих дебрях (если же нет, просто откройте файл sdk-
Final.ma), можете проделать следующий эксперимент.
Нажмите shift, а затем перетащите средней кнопкой анимационную кривую pSphere1_scaleY
и бросьте ее на ноду pSpherel.
Откроется Connection Editor с загруженными в нужном порядке нодами. Если у pSpherel_
scaleY не видно никаких атрибутов, включите галочку Left Display=>Show Non-Keyable.
Соедините атрибут Output слева (он последний) и атрибут translateY справа.
Проиграйте анимацию. Теперь сфера не только раздувается, но и перемещается по
вертикали, хотя мы не ставили никаких ключей, а всю работу сделали во «внутренностях» AAAYA.
Кроме того, одна анимационная кривая управляет сразу двумя атрибутами, чего невозможно
было бы добиться, расставляя ключи традиционным способом. Хотя, как вы понимаете, того же
результата (то есть синхронизации scaleY и translateY) можно было бы добиться, соединив scaleY
и translateY в Connection Editor.
Для взрослых. Пытливые умы наверняка тут же возопят: «А почему мы не видим
в Hypergraph связи между анимационными кривыми и временем?». Действительно,
время в MAYA тоже является объектом. Его зовут timel, и он имеет атрибут out-
Time, содержащий значение глобального времени в кадрах. Вы можете разыскать
и выбрать его в Outliner, если снять галочку Display=>DAG Objects Only. Можете
рассмотреть его в Attribute Editor. Но в Hypergraph его связь с анимационными
кривыми не показана, хотя в неявном виде она существует. Точнее говоря, если к
атрибуту input анимационной кривой ничего не присоединено, на него в этом случае
подается значение timel.outTime. Кстати, вы всегда можете увидеть атрибут
input в Channel Box, просто сделав его keyable через Channel Control. Более того,
Архитектура
105
шшш
можете ставить на него ключи, тем самым «деформируя» глобальное время и
добиваясь эффекта искажения времени (time-warpin%).
Вывод номер один
Таким образом, можно обозначить концепцию, к которой мы еще не раз будем возвращаться:
чтобы эффективно работать с объектами и связями в MAYA, необходимо знать тип и назначение
атрибутов этих объектов.
Вот этим мы как раз сейчас и займемся.
Типы атрибутов и их назначение.
Анимируемость и совместимость атрибутов.
Интеллектуальные атрибуты. Мешки чисел
До сих пор мы экспериментировали с простыми числовыми атрибутами, которые определяют
довольно очевидные и вполне «осязаемые» свойства объектов, такие как цвет, размер, положение.
Есть подозрение, что у любого объекта (точнее, у составляющих его нод) существует еще много
всяких атрибутов, определяющих и другие, не столь наглядные свойства. Например, будет ли
объект появляться в отражениях или отбрасывать тень - это тоже определяется соответствующими
атрибутами. Когда вы прячете объект (Display=>Hide=>Hide Selection), вы всего лишь меняете
значение атрибута visibility, который определяет видимость объекта в сцене.
Числовые атрибуты можно условно разделить на некоторые типы в зависимости от типа
данных, которые они содержат: целые числа (integer), числа с плавающей точкой (float) и логические
значения (bool) типа on/off (которые на самом деле являются числами 0/1). Об этом необходимо
помнить, так как вы можете без труда соединить в Connection Editor атрибут с плавающей точкой
и целый атрибут, но потеря дробной части при этом будет совершенно предсказуема.
Как правило, числовые атрибуты позволяют себя анимировать - то есть менять значение
в зависимости от времени. Если вы не видите атрибута в Channel Box, это еще не означает, что
его не существует: просто он может быть неанимируемым (non-keyable). Анимируемость (key-
able) - это не тип, а скорее статус числового атрибута, который всегда может быть изменен через
Windows=>General Editors=>Channel Control.
Рассмотрим теперь некоторые атрибуты, которые не являются обычными числами. Назовем
их пока просто данными. (Ну как, заинтригованы?)
Создайте полигональный куб и полигональную сферу.
Выберите оба объекта, откройте Hypergraph и нажмите Input And Output Connections.
Сейчас нас интересуют shape- ноды обоих объектов, определяющие их форму.
106
Книга Сергея Цыпцына
№
pCubeShapel имеет связь с нодой polyCubel, которую можно также увидеть в закладках Attribute
Editor (помня о том, что в Attribute Editor показываются все ноды, хоть как-то связанные с выбранным
объектом). Нода polyCubel, как написано в документации, просто создает полигональный куб в
соответствии со своими атрибутами width, height, depth.
Вопрос - что значит «создает»? Ведь куб создается операцией Create->Polygon Primi-
tives->Cube или командой polyCube в Script Editor. Дело в том, что нода polyCubel вычисляет
все необходимые данные для построения полигонального куба (координаты вершин, грани и
нормали). Можно сказать, что она «вычисляет» куб, а результат этого вычисления (то есть данные,
определяющие куб) складывает в один «большой» атрибут, который называется output, и хранит
в себе все эти данные в виде, условно говоря, «мешка чисел». При соединении этого атрибута
с атрибутом inMesh ноды pCubeShapel, этот «мешок чисел» моментально «приезжает» в ноду
pCubeShapel, которая, собственно, и визуализируется на экране. Разумно предположить, что тип
атрибута inMesh при этом совпадает с типом атрибута output ноды polyCubel.
Чтобы проверить эти рассуждения, удалите связь между pCubeShapel и polyCubel или
вообще удалите polyCubel (только не забудьте потом вернуть все обратно при помощи Undo). Куб
не исчезнет, но данные, содержащиеся в атрибуте inMesh и определяющие форму куба, теперь не
зависят от ноды polyCubel и просто имеют какие-то значения.
Но ведь для сферы ситуация аналогична, и «вычислитель» сферы polySpherel тоже отдает
результат своих вычислений в атрибут inMesh ноды pSphereShapel.
Итак, экспериментируем. Скрестим куб и сферу. Нажимаем shift, тащим средней кнопкой
мыши ноду polySpherel и бросаем ее на pCubeShapel.
Архитектура
107
Открывается Connection Editor с уже загруженными нодами. И слева и справа (в Left
Display и в Right Display) должна быть галочка в Show Non-КеуаЫе. Слева ищем и выбираем Output, а
справа - inMesh.
На экране получаем две одинаковые сферы, а в Hypergraph следующую картину:
Если нас что и смущает, так только названия объектов. Но можно переименовать
pCubeShapel и pSphereShapel в, например, meshl и mesh2, и тогда все встанет на свои места.
Вычислитель сферы polySpherel отдает вычисленные данные через атрибут inMesh в ноды meshl
и mesh2, которые отвечают за построение и визуализацию полигональных сеток.
Таким образом, связи между нодами существуют не только для очевидных числовых
атрибутов, но и для более «интеллектуальных» и сложных типов атрибутов, способных передавать
целые «мешки» чисел-данных.
Выше уже прозвучало неявное определение типов атрибутов. Остается лишь подытожить
и сформулировать, что атрибуты бывают разных типов, причем не только числовых, но и более
сложных, что непостижимо для обычного, нерасширенного сознания. Чтобы два атрибута можно
было соединить (например в Connection Editor), они должны быть совместимы, то есть принадлежать
к одному типу. Именно поэтому при выделении в Connection Editor какого-нибудь атрибута слева,
справа становятся доступными лишь совместимые с ним атрибуты, готовые к соединению.
Динамические атрибуты. Статические атрибуты.
Добавление и удаление собственных атрибутов.
Повышение уровня абстракции и очеловечивание объектов
Когда читаешь в документации про динамические и статические атрибуты, становится
немного не по себе. Чудится, что можно спутать их с динамикой или статическими каналами в
108
Книга Сергея Цыпцына
№
анимации. На самом деле все проще.
Все атрибуты, которые вы видите, создав очередной объект, в Attribute Editor или в
Channel Box (ну, хорошо: почти все) - это статические атрибуты, которые нельзя ни удалить,
не переименовать. Самое удивительное, что к любому объекту (точнее, к любой ноде) можно
добавлять свои атрибуты! Они-то и называются динамическими, так как их потом можно удалить
или переименовать.
«А зачем это нужно?» - спросят еще недостаточно искушенные умы. Зачем добавлять
атрибуты, когда и в существующих разобраться невозможно? Действительно: ведь добавив свой
атрибут к объекту, мы просто получим новую цифру в клеточке в Channel Box или числовое поле в
разделе Extra Attributes в Attribute Editor.
Это можно сделать, выбрав объект, а затем выполнив Modify=>Add Attribute.
Возникнет окно, где следует ввести имя для нового атрибута и выбрать его тип данных,
которые он будет содержать (это может быть не только число, но строка или даже вектор). Можно
также задать диапазон изменений значения атрибута и значение по умолчанию, которое будет
присвоено при создании атрибута.
Будьте внимательны: атрибут добавляется к выбранному объекту, а не к ноде, закладка
которой активна в Attribute Editor. Имя объекта, к которому добавляется атрибут, всегда
высвечивается в заголовке окна Add Attribute.
Нажав OK (или Add и Close), вы добавите новый атрибут, который можно будет найти в Attribute
Editor в последнем разделе Extra Attributes.
Повторюсь: всегда контролируйте, какая нода выбрана, перед тем как добавлять свои
атрибуты. Потом будет легче их разыскать.
Примечание. Чтобы сэкономить время, можно добавлять атрибуты к нодам
непосредственно в Attribute Editor. Для этого нужно воспользоваться меню
Attributes=>Add Attribute... При этом все равно придется помнить, какая нода и
какой объект выбраны в данный момент.
Итак, зачем же нам дополнительные цифры в клетках, от которых ничего не зависит?
Зачем навешивать на объект дополнительные данные?
Оказывается, что на практике возможность добавлять новые, собственные атрибуты
невообразимо удобна. При этом сразу после добавления новые атрибуты в самом деле ни на что
не влияют. Однако с помощью expression или функции Set Driven Key вы можете задать логическую
связь между значением новых атрибутов и остальными атрибутами, определяющими реальные
свойства.
Например, вы можете добавить к вашему скелету новый атрибут closeFingers. А затем,
с помощью функции Set Driven Key, задать связь между ним и атрибутами rotate всех костей,
определяющих пальцы персонажа. Причем задать связь так, что для closeFingers=0 все пальцы
согнуты в кулак, а при closeFingers=1 все пальцы выпрямлены. После этого можно анимировать
только атрибут closeFingers, чтобы сжимать и разжимать кулак у персонажа. Об этом я еще
поговорю подробнее в главе про анимацию персонажей, а сейчас лишь замечу, что добавление
собственных атрибутов позволяет привнести в сцену новый уровень абстракции и на приемлемом,
«человеческом» языке задать новые понятия для управления персонажами и вообще объектами.
Кроме того, в добавленных атрибутах вы можете хранить свои данные, необходимые
вам для последующей работы (например, амплитуду колебаний объекта, анимированного с
помощью expression). Вы можете ставить ключи на свои атрибуты, использовать их в expressions,
присоединять их к другим атрибутам через Connection Editor и т.д.
Динамические атрибуты проще всего удалить или отредактировать через меню Attribures,
находящееся, как нетрудно догадаться, в Attribute Editor.
Возможность добавлять свои атрибуты к объектам и использовать их для связи с другими
атрибутами в дереве зависимостей сцены - это ключевая возможность, радикально повышающая
Архитектура
109
ШММА
эффективность использования MAYA при работе со сложными сценами.
Кроме того, существуют секретные динамические атрибуты. Добавив из вы можете
изменить свойства объекта (ноды), к которой эти атрибуты добавлены. Об этом читайте в конце
главы.
Изменение порядка динамических атрибутов в ноде. Шаманство
Иногда в процессе подготовки персонажа или объекта к анимации приходится добавлять
новые динамические (пользовательские) атрибуты. Они, конечно же, встанут в конце списка уже
созданных атрибутов. Но такой порядок не всегда удобен.
В идеале они должны располагаться в какой-то логической последовательности. И мы
встаем перед задачей о том, как изменить уже имеющийся порядок атрибутов.
К сожалению, в Maya нет утилиты для такой работы. Может, написать какой-нибудь скрипт,
использующий недокументированные команды? Нет, все проще. Можно обойтись и без скрипта.
Было замечено, что если выделить несколько динамических атрибутов в Channel Box и вызвать
там же меню Delete Attributes, а затем сделать Undo, то MAYA восстановит эти атрибуты, но только
в обратном порядке и в конце списка. Отсюда можно сделать вывод, что любой динамический
атрибут можно перенести вниз, удалив его и восстановив командой Undo. Или вверх, если выбрать
все атрибуты до него и повторить операцию удаления и восстановления два раза (второй раз,
чтобы восстановить прежний порядок в удаленных атрибутах). Попробуйте сами.
Mesh In, Mesh Out
Мы уже на грани постижения тайны: того, что же такое Construction History. Однако
позволим себе еще один эксперимент.
Если вы уже потеряли сферу и кубик, создайте полигональную сферу и куб заново, хотя
в результате таких экспериментов хочется сказать «типа, сферу», или вообще: «полигональный
объект».
В Attribute Editor можно заметить, что для каждой такой «типа, сферы» присутствует
закладка polySpherel, описывающая входящие атрибуты для вычисления сферы.
Установите subdivisionsAxis=4 и subdivisionsHeight=4, чтобы окончательно превратить сферу в
«типа, сферу».
Теперь зададимся таким вопросом: если у полигональной сетки (определяемой нодой
pSphereShapel) есть входной атрибут inMesh, то, может быть, у нее есть и выходной атрибут типа
outMesh, в котором содержится описание этой сетки. Действительно, изучение Connection
Editor выявляет наличие такого атрибута. Понятно, что содержимое inMesh и outMesh не обязано
110
Книга Сергея Цыпцына
№
совпадать: ведь мы могли сетку «помять» или растянуть. Поэтому на выходе будут уже «помятые»
данные, а на входе - оригинальные. (Информация о «помятости» хранится, естественно, тоже в
секретных атрибутах ноды pSphereShapel, определяющих координаты вершин.)
А что будет, если соединить inMesh одного объекта и outMesh другого? Вперед! В Hyper-
graph! Нажимаем shift, тащим средней кнопкой мыши ноду pSphereShapel и бросаем ее на pCube-
Shapel. В Connection Editor слева выбираем outMesh, справа - inMesh.
Если теперь выбрать у pSpherel несколько вершин и подвинуть их, то можно увидеть,
что аналогичные вершины у pCubel тоже переместились. Внешне похоже на инстансирование,
однако это не инстансирование, потому что ноды shape у наших объектов разные. Если же
выбрать и переместить вершины у pCubel, это не произведет никакого впечатления на pSpherel.
Действительно, ведь связь между объектами односторонняя, поэтому перемещения вершин
pCubel просто «наслаиваются» на перемещения, унаследованные от pSpherel.
Исследуйте связи в Hypergraph. Теперь это простое дерево, где данные о форме
pSphereShapel передаются через связь outMesh->inMesh в pCubeShapel.
Изменение атрибутов subdivisionsAxis и subdivisionsHeight ноды polySpherel по-прежнему
влияет на форму обоих объектов: ведь поток данных проходит через них последовательно. Правда,
меняется нумерация вершин, поэтому если вы сдвигали точки слишком сильно, то увидите их
смещения в новых местах, соответствующих их старым номерам.
Ну, а напоследок выберите pCubel и примените к нему какую-нибудь операцию
полигонального моделирования, например Polygons=>Smooth. Затем выберите pSpherel и снова
«подергайте» эту фигуру за вершины (смотрите один из возможных результатов на рисунке
внизу).
Архитектура
111
Снова исследуйте Hypergraph, в особенности имена атрибутов, задействованных в связях.
Ясно, что MAYA для выполнения операции smooth вставила в существующее дерево еще пару
нод, отвечающих за эту операцию. Очевидно, что нода polySmoothFacel просто «ловит» данные,
поступающие в атрибут inputPolymesh, производит над ними вычисления, соответствующие
операции smooth и выдает результат в атрибут output.
Для взрослых: нода polyTweakl хранит информацию о том, как мы таскали
вершины. Можете в Attribute Editor изменить ее атрибут NodeState на HasNoEffect
и увидеть результат.
Теперь, когда сознание у читателя расширено, по-видимому, в достаточной степени,
можно приступать к изучению Construction History. Но сначала я хотел бы повторить вывод номер
один, только уже в более общем виде.
Снова вывод номер один
Еще раз напомню концепцию, к которой мы не раз будем возвращаться: чтобы эффективно
работать с объектами и связями в MAYA, необходимо знать тип и назначение атрибутов этих
объектов.
Но атрибуты не существуют сами по себе: они всегда принадлежат объектам, а точнее
112
Книга Сергея Цыпцына
- нодам, которые тоже имеют разные типы и предназначены для различных целей.
На практике тип любого атрибута можно, конечно, узнать MEL-командой
getAttr -type
А тип любой ноды - MEL-командой nodeType. Однако, чтобы получить более или менее
внятное описание предназначения этого атрибута, понадобится поработать с документацией.
Работа с документацией. Исследование незнакомых объектов.
Источник безграничных познаний
Допустим, вы однажды открыли сцену и видите: там незнакомый объект, с которым вам
еще не приходилось работать. Или вы сами в новой версии MAYA вдруг ухитрились создать доселе
невиданный объект, который совершает нечто неведомое. Что надо делать? Правильно надо
изучить его атрибуты. Точнее, выяснить, за какие свойства нового объекта они отвечают и как
этот незнакомый объект реагирует на изменение своих атрибутов. Так как все объекты в ЛААУА
состоят из атрибутов и, соответственно, имеют шаблон в Attribute Editor, то банальный «метод
тыка» позволяет довольно быстро начать изучение свойств новых объектов.
Например, откройте файл distance.та.
Попробуйте перемещать объекты. Через минуту становится понятно, что размер сферы
зависит от расстояния между объектами. Но каким образом это сделано?
При выбранной сфере в Attribute Editor обнаруживается некая нода howFar, которая имеет
всего два атрибута: Pointl и Point2.
В Hypergraph можно распутать связи между сферой и кубом и выяснить, что позиции
(атрибуты translate) сферы и куба соединяются с атрибутами Pointl и Point2 ноды howFar, а некий
атрибут distance этой ноды соединяется с атрибутами scale сферы. Хотя уже примерно понятно,
как работает нода howFar,
Архитектура
113
хотелось бы получить более детальную информацию о тех атрибутах, которые не появляются в
Attribute Editor.
Примечание. Взрослые мальчики никогда не читают разделов документации,
содержащих описание пунктов меню и процесса редактирования объектов. Им нужно
лишь описание интересующей их ноды и ее атрибутов. Для этого существует
пункт меню Help=>Node And Attribute Reference..., который просто открывает
алфавитный указатель на все типы нод, встречающихся в MAYA.
Осталось узнать тип интересующей нас ноды howFar. Проще всего узнать тип ноды в
Attribute Editor, где в соответствующей ноде закладке слева от имени ноды обозначен ее тип.
В нашем случает тип ноды howFar обозначен как distanceBetween. Поэтому открываем
Help=>Node and Attributes Reference... и находим там описание типа distanceBetween. Документация
подтверждает нашу догадку: ноды этого типа просто вычисляют длину отрезка между точками,
задаваемыми атрибутами Inputi и Input2. А вот описание атрибутов ноды приводит нас к
обнаружению еще двух атрибутов, позволяющих перемножать входящие атрибуты на матрицу, то
есть вычислять расстояние в другом пространстве.
Таким образом, если вам встречается незнакомая нода или новый атрибут, тип и назначение
которых вы хотите узнать, ваш путь лежит в Help=>Node and Attributes Reference. Именно так, с
некоторого момента, протекает дальнейшее изучение MAYA.
Для облегчения жизни взрослым мальчикам в Attribute Editor тоже есть меню Help, которое
предлагает сразу отправить вас в описание любой ноды, присутствующей в данный момент в
закладках Attribute Editor. Это, разумеется, донельзя удобно.
Дальше. Выберите куб или сферу.
Убедитесь, что первая закладка в Attribute Editor всегда имеет тип transform. Вторая
закладка, в случае полигональных объектов, имеет тип mesh.
Посмотрите также, что в документации в описании ноды типа mesh есть комментарии к
атрибутам inMesh и outMesh, с которыми мы уже экспериментировали.
Обратите внимание на то, что в документации также всегда обозначены типы атрибутов.
Это поможет вам в будущем определять совместимость атрибутов между собой для эффективного
соединения их в Connection Editor.
Совет. Указанный раздел документации является основным источником знаний о
«внутренностях» MAYA и ее реальном устройстве. Чего стоит хотя бы описание
ноды transform! Поэтому, по мере накопления опыта работы с MAYA, заглядывайте
в него почаще.
История (History)
Теперь, наконец, можно попытаться разобраться, что такое History. Я попробую дать
несколько определений, а вы подберете наиболее понятное вам, соответствующее вашему стилю
114
Книга Сергея Цыпцына
мышления.
Интуитивное определение: History - это совокупность объектов и связей, влияющих на
форму данного объекта. То есть если форма выбранного объекта зависит от атрибутов других
объектов или нод, тогда этот объект имеет History.
Более формальное определение: если нода shape данного объекта имеет входящие связи,
влияющие на форму объекта, то эти связи вместе с нодами, участвующими в них, называются
History данного объекта.
Ну и определение «на пальцах»: History - то, как мы влияли на форму объекта. Влияли мы
при помощи различных операций, a MAYA имеет свойство после многих операций создавать ноды,
им соответствующие, и так далее... Круг определений замыкается.
Понятие History иллюстрируется еще и следующим наблюдением. Как правило, перед
применением той или иной операции в MAYA можно открыть в меню ее Option Box и задать там
параметры применения этой операции (например, куда будет смотреть макушка полигонального
конуса или же сколько будет точек у Lattice). После применения операции не надо все делать
заново, если захочется изменить некоторые из этих параметров: MAYA обычно создает необходимые
ноды, соответствующие этим операциям, а параметры, задаваемые в Option Box, становятся
атрибутами объектов, то есть они доступны для редактирования через Attribute Editor. Другими
словами, MAYA запоминает наши действия в соответствующие ноды по мере совершения действий,
так сказать исторически, то есть они и становятся историей объекта (History).
Пользователи иногда путают термины History и Construction History. Дело усугубляется и
тем, что Construction History является частью History, связанной с созданием и изменением формы
объекта посредством только операций моделирования. Остальная часть History, не имеющая
специального названия, связана с применением деформеров и скининга, также изменяющих
форму объектов.
Разберем эти две части History отдельно.
Примечание. Связь с числовыми атрибутами (например visibility), принадлежащими
ноде shape, не может рассматриваться как History, так как она не влияет на форму
объекта. Ну и, естественно, вышеиспробованные связи между атрибутами trans-
form-нод также не являются отношениями типа History. (Можете проверить, что
операция Delete History никак не повлияет на эти связи.)
Construction History. Стэк моделирования.
Протоколирование действий и операций.
Конструктивные входы и выходы
Понятие Construction History применимо только к геометрическим объектам, то есть к
кривым, NURBS-поверхностям и полигональным сеткам (операции работы с subdivision surfaces не
имеют Construction History или наследуют последнюю у полигонов).
Прежде всего мы сталкиваемся с понятием Construction History при создании геометрических
примитивов. Какой бы объект вы ни создали при помощи меню NURBS Primitives или Polygon
Primitives, он будет содержать ноду (имя которой начинается на make для NURBS или на poly для
полигонов), которая позволяет изменять внешний вид и свойства поверхностей и кривых уже
после их создания. Эта нода и есть простейший пример Construction History.
Проделайте небольшое упражнение (кому неохота, можете открыть файл nurbsHistory.ma).
В новой сцене создайте NURBS-тор. Проделав некоторое количество операций моделирования,
посмотрите, как видоизменилась Construction History объектов.
В Channel Box выделите makeNurbsTorusI и задайте End Sweep=180, Minor Sweep=180.
Архитектура
115
Далее, RMB=>lsoparms. Выберите крайнюю верхнюю и нижнюю изопармы.
Создайте лофт: Surfaces=>Loft.
Разверните камеру и выберите две торцевые изопармы у лофта и тора.
Снова выполните Surfaces=>Loft.
Повторите для другого торца.
Выберите теперь тор и обратите внимание, какое столпотворение возникло в Channel Box:
116
Книга Сергея Цыпцына
Там отображаются названия нод, которые MAYA создала в ходе наших бесхитростных
действий. Выбирая разные поверхности, можно даже понять логику распределения этих нод по
разделам INPUTS и OUTPUTS в Channel Box. Окончательно прояснить эту логику поможет Hypergraph
и кнопка Input And Output Connections. Для одной из торцевых поверхностей дерево зависимостей
выглядит примерно так:
Выберите тор, поиграйте с атрибутами makeNurbsTorusl. Очевидно, что MAYA мгновенно
перестраивает всю модель в соответствии с изменениями атрибутов тора, как будто бы заново
повторяя все проведенные нами операции. В этом и состоит смысл и назначение Construction
History.
Крайне полезно поэкспериментировать с атрибутами промежуточных нод типа loftl или
curveFromSurfacelso, позволяющими задать даже номер изопармы, выбранной вами для построения
новых поверхностей.
Можно также сказать, что History для данного объекта - это верхняя часть дерева
зависимостей (upstream graph), которая «входит» в объект. (Если в Hypergraph вы используете
Options=>Orientation=>Horizontal, это будет, естественно, левая часть дерева.)
Архитектура
117
Удаление History. Отшибание памяти. Разрыв с прошлым
Соответственно, MAYA будет помнить и перестраивать всю нашу модель, пока будут
сохраняться связи между соответствующими нодами. Понятно также, что разрыв связей не
приведет к исчезновению объектов, а лишь нарушит зависимость одних объектов от других. Более
того, если в Hypergraph удалить все ноды типа loft и curveFromSurfacelso, поверхности никуда не
денутся, они просто не будут больше зависеть друг от друга.
Для удаления зависимостей и всех промежуточных объектов существует специальная
операция удаления истории: Delete History.
Если выбрать объект и выполнить Edit=>Delete by Type=>Delete History, для выбранного
объекта будет удалена вся входящая (верхняя) часть дерева зависимостей. Очень важно помнить,
что в процессе такого удаления истории удаляются лишь входящие связи и ноды, однако влияние
самого объекта на другие объекты (если такое существует) останется прежним.
Возникает вопрос: когда нужно удалять историю?
Ответ первый: сохраняйте историю только до тех пор, пока она вам нужна. Если вы
используете Construction History для моделирования, редактируя кривую, через которую проходит
revolve, или подбирая радиус скругления у операции round, удалять историю надо после того, как
вы окончательно завершите работу над формой поверхности, то есть будете уверены, что такое
редактирование вам больше не понадобится.
Ответ второй: сохраняйте историю, если вы собираетесь использовать ее в анимации.
Например, вы смоделировали занавеску, как лофт, проходящий через несколько кривых, и
собираетесь анимировать кривые при помощи динамики волос. Зависимость формы поверхности
от образующих ее кривых будет активно использоваться, поэтому сохранение истории в этом
случае - вполне адекватное действие
Однако пытливые умы нетерпеливо спросят: а зачем удалять историю?
Во-первых, история увеличивает размер сцены и вызывает постоянное обновление дерева
зависимостей, что приводит порой к сильному торможению интерактивной работы с объектами.
Поэтому удаление истории должно стать регулярным процессом, и обязательно вполне
осознанным.
Во-вторых, Construction History часто вызывает такое явление как «двойные
перемещения».
Double Transformation. Двойные перемещения.
Законопослушная MAYA
Если вы успели окончательно разорвать все связи и удалили историю на экспериментальном
полуторе, откройте заново файл nurbsHistory.ma.
Выберите все поверхности и попробуйте подвигать их в любом направлении. Все
разъезжается в разные стороны. Затем выберите только тор и снова перемещайте его произвольным
образом. Теперь все в порядке.
Снова выберите все поверхности и подумайте, что происходит в процессе перемещения
объектов, имеющих историю. С одной стороны, лофт «помнит» о том, что он был построен через
две изопармы тора, и поэтому обязан перемещаться вместе с тором. С другой стороны, лофт ведь
тоже выбран, а мы еще тянем его с помощью манипулятора Move Tool. Дабы соблюсти закон, лофт
передвигается еще и в соответствии с перемещениями манипулятора, то есть получает двойное
перемещение. Аналогичный эффект будет происходить и при использовании Rotate и Scale Tool,
поэтому он получил название Double Transformation. Причем это никакая не ошибка и не «глюк»
118
Книга Сергея Цыпцына
- в данном случае MAYA делает ровно то, что от нее просят, корректно учитывая все связи между
объектами.
Чтобы избежать такого эффекта, нужно всего лишь удалить историю, чтобы объекты не
наследовали дополнительные трансформации.
Если же вы дорожите историей, но хотели бы без проблем перемещать объекты как одно
целое, сгруппируйте их (Edit=>Group) и перемещайте группу. Так как расположение объектов
внутри группы не меняется, то и пересчета зависимостей Construction History не происходит.
Примечание. Иногда можно с самого начала отказаться от использования
Construction History. Для этого на Status Line существует специальная кнопка,
Construction History On/Offу которая позволяет вообще не запоминать последовательные
операции моделирования.
Изысканный Duplicate. Input Graph. Input Connections.
Копирование старых связей.
Дублирование входящего дерева зависимостей
При дублировании объекта его History, по умолчанию, не копируется, и у созданной копии
объекта нет вообще никакой Construction History.
Однако иногда нужно скопировать модель вместе с некоторыми связями, для удобства
редактирования в будущем. В этом случае существуют две возможности, которые мы сейчас и
разберем.
Создайте полигональный куб.
Выполните Polygons=>Smooth.
Снова выберите объект и выполните Edit Polygons=>Extrude Vertex.
Опять выберите объект, далее проделайте Polygons=>Average Vertex.
(Опять-таки, для ленивых имеется файл starObjectHistory.ma.)
Предположим, мы хотим получить копию нашего объекта, но в дальнейшем собираемся
менять у нее, например, атрибут Subdivision Level в Attribute Editor для ноды polySmoothFace.
Если просто выполнить Edit=>Duplicate с параметрами по умолчанию, новый объект, как
Архитектура
119
только что говорилось, вообще не будет иметь истории.
Однако если в Option Box операции Duplicate включить галочку Duplicate Input Graph
(памятливые умы не могут не помнить, что History - это и есть « входящее» дерево) и если скопировать
объект, новая копия будет обладать собственной Construction History и иметь аналогичное дерево
в Hypergraph.
Теперь можно индивидуально изменять атрибуты Construction History для каждого объекта.
(Поиграйте, например, с атрибутами ноды polyCube.)
Но если мы хотим, чтобы все копии объекта были единообразны и менялись одинаково в
ответ на изменение атрибутов в нодах History, то следует, очевидно, дублировать не все дерево
целиком со всеми нодами, а скопировать лишь связь объекта с уже имеющимся деревом.
Выберите объект и в Option Box операции Duplicate включите галочку Duplicate Input
Connections.
После копирования новый объект уже не будет иметь собственную независимую
Construction History, а будет зависеть от истории оригинального объекта.
Теперь в Attribute Editor или Channel Box легко заметить, что у выбранных атрибутов
одинаковая история. А изменение Subdivision Level в Attribute Editor одинаково изменяет все
120
Книга Сергея Цыпцына
Я хотел бы сразу отметить, что принципы дублирования Input Graph или Input Connections
распространяются не только на объекты, имеющие History, но и на все объекты, просто имеющие
входящие связи. Так, например, если объект имеет expression, заставляющий его двигаться
определенным образом, то при дублировании по умолчанию этот expression просто «отвалится» от
объекта; при дублировании Input Graph будет создан новый expression для копии объекта, а при
копировании Input Connections один старый expression будет управлять сразу двумя объектами.
(Хотя это может не соответствовать текстовому содержанию самого expression.)
Для взрослых. Это можно легко проверить. Оставьте в сцене один объект,
выберите его, в Attribute Editor впишите - в ячейку для translateY - следующий
текст:
=noise(time)
и нажмите Enter. Expression готов. Теперь в Duplicate Option Box включите галочку
Duplicate Input Connections и скопируйте объект. Оттащите его куда-нибудь
неподалеку и посмотрите в Expression Editor, что хотя формула написана для
первого объекта, второй объект прекрасно движется в соответствии с нею.
Осознать этот парадокс вам поможет Hypersraph, где можно увидеть, что
expression - это просто вычислитель, имеющий выходы, которые могут быть
подсоединены к любому объекту.
Стэк деформаций и история моделирования
Иногда некоторые, более хорошо подкованные индивидуумы, случайно знакомые с
понятием «стэк деформаций», начинают воспринимать Construction History тоже как своеобразный
стэк моделирования. В принципе это так и есть, за исключением того, что в отличие от деформаций,
порядок операций моделирования не может быть произвольно изменен. Посудите сами: если
провести лофт через три кривые, а потом пересечь его со сферой, получив замкнутую кривую,
то какие операции и в каком порядке здесь можно переставить?! Да, для некоторых операций
полигонального моделирования, последовательно передающих данные типа inMesh, outMesh,
можно ставить задачу изменения порядка следования нод в дереве зависимостей. Такая задача
легко решается (либо при помощи небольшого скрипта, либо ручной переустановкой связей в
Hypergraph), но вряд ли результат перестановки операций, в общем случае, будет предсказуем.
Но давайте разберем этот самый стэк деформаций.
Порядок деформаций. Список операций
Применение деформеров также ведет к появлению History у геометрических объектов,
так как деформеры воздействуют непосредственно на форму объекта, и, как следствие, на ноду
Архитектура
121
скопированные объекты. Полезно также посмотреть на дерево зависимостей в Hypergraph, откуда
следует, что скопировалась только связь объекта с деревом истории моделирования.
shape.
Займемся «вивисекцией». Если ваш «ежик» еще «жив» (помните? была выше такая
«колючая» фигура), попробуем «поиздеваться» над ним. Если нет, откройте файл starObjectHis-
tory.ma или создайте простой куб.
Выберите объект, навалите на него деформер squash: Deformers=>Create Non
Linear=>Squash.
В Channel Box установите factor=3.
Затем снова выберите объект и примените к нему деформер bend: Deformers=>Create Non
Linear=>Bend.
В Channel Box установите curvature=2.
Таким образом, мы сначала растянули объект, а затем согнули его. Есть мнение, что если
бы сначала объект был согнут, а потом растянут, результат был бы иной. Как поменять порядок
деформаций?
Конечно, можно открыть Hypergraph и, проявив паранормальные чудеса смекалки и
виртуозное владение мышью, быстро перебросить нужные связи в необходимом порядке. А как
быть обычным, «нормальным» людя^л?
Надо выбрать объект и добраться до плохо описанного в документации окна, в котором
есть список всех входящих операций (inputs).
122
Книга Сергея Цыпцына
Это можно сделать, поставив курсор над объектом и нажав правую кнопку мыши: в
выпавшем меню надо выбрать lnputs=>All Inputs...
Откроется окно List of input operations for pCubel, в котором представлена вся History
объекта в виде списка операций. (Замечу, что Construction History представлена здесь как часть
общей History, включающая в себя все операции над формой объекта.) В отличие от Hypergraph,
здесь историю следует читать снизу вверх.
Теперь схватите средней кнопкой мыши первый сверху пункт в этом списке - Non
Linear(squasM), перетащите его и бросьте на второй пункт: Non Linear(bendl).
Порядок следования нод в истории поменялся, а значит поменялся и порядок деформаций
- это прекрасно видно на экране.
Архитектура
123
При перетаскивании, порядок следования операций изменяется так: элемент списка
вставляется под тот элемент, на который он был «сброшен». (То есть перед ним, если смотреть
снизу вверх, с точки зрения History.) Здесь же вы можете заблокировать действие той или иной
ноды, изменяя ее атрибут nodeState.
Можете убедиться, что нельзя поменять порядок нод, относящихся к Construction History,
то есть к моделированию (об этом уже говорилось раньше).
Если заглянуть в Hypergraph, нажать там главную кнопку и немного подтащить ноды друг
к другу, можно выстроить дерево истории в удобочитаемом виде.
Загадочный Tweak
Нода tweak, автоматически появляющаяся при создании деформеров, хранит в себе
информацию о ручном редактировании поверхности путем прямого перетаскивания за вершины.
Поскольку она, по умолчанию, располагается перед деформерами, перетаскивание вершин на
деформированном объекте может вас слегка смутить: ведь вершины будут двигаться, не следуя за
манипулятором. (Просто представьте себе, что вслед за вашим смещением вершин к ним мгновенно
прикладываются деформации объекта, переставляющие их прямо под вашим курсором.)
Ноду tweak также можно переставить средней кнопкой в списке операций - так, чтобы и она
оказалась после деформеров. Вслед за этим вершины будут, конечно, передвигаться корректно,
однако при анимации деформеров могут проявиться неожиданные явления.
Путешествия по истории
Вызвать окно со списком исторических связей через меню на правой кнопке мыши - путь
интуитивно -понятный, но далеко не единственный. Для выбранного объекта на Status Line
находятся две кнопки, показывающие все входящие и выходящие операции для выбранного
объекта.
124
Книга Сергея Цыпцына
В Attribute Editor для каждой ноды также существуют две похожие кнопки, позволяющие не
только показывать входящие и исходящие связи (через правую кнопку мыши), но и осуществлять
в Attribute Editor навигацию вверх и вниз по дереву зависимостей.
Эти кнопки исключительно удобны при работе с деревом материалов и текстур и позволяют
быстро перемещаться по связям.
DAG или не DAG? Терминологические дебри
Иногда в интерфейсе и тем более в документации мелькнет аббревиатура DAG. Бывает,
встречается сокращение DG. Начинающие диггеры, занявшиеся АЛАУА, порой думают, что это
опечатка. Хотя знание терминологии в этом случае имеет скорее теоретический, чем практический
характер, постараюсь прояснить значение этих терминов, а также уместность их употребления.
(Кроме того, вы всегда сможете сделать жутко умный вид и со знанием дела ввернуть в дискуссию
пару фривольных сентенций, типа «Ну, я-то всегда контролирую свой DAG» или «Ох, еле-еле
распутал чужой DG». Попробуйте. Работает...)
Термин DAG (Directed Acyclic Graph) пришел из теории графов и может быть, в принципе,
переведен как «направленный непериодический граф». Однако пугаться таких названий не стоит,
поскольку DAG -просто «высоколобый» термин для представления иерархии «майской» сцены.
Совокупность отношений parent-child для всех объектов в сцене - это и есть DAG. Еще проще
можно объяснить понятие DAG визуально: представление сцены в Hypergraph в режиме Scene
Hierarchy - тоже DAG. Запомните навсегда: сам DAG - это не объекты, а представление отношений
между объектами!
Слово «направленный» (directed) в данном случае означает, что отношение parent-child
имеет направление сверху вниз и однозначно определено. «Непериодический» (acyclic) всего
лишь объясняет (для понимающих), что подчиненный объект не может быть родителем своих
родителей, то есть направленные отношения parent-child не могут образовывать циклы. Ну и,
надеюсь, понятно, что «граф» не имеет никакого отношения к титулованию лиц благородного
происхождения, то есть от «графа Толстого» до нашего с вами графа дистанция огромного
Архитектура
125
размера...
Довольно часто встречается термин DAG-object. Совершенно справедливо предположить,
что DAG-объект - это просто элемент DAG, то есть любой объект, который может быть «припарентен»
к другим DAG-объектам. Очень просто уяснить разницу между DAG и не-DAG объектами, открыв
Outliner и включив/выключив галочку Display=>DAG Objects Only. Таким образом, активно
используя любимый «метод тыка», можно сказать, что все объекты, которые можно выбрать
непосредственно на экране, то есть в панели камеры, являются DAG-объектами. Пытливые умы
уже, видимо, сделали вывод, что DAG-объекты всегда имеют transform-ноду, которая позволяет
перемещать их в пространстве и группировать с другими объектами. Любая геометрия, источники
света, камеры, частицы, локаторы, флюиды, кластеры - все это DAG-объекты. Соответственно,
blendshape, или любой материал, или текстура DAG-объектами не являются.
Если быть совсем въедливым, надо упомянуть термин DAG-node, то есть это нода, входящая
в состав DAG-объекта. Реально существует всего два типа DAG-нод: это transform-нода и shape-
нода, о которых я уже говорил выше. Transform-нода позволяет группировать объекты, и, как
правило, она (если это не пустая группа) имеет подчиненные (child) объекты в виде shape-ноды
и других transform-нод. Shape-нода никогда не имеет подчиненных объектов, но всегда имеет
хотя бы одного transform-родителя. (Отсюда следует еще одно определение DAG-объекта: как
постоянной связки transform+shape.)
Благодаря механизму инстансирования, одна shape-нода может иметь несколько
родителей. Именно поэтому DAG называется графом, так как в этом случае он уже перестает
иметь структуру иерархического дерева (в котором у потомк всегда один родитель), а становится
произвольным графом. Однако в «майской» терминологии уже прижился термин - хотя , строго
говоря, некорректный: «дерево зависимостей», или «дерево истории»: под которым понимается,
естественно, произвольной формы граф.
Разберем теперь, что такое DG (Dependency Graph). Как следует из названия - это граф
зависимостей, представляющий из себя набор нод и связей между ними. DG тоже является
направленным (directed), так как связи между атрибутами нод однозначно направлены. Но, в
отличие от DAG, он может быть цикличным, так как пользователь может устанавливать связи
между любыми двумя нодами и в любом направлении. Связи в DG уже не являются иерархическими
отношениями, а представляют собой просто потоки данных между нодами, соединяющими входные
и выходные атрибуты этих нод. Именно DG отображается в Hypergraph в режиме Input And Output
Connections.
Отсюда можно сделать вывод: DG-нода - просто элемент DG-графа. DG-ноды можно
представлять в виде вычислителей, которые получают данные через входящие атрибуты, затем
производят вычисления, и их результат через выходные атрибуты отправляют к другим нодам.
Примерами DG-нод являются материалы, текстуры, системное время timel, ноды, отвечающие за
Construction History, и пр.
Снова погружаясь в тонкости терминологии, можно сказать, что все DAG-ноды являются, в
том числе, и DG-нодами, так как transform и shape тоже могут соединяться с другими нодами при
помощи Hypergraph или Connection Editor.
Иногда все DG-ноды, кроме transform и shape, называют Non-DAG Nodes. Но здесь лишь
подчеркивается то обстоятельство, что такие ноды нельзя сгруппировать или выбрать, а затем
перемещать на экране. Материалы и текстуры - основной пример Non-DAG Nodes. Деформеры,
глобальное время timel, expressions, blendshape, defaultRenderGlobals и масса других служебных
нод - это все Non-DAG Nodes. Некоторые из них изначально присутствуют в любой сцене, некоторые
пользователь создает в явном виде (например, материалы или expressions), но большинство из них
возникают как служебные или вспомогательные объекты в процессе выполнения тех или иных
операций.
Подытоживая многочисленные формулировки, можно сказать, что DAG - это представление
сцены с точки зрения иерархии между объектами, a DG - с точки зрения зависимостей между
атрибутами объектов.
126
Книга Сергея Цыпцына
Примечание. Понятнее всего DAG-терминология описана в документации в
разделе «Для взрослых», а именно в описании ноды DAG Node. Во всех остальных
разделах можно найти лишь циклические ссылки, притом скороговоркой, с более
чем лаконичными разъяснениями.
Циклы в дереве зависимостей и их последствия.
Поднимание себя за уши
Если можно соединять атрибуты различных нод Hypergraph в любой последовательности,
теоретически возможна ситуация, когда возникают циклы. Другими словами, путешествуя по
связям в Hypergraph в направлении стрелок можно вернуться к ноде, с которой начиналось
путешествие. Например, если создать три цилиндра, можно без проблем соединить в Connection
Editor вращения первого и второго цилиндров (через атрибуты rotate), затем вращения второго
и третьего, а затем - третьего и первого. И получится, что все цилиндры управляют друг другом.
Попытка повращать любой объект не приведет к успеху, так как атрибуты rotate всех объектов
заблокированы связями с другими объектами. Это похоже на попытку поднять самого себя за уши.
И хотя MAYA формально позволяет устраивать такие связи, ни к чему хорошему это не приведет,
особенно если ваше дерево зависимостей не столь уж примитивно. Наличие циклов может
приводить к довольно непредсказуемым и трудно отлавливаемым ошибкам, так как связи между
атрибутами продолжают функционировать, но порядок и результат их выполнения неоднозначен.
Примером «непреднамеренного» создания циклов может служить попытка «приконстрейнить»
родительский объект к одному из своих потомков. В этом случае родитель управляет потомком
через иерархию, а потомок управляет родителем через констрейн.
MAYA однако проявляет ангельское терпение, стараясь не «упасть» от таких циклических
издевательств и даже сообщает пользователю о наличии циклов в сцене. Поэтому стоит очень
внимательно относиться к появлению в Script Editor сообщения типа:
// Warning: Cycle on *pCube2.rotate' may not evaluate as expected.
// (Use 'cycleCheck -e off' to disable this warning.) //
В случае появления такого приговора следует внимательно пересмотреть связи между
объектами и атрибутами, чтобы выявить некорректные зависимости.
Только в одном случае не стоит паниковать при появлении такого сообщения. При
использовании динамики твердых тел, после возвращения в первый кадр, MAYA весело сообщает
о наличии циклов. Не пугайтесь, так устроена динамика, а точнее, понятие начального положения
твердого тела. В этом случае просто не обращайте внимания на сообщение о циклах.
Expression как нода совершенно произвольного назначения.
Природа expressions. Входы, выходы и сиротливые expressions
Я уже упоминал о том, что можно рассматривать ноды как простые вычислители
принимающие и передающие данные. У каждой ноды собственные правила, по которым она
вычисляет выходные данные. Но если вам вдруг понадобится сделать вычисления по собственным
формулам, то создавать собственные ноды можно только с помощью специально обученных людей,
знающих C++ и умеющих компилировать плагины. В этом случае, на помощь приходят expressions.
Те, кто уже знаком с правилами написания expressions, знают, что с их помощью устанавливается
связь между атрибутами различных объектов, запрограммированная на языке MEL.
Примечание. Если вы смогли дочитать текст до этого места, автор
должен от души поздравить вас: вы обладаете завидным мужеством и у вас
недюжинная пытливость ума. Правда, дальше, с точки зрения абстрактности
и технологичности, материал будет еще хуже... (Или - лучше? Может, крепче?)
Главное: я вас честно об этом предупредил.
Архитектура
127
Давайте посмотрим на expressions как на обычную ноду, которая имеет входы и выходы.
Откройте файл expressionStart.ma.
В нем содержится три объекта и один expression, который удерживает сферу по вертикали
посередине между кубами.
В Hypergraph можно увидеть связи между объектами и нодой expression 1.
Как следует из диаграммы зависимостей, нода expressionl принимает на вход значения
двух атрибутов (pCubel.translateY и pCube2.translateY), вычисляет результат и помещает его на
выход (output[0J), который присоединяется к вертикальной координате сферы (nurbsSpherel.
128
Книга Сергея Цыпцына
translateY).
Проделаем следующие действия. Попробуем присоединить выход от expressioni еще к
какому-нибудь объекту.
Создайте полигональный тор.
Выберите его и сферу, а затем в Hypergraph выполните Graph=>lnput And Output
Connections, чтобы увидеть одновременно и тор, и ноду expressioni.
Перетащите ноду expressioni на pTorusI средней кнопкой мыши, удерживая Shift.
Откроется Connection Editor.
Слева, где находится expressioni, выберите Output/Output[0], а справа выделите TranslateY,
присоединив, таким образом, выходное значение от expressioni к вертикальному перемещению
тора.
Подергав за кубики, убедитесь, что тор двигается вместе со сферой. Теперь откройте
Expression Editor, задайте в нем для удобства Select Filter=>By Expression Name и выберите
expression!, чтобы увидеть его код.
Парадоксальная вещь! Формула для expressioni не изменилась и не содержит даже
упоминаний про pTorusI, однако тор беззастенчиво двигается вместе со сферой.
Архитектура
129
Конечно, если кто-то откроет этот файл в первый раз, его очень сильно озадачит поведение
тора (особенно если еще обратиться к Expression Editor). Недоумение не пройдет до тех пор, пока
любопытствующий не откроет Hypergraph и не прочитает эту главу. Однако мы сделали именно
то, что хотели, причем вручную, устанавливая связи между объектами. Поэтому MAYA не всегда
может адекватно трактовать и отображать наши, в общем-то «хакерские», действия в своем
интерфейсе.
Конечно, если добавить в expression 1 еще одну строку вида:
pTorusI .translateY=(pCube1 .translateY+pCube2.translateY)/2;
то MAYA совершенно законно добавит к ноде expressionl еще один выходной атрибут (output[1]) и
присоединит его к тору.
Таким образом, в нашем случае (как, впрочем, и в любом другом случае), expression
работает как простой вычислитель: он принимает данные на входных атрибутах (input[n], а их
может быть сколько угодно), производит подсчеты и отправляет результат на выходные атрибуты
(output[n], и их также может быть сколько угодно).
Проделайте следующий, еще более радикальный эксперимент.
В Hypergraph разыщите expression и аккуратно удалите все его связи с остальными
объектами кроме timel.
Теперь откройте Expression Editor и посмотрите на его формулу (для этого может
понадобиться нажать кнопку Reload).
130
Книга Сергея Цыпцына
№
Довольно схематическая формула говорит о том, что выход равен полусумме двух входов.
Причем не уточняя, что именно подается на вход и что присоединяется к выходу. Оказывается
expression может существовать сам по себе, без связей с другими объектами.
.1[0] и .1[1] суть обозначения атрибутов input[0] и input[1], которые, как можно догадаться,
присутствуют у ноды expressionl. О[0] соответствует имеющемуся атрибуту output[0].
Совершенно очевидно, что если вы, орудуя мышкой и используя Connection Editor, присоедините
на входы (input[n]) ноды expressionl какие-либо атрибуты кубиков, а выход (output[0]) также
присоедините к нужному атрибуту сферы или тора, то expression снова заработает определенным
вами образом, и MAYA, с большой долей вероятности, даже правильно отобразит его формулу в
Expression Editor.
Данный эксперимент, позволяет представить expression как ноду совершенно общего
назначения, с произвольным количеством входов и выходов. Конечно, такой радикальный взгляд
на природу expressions несколько необычен, но в целях привыкания к логике MAYA попробуйте
иногда представлять их именно так.
Вопросы мироздания и философии. Единство и борьба противоположностей. Expressions
против Nodes. Кто главный? Элементы маразма. Области применения противоположностей
Материал изложенный далее, требует некоторой подготовки, поэтому если вы пока еще морально
не готовы столкнуться с малопонятными вещами, можете пропустить остаток главы. Кроме того,
уровень абстракции и обилие общих рассуждений могут нанести психический урон незакаленным
творческим натурам. Если же вы действительно готовы разобраться во внутренностях MAYA -
читайте дальше! Ну, а тем, кто метит в технические директора или в разработчики, изложенное
ниже следует выучить наизусть.
У некоторых пытливых умов может возникнуть резонный вопрос: в чем принципиальная
разница между expressions и нодами? Когда применяются одни и когда другие? Если и те и другие
представляют из себя «ящик» с несколькими входами и выходами, которые можно присоединять
к другим объектам, то кто из них имеет преимущество? На первый взгляд, может показаться, что
преимущество у expressions, так как ноды представляют собой «черный ящик», алгоритм работы
которого изменить невозможно, а формула, по которой работают expressions, легко редактируется.
Однако все не так просто.
Обрисую, по возможности, хотя бы «на пальцах», ограничения и преимущества обоих
участников противостояния.
Главное преимущество expressions в том, что они могут быть практически мгновенно
созданы заново или отредактированы. Алгоритм их работы прозрачен и задается формулой на
языке MEL, которую можно копировать или менять. Но вот на этом преимущества expressions
заканчиваются. Дальше начинаются ограничения...
Во-первых, совершенно непонятно, как должны выглядеть expressions, создающие,
например, процедурные примитивы типа polySphere. Как написать формулу на MEL, которая берет
на входе радиус и количество граней, а на выходе выдает полигональную геометрию, остается
только догадываться. Можно, конечно, вычислить на основе этих данных координаты всех вершин
для сферы и дальше, через команду polyCreateFacet, пересоздавать всю поверхность, однако
делать это надо будет в каждом кадре или при изменении любого входа (ну, хотя бы радиуса сферы).
Боюсь, это, возможно, даже будет работать. Но, как уже догадались читатели, работать чудовищно
медленно. Отсюда вытекает основное ограничение expressions - низкая производительность.
Во-вторых, поскольку expressions пишут на языке МЕЦкоторый является интерпретируемым),
выполняются они медленно. Конечно, «медленно» - понятие условное, так что вычисление
положения сферы между двумя кубиками займет время, которое вы едва ли сможете заметить
на экране, визуально. Однако когда это касается не одной, а сотен или тысяч вычислительных
операций в каждом кадре, производительность expressions становится ощутимо недостаточной
(в главе, посвященной MEL, есть пример попытки создать деформер, и там обозначены границы
применения MELc точки зрения производительности).
Ноды написаны на языке C++ и откомпилированы для каждой операционной системы.
Архитектура
131
Скорость вычисления данных внутри них (то есть производительность нод) в десятки, а то и в
сотни раз быстрее, чем выполнение команд для expressions. Поэтому их главное преимущество
- скорость, тогда как главное ограничение - тот факт, что пользователь никак не может изменить
алгоритм работы конкретной ноды. Точнее, может... Но для этого надо изучить язык C++,
запрограммировать на нем новую формулу, скомпилировать ее под имеющуюся операционную
систему и затем подключить к MAYA как плагин...
Области применения expressions и нод можно приблизительно обрисовать так.
Когда речь идет об анимации, вычисления производятся, как правило, в отношении
десятков или сотен объектов. Но формулы, используемые в процедурной анимации, как правило,
несложные, поэтому применение expressions в данном случае более чем оправдано. Связывание
атрибутов анимируемых объектов друг с другом или со временем не требует интенсивных
вычислений.
Когда требуется осуществлять деформации (в этом случае надо перебирать тысячи точек)
или работать с материалами (там потребуется вычислять цвет поверхности в каждой точке на
экране), лучше использовать наборы нод, каждая из которых выполняет свою функцию.
Конечно, можно нарушать эти «обывательские» правила и вместо expressions собирать
нужную формулу при помощи соответствующих нод.
Откройте, например, файл noExpressionStart.ma.
В нем вместо expressions используется нода plusMinusAveragel, которая вычисляет среднее
значение для двух входящих атрибутов (для этого атрибут operation для нее установлен в
Average). Вы можете рассмотреть сцену подробнее в Hypergraph и убедиться, что она работает точно
так же, как сцена expressionStart.ma, использующая expression.
Вы не почувствуете разницы в производительности между двумя этими, небольшими
сценами, поэтому можете использовать любой подход. Однако попробуйте создать каждую из этих
сцен с нуля и оцените временные затраты в каждом случае. Подумайте также: что будет, если
вы захотите немного поменять положение сферы, например, поставить ее не посередине между
кубиками, а ближе к одному из них.
nurbsSphere1.translateY=(pCube1. translate Y*0.25+pCube2.translateY*0.75)
Надо думать, что в случае использования нод вам придется туго (посмотрите результат в
файле noExpressionMulti.ma).
132
Книга Сергея Цыпцына
С другой стороны, при разработке материалов для рендеринга никто не запрещает вам
использовать expressions. Можете создавать собственные текстуры, материалы (и даже модели
освещения) с помощью expressions, однако работать они будут неэффективно по сравнению с
процедурными текстурами, требуя гораздо больше времени для обсчета.
Например, создайте цилиндр.
Потом откройте Hypershade и создайте ноду samplerlnfo: Create=>General Utilities=>Sampler
Info. В сцене появится новый объект samplerlnfol, отвечающий за доступ к информации об объектах
непосредственно в процессе рендеринга. Обычно его соединяют с другими утилитами для анализа
и вычисления цвета или других свойств в каждой точке поверхности.
Но вы можете открыть Expression Editor и просто создать expression типа:
if (samplerlnfol .pointWorldY>0)lambert1 .diffuse=
noise(samplerlnfo1 .pointWorldY*10)+1;
Смысл его заключается в том, что все точки на поверхностях с материалом lambertl будут
окрашиваться в некий рисунок, если их вертикальная координата положительна. Иными словами,
таким образом вы кладете, некую текстуру на канал diffuse, причем рисунок этой текстуры
определяете по формуле в своем expression. (Пример сохранен в materialWithExpression.ma.)
™ 1 !*£ J Reto*1 I ^L _1_—22 i р
Для взрослых. Отсутствие возможности скомпилировать текстуру или материал,
определенный с помощью expression, всегда вызывало у меня чувство горечи и досады.
Сейчас, когда на смену «родному» рендереру программы MAYA пришел великий
mental ray со своим языком описания шейдеров, эта горечь немного смягчилась. Однако
идея использовать expression для написания материалов, согласитесь, неплохая.
После таких экстремальных рассуждений, дадим волю рукам и «поковыряемся» во
внутренностях MAYA ради обнаружения секретных или недокументированных нод, которые могут
принести пользу. Но сначала обсудим еще один секретный атрибут любой ноды, встречающейся в
MAYA.
Архитектура
133
Загадочный атрибут Node State. Состояние ноды.
Блокировка действия некоторых нод. Обновление экрана и
оптимизация интерактивной производительности
Если вы не очень любопытны, этот раздел можно и не читать, однако не исключено, что
здоровое любопытство и желание «во всем дойти до самой сути» не дает вам спокойно спать,
пока вы не узнаете, для чего же предназначен совершенно мистический атрибут Node State,
встречающийся у каждой ноды и мозолящий глаза в каждой закладке Attribute Editor в разделе
Node Behavior.
▼ j Node Behavior
f~ Caching
Node State Normal ▼ [
► | Extra Attributes
Раз мы договорились рассматривать любую ноду в AAAYA как некоторый вычислитель, было
бы логично иметь возможность временно выключать и включать этот вычислитель.
Например, вы смоделировали супер-телескоп с помощью некоторого количества операций
Loft, Extrude и других. Благодаря неубитой Construction History все работает, как часы, и форма
телескопа меняется при редактировании исходных кривых, лежащих в основе всей модели.
Однако может статься, что модель выполнена столь изысканно, что довольно долго приходится
ждать пересчета поверхности после изменения кривой. А нужно, скажем, временно отменить этот
пересчет, отредактировать все нужные кривые, а затем снова включить обновление поверхности.
Есть такое дело! Для этого достаточно разыскать в Attribute Editor закладки для операций Loft и
Extrude и установить для них Node State=Blocking. Правда, после этого поверхности эти перестанут
не только обновляться, но и вообще показываться на экране. Если же вы хотите, чтобы поверхности
не исчезали, а только перестали обновляться, надо установить Node State=Waiting-Normal.
Другой пример можно привести на основе применения деформеров или скининга.
Предположим, вы привязали поверхность к костям и деформировали ее с помощью скелета. Если
выбрать поверхность, то в закладках Attribute Editor будет присутствовать нода типа skinCluster,
отвечающая за деформации поверхности скелетом. Если установить для нее Node State=Blocking, то
поверхность тут же вернется к своему недеформированном состоянию, то есть скининг перестанет
вычисляться, и сколько бы вы не шевелили скелет, поверхность не будет изменяться, пока вы не
установите Node State=Normal.
Внимательные экспериментаторы заметят, конечно, что при попытке установить Node
State=Blocking для скининга MAYA выдает сообщение:
Warning: skinClusterl (Skin Cluster Node): Blocked is not supported on deformers. Switching to Has No
Effect.
А затем сама устанавливает Node State=HasNoEffect.
Честно сказать, на данном этапе даже мне не хочется углубляться в такие дебри и
объяснять, в чем разница между этими понятиями.
Однако чтобы вы все-таки почувствовали разницу, хотя бы интуитивно, откройте файл ех-
pressionStart.ma (или любой другой содержащий expression), выберите сферу и найдите закладку
expressionl в Attribute Editor.
134
Книга Сергея Цыпцына
Установите в ней Node State=HasNoEffect.
После этого expression перестанет производить хоть какой-то эффект на сферу: при
перемещении кубиков сфера останется неподвижной. Однако вы по-прежнему не сможете
перемещать сферу по вертикали: пусть expression ничего не вычисляет в данном случае, но зато
он, скажем так, имеет влияние на сферу.
Однако если установить Node State=Blocking, expression не только не будет вычисляться,
но и приниматься во внимание. Теперь он полностью заблокирован, и сферу можно передвигать
по вертикали вручную.
Советую запомнить только два значения атрибута Node State. Это Normal и Blocking. Если
нужно временно заблокировать работу некоторой ноды, достаточно установить для нее Node
State=Blocking. В тех случаях, когда значение Blocking не поддерживается данной нодой, MAYA
сама изменит его на HasNoEffects.
Как можно догадаться, для некоторых типов нод изменение значение атрибута Node State
не имеет ни смысла, ни эффекта. Сколько бы вы ни меняли его значение материалов или тектстур,
это не отразится на рендеринге. Просто шаблон окна Attribute Editor предполагает отображение
этого атрибута для всех типов нод, даже для тех, которые его не используют. Точно также, для
некоторых типов нод имеет смысл только лишь одно значение: либо Blocking, либо HasNoEffect.
Для того, чтобы быстро заблокировать все ноды определенного типа во всей сцене, есть
специальный пункт меню: Modify=>Evaluate Nodes. Он позволяет установить Node State=Blocking
для перечисленных в нем типов нод.
Кстати, использование атрибута Node State настолько полезно, что для многих типов нод он
по умолчанию является анимируемым. И, выбрав какие-нибудь expression или констрейн, можно
обнаружить, что этот атрибут присутствует в Channel Box и готов к анимации.
Для взрослых. Большие дяди, естественно, хотели бы знать, что означают
значения типа Waiting-Normal. Сам термин Waiting (ожидание) означает: MAYA
ожидает какого-то события, чтобы вернуться в установленное состояние.
Например, Waiting-Normal означает: MAYA ждет события, чтобы вернуться в
состояние Node State=Normal.
Но что это за событие? Оно определяет, как и когда MAYA обновляет дерево
зависимостей между объектами (и, вчастности, History). Поумолчаниюзависимости
обновляются (а экран перерисовывается) прямо во время перетаскивания или
изменения мышкой каких-нибудь объектов, от которых зависят другие объекты.
Однако это поведение можно изменить, например, для слабых, «истощенных»
рендерингом компьютеров, неспособных интерактивно вычислять все изменения.
Делается это через окно Windows=>Settings/Preferences=>Performance Settings.
Архитектура
135
Если в этом окне задать Refresh On=Release, обновление зависимостей и перерисовка
экрана будут происходить только после отпускания кнопки мыши, вслед за
перетаскиванием чего-нибудь в панели камеры. При Refresh On=Demand обновления
истории и зависимостей вообще не будет, пока вы не нажмете кнопку Update,
которая появится в правом нижнем углу экрана.
Отпускание кнопки мыши или нажатие кнопки Update и есть то самое событие,
которого «ожидает» значение Node State=Waiting-Normal, чтобы вернуться
в состояние Normal. Так как по умолчанию это событие не определено (Refresh
On=Drag), вы можете использовать Node State=Waiting-Normal, для того, чтобы не
обновлять поверхности, имеющие Construction History, но при этом и не прятать
их с экрана.
Секретные коды, секретные ноды. Создание нод вручную
Далее я хочу привести несколько примеров «ручной» работы с нодами для решения тех
или иных задач. Под термином «ручная» работа я подразумеваю соединение, при необходимости,
какого-то количества входных и выходных атрибутов с помощью Connection Editor или же создание
«вручную» некоторых, мало изученных нод, не используя основное меню MAYA.
Очевидно, что большая часть служебных нод создается неявным образом, то есть в процессе
создания и редактирования объектов или применения различных операций. Соответственно, для
создания таких нод нет специальных пунктов меню или кнопок. Однако в некоторых случаях нужно
136
Книга Сергея Цыпцына
создать такие секретные ноды отдельно, подобно геометрическим примитивам.
Если вы знаете тип ноды, которую хотите создать (например, нашли ее описание в
документации или подсмотрели у приятеля), то всегда можете выполнить команду
createNode «nodetype»
где «nodetype» - это тип ноды, который вам известен.
Например, в документации подробно описаны ноды pointOnCurvelnfo, pointOnSurfacelnfo и
closestPointOnSurface, которые вычисляют некую информацию о ближайшей точке на поверхности
или кривой. Но не существует ни пунктов меню, которые создают конкретно эти ноды, ни описания,
как и когда их применять. Эти ноды часто создаются как вспомогательные при создании некоторых
эффектов. Разобравшись в том, как они работают, можно довольно эффективно применять их в
своих корыстных целях.
Кроме того, иногда имеет смысл применять ноды «не по назначению». Например
анимационные кривые вместо текстуры ramp или основания волос (ноды follicles) вместо
констрейнов. Всем этим практическим вопросам будет посвящен дальнейший материал.
Секретные атрибуты. Изменение поведения нод по умолчанию,
путем добавления динамических атрибутов
Оказывается для некоторых нод существуют секретные динамические атрибуты, добавив
которые вы можете изменить свойства этих нод. То есть пока некоторый объект не имеет
динамического атрибута с секретным именем, он имеет одни свойства. После добавления такого
атрибута вручную, он начинает вести себя по-другому. Поиск и добавление таких атрибутов
является одним их элитных майских развлечений.
Попробуйте, например, создать плоскость и назначить на нее материал, а в качестве
текстуры цвета выбрать fractal.
Выбрав текстуру и открыв атрибуты фрактала в Attribute Editor, добавьте к ноде fractal
через меню Attributes=>Add Attributes свой атрибут с именем resolution и значением по умолчанию,
равным 96.
Обратите внимание: после добавления атрибута к ноде текстуры, качество
Архитектура
137
1Ш1
отображении текстуры на экране изменилось. Попробуйте увеличить значение
нового атрибута и посмотрите на результат.
Особенно часто такие секреты используются при рендеринге и в частности при
использовании mental ray.
Выберите mental ray в качестве основного рендерера.
Разыщите в Outliner и выделите ноду mentalrayGlobals, а затем добавить к ней четыре
динамических атрибута:
regionRectX=0, regionRectY=0, regionRectWidth=300, regionRectHeight=300.
Посмотрите теперь, что будет происходить при рендеринге сцены с помощью mental ray.
Закрепление одного объекта на поверхности другого
Рассмотрим простую задачу. Как «посадить» один объект на поверхность другого, так
чтобы пивот первого намертво приклеился к поверхности второго. При этом хотелось бы, чтобы
«приклеенный» объект еще и смотрел какой-нибудь своей осью по нормали к поверхности, на
которой он «сидит».
Как и положено в MAYA, способов решения такой задачи как минимум десять. Однако
среди них нет ни одного, позволяющего выбрать два объекта, а затем выполнить пункт меню
типа «Закрепить первый объект на поверхности второго, но быстро!». Например, Geometry
Constraint делает не совсем то, что нужно. Приконстреиненныи объект будет свободно скользить по
138
Книга Сергея Цыпцына
поверхности, а это не входит в условия задачи.
«Официальный» путь заключается в следующем: нарисовать кривую на поверхности,
запустить объект по этой кривой (Animate=>Path Animation=>Attach to Path), остановить его в
нужном месте и удалить анимацию с движения по пути. Путь хоть и исключительно гибкий и
эффективный (создаются всего две ноды: кривая и motionPath), однако пугающий своей, скажем
так, противоестественностью.
Примечание. В случае полигонов все немного сложнее, и можно скопировать ребро
как кривую, сохранив историю. Но для более точного положения на поверхности
нужно скопировать два ребра, провести через них loft, и уже на нем рисовать
кривую для движения по пути.
Посмотрим, однако, как это «неофициально» делает сама MAYA, когда ее просят об этом
неявным образом.
Рисование скриптами. Geometry Paint. Секретные заклинания
Создайте в новой сцене сплайновый тор (Create=>NURBS Primitives=>Torus).
Увеличьте его как следует (scale=7).
Теперь создайте сплайновый конус.
Переименуйте его в tree.
Сразу оговорюсь, что вместо конуса мог бы выступать любой объект или даже группа
объектов, представляющих дерево с листьями или паровоз - просто у конуса удачно расположены
пивот и локальные оси.
Теперь выберите тор и возьмите в руки инструмент рисования скриптами: Modify=>Paint
Script Tool. Как и в случае с другими инструментами рисования, следует открыть его Option Box.
В появившихся настройках инструмента следует открыть последний раздел Setup и в
первом же поле Tool Setup Cmd ввести «секретное заклинание»: geometryPaint. А далее, с чувством
глубокого удовлетворения нажать Enter...
Архитектура
139
Если вы ввели название скрипта, которым мы собираемся рисовать по поверхности без
ошибок, то остальные поля заполнятся служебными названиями. Они просто говорят: скрипт
найден, можно работать дальше.
Кроме того, обязательно должно появиться окошко с конкретными настройками для
данного скрипта. Коль скоро заданный нами скрипт осуществляет рисование объектами по
поверхности, прежде всего в поле Geometry надо ввести название объекта, которым мы будем
рисовать поверхности тора .
Введите в поле Geometry строку tree, то есть название конуса.
Кроме того, в разделе Options включите галочку Align (выровнять) и выключите опции
Group и Isolate. (Остальные опции легко исследовать «методом тыка»: помните, что во время
рисования можно контролировать не только размер, но и поворот и смещение объектов.)
Если поверхность тора по-прежнему выбрана, проведите по ней один, какой-нибудь, но
гениальный, штрих. Должна возникнуть дорожка из конусов. Трудно, конечно, устоять перед
таким продвинутым инструментом, однако не увлекайтесь сейчас новыми штрихами, это можно
будет сделать позже.
140
Книга Сергея Цыпцына
Выберите Select Tool и загляните в Outliner. Там должны появиться новые объекты.
Выбрав тор и встряхнув его, можно убедиться, что конусы приклеились к нему намертво. Более
того, деформировав конус на контрольные вершины вы можете увидеть, что они не только не
отклеиваются, но и смотрят по нормали к поверхности тор. При этом никаких вспомогательных
объектов типа кривых или констрейнов в Outliner не появилось.
Работа с секретными нодами. pointOnSurfacelnfo и rotateHelper
Выбрав любой из новых конусов, можно провести небольшое служебное расследование
всех его связей, для того чтобы выяснить, с помощью каких ухищрений он удерживается на
поверхности.
Прежде всего, можно заметить еще в Attribute Editor, что в закладке transform атрибуты
translate и rotate помечены желтым, то есть имеют входящие связи от других объектов. Там же,
в Attribute Editor, присутствуют некоторые закладки с загадочными именами типа nurbsTorusI
Geoml 88Loc и nurbsTorusI Geoml 88Align.
В этих закладках можно определить тип этих нод, pointOnSurfacelnfo и rotateHelper,
соответственно.
Архитектура
141
Как следует из документации к ноде pointOnSurfacelnfo, на вход к ней подается
информация о поверхности и два числа, U и V координаты, которые однозначно определяют
точку на поверхности. На выходе нода вычисляет трехмерные координаты этой точки, нормаль и
касательные к поверхности в этой точке. U и V координаты можно найти в Attribute Editor в виде
двух атрибутов: Parameter U и Parameter V, изменяя которые можно заставить конус перемещаться
вдоль поверхности.
Таким образом, как следует из Hypergraph, нода pointOnSurfacelnfo, созданная для каждого
конуса, вычисляет трехмерные координаты точки на поверхности тора, заданные атрибутами
Parameter U/V, и подает результат вычислений на атрибуты translate конуса, что заставляет его
всегда «приклеиваться» своим пивотом к поверхности. Тут, вроде все, понятно, за исключением,
быть может, связи между поверхностью тора и нодой pointOnSurfacelnfo.
Если описание ноды pointOnSurfacelnfo вы можете легко разыскать в документации, то вот
про rotateHelper, я боюсь, вы не найдете ничего.
В конце концов следует применить метод пристального взгляда в Hypergraph. Выбрав конус
и показав его связи в окне Hypergraph, можно сделать следующие выводы:
142
Книга Сергея Цыпцына
Нода rotateHelper служит для того, чтобы развернуть объект перпендикулярно поверхности
в данной точке. На входе она принимает от ноды pointOnSurfacelnfo вычисленные координаты
нормали и одной из касательных в точке поверхности. Эти коодинаты подаются на ее входные
атрибуты up и forward. Получив два направления, «вверх» и «вперед», нода rotateHelper вычисляет
три значения вращений, на которые надо развернуть объект, чтобы он смотрел своей локальной
осью Y вдоль направления «вверх» (up), а своей локальной осью X - вдоль направления «вперед»
(forward). Три этих значения для вращений просто присоединяются на выходе к атрибутам rotate
для конуса, чтобы он развернулся своей макушкой по нормали к поверхности, а осью X - вдоль
поверхности.
Таким образом, чтобы «посадить» один объект на поверхность, можно использовать
следующие три способа.
Первый способ: «нарисовать» объектом по поверхности, как было показано выше, затем
удалить ненужные объекты и, с помощью атрибутов Parameter U/V у ноды pointOnSurfacelnfo,
привести объект в нужное место на поверхности.
Второй: можно сделать все вручную, создав две ноды pointOnSurfacelnfo и rotateHelper с
помощью команд
createNode pointOnSurfacelnfo;
createNode rotateHelper;
После этого нужно установить связи, так же, как в вышеописанной сцене. Следует только помнить,
что для присоединения поверхности к ноде pointOnSurfacelnfo надо использовать ноду shape
поверхности, содержащую атрибут worldSpace.
Примечание. Нода rotateHelper - не «родная» для MAYA, а реализованная в виде
плагина. Чтобы она создавалась и работала без проблем, надо в окне Plugin
Manager включить галочку напротив плагина rotateHelper.
Третий способ: если работа с нодой rotateHelper вас пугает, достаточно создать и
присоединить, как положено, ноду pointOnSurfacelnfo для закрепления объекта на поверхности, а
для ориентации его по нормали можно воспользоваться Normal Constraint.
Остается, правда, открытым один довольно серьезный вопрос. Нода pointOnSurfacelnfo
работает только со сплайновыми поверхностями. А как же закрепить объект на полигональной
сетке? Можно скачать с сайта www.alias.com соответствующий Bonus Tools Pack, расширяющий
стандартные возможности MAYA. В состав этого дополнения входят такие ноды, как pointOnMeshln-
fo и pointOnSubdlnfo, реализованные, как плагины. Однако количество усилий в этом случае,
похоже, превысит разумные пределы.
Поэтому я предлагаю вам поступить иначе: просто поискать внутри MAYA некоторые ноды,
которые решили бы поставленную задачу, хотя относятся они к совершенно другой служебной
категории. Еще раз напоминаю: нижеследующая информация предназначена исключительно
для будущих технических директоров и законченных майских маньяков. Читайте на свой страх и
риск.
Использование нод не по назначению. Real Trans Objects.
Пересадка объектов вместо волос на произвольную поверхность
Коль скоро в MAYA с некоторых пор появились инструменты для работы с волосами, с
том числе и для их укладки и причесывания, то в самом устройстве «майских» волос заложена
возможность «засаживать» любую (а не только сплайновую) поверхность, и притом не только
волосами, но и произвольными геометрическими объектами.
Действительно, кратковременное ознакомление с «майской» системой волос позволяет
выяснить, что в основании каждой «волосинки» лежит «корешок», то есть нода типа follicle, которая
и определяет и положение волоса на поверхности и его ориентацию. Попробуем использовать эту
Архитектура
143
ноду для прикрепления любого объекта к поверхности, в частности к полигональной сетке.
В новой сцене создайте полигональный тор, растяните его (scale =7) и, как обычно, добавьте
в сцену сплайновый конус (или цилиндр).
Теперь без всякого контакта с динамикой волос выполните в Script Editor команду:
createNode follicle;
Обратите внимание: в Outliner тут же появится новый объект folliclel. На самом деле
были созданы две ноды: одна типа follicle, имя которой follicleShapel, а другая типа transform,
называемая folliclel. (Наиболее подкованные умы даже, возможно, сообразят, что folliclel
представляет собой DAG-объект.)
Выбрав в Outliner новый объект, можно пойти в Attribute Editor и обнаружить там две
закладки. Во второй закладке (follicleShapel) можно увидеть два атрибута Parameter U/V,
определяющих, очевидно, в каком месте поверхности должно находится основание волоса.
дело.
Вам совершенно необязательно знать динамику волос, чтобы работать дальше.
Прежде всего, надо сообщить ноде типа follicle, с какой поверхностью она будет иметь
Для этого откройте Connection Editor.
В Outliner выберите тор и нажмите стрелку вниз, чтобы выбрать его shape, содержащий
информацию о поверхности и нужные атрибуты.
Нажмите в Connection Editor кнопку Reload Left, чтобы загрузить атрибут pTorusShapel в
левую панель.
Затем выберите в Outliner объект folliclel и опять нажмите стрелку вниз, чтобы выбрать
ноду типа follicle (follicleShapel), а не transform.
Нажмите в Connection Editor кнопку Reload Right.
144
Книга Сергея Цыпцына
Сначала соедините атрибут World Matrix ноды pTorusShapel с атрибутом Input World Matrix
ноды follicleShapel.
Затем также присоедините атрибут OutMesh слева и атрибут Input Mesh справа.
Теперь нода follicleShapel «знает», с какой поверхностью она работает, и потому будет
однозначно вычислять трехмерные координаты точки, заданные атрибутами Parameter U/V.
Архитектура
145
В принципе осталось присоединить эти вычисляемые значения к конусу, чтобы «посадить»
его на поверхность.
Для этого достаточно загрузить ноду foUicleShapel в левую панель Connection Editor (не
забываете про стрелку вниз), а конус - в правую панель.
Далее надо присоединить атрибуты Out Translate и Out Rotate слева, соответственно, к
атрибутам Translate и Rotate конуса справа.
Конус мгновенно «прыгнет» на поверхность и повернется так, чтобы смотреть по нормали
к поверхности своей локальной осью Z.
146
Книга Сергея Цыпцына
Дальше, конечно, можно быстро поколдовать с локальными осями, чтобы развернуть конус
макушкой по нормали (например, в Attribute Editor задать для конуса Rotate Axis=90 0 0.)
Однако можно использовать более гибкий и функциональный подход.
Отсоедините в Connection Editor атрибуты конуса от ноды follicleShapel.
У нас в сцене «пропадает» целый transform по имени folliclel, который грех не использовать.
Глазастые, умы наверное, уже заметили на экране специальную иконку для него.
Выберите folliclel в Outliner и загрузите его в правую панель Connection Editor.
Затем присоедините атрибуты Out Translate и Out Rotate ноды follicleShapel слева,
соответственно, к атрибутам Translate и Rotate ноды folliclel справа.
Теперь folliclel, а не конус разворачивается перпендикулярно поверхности. Но зато теперь
можно припарентить к folliclel наш конус и потом уже развернуть его, как нам нужно.
Перетащите и бросьте в окне Outliner конус на folliclel средней кнопкой мыши.
Архитектура
147
Преимущество такого подхода состоит в том, что мы теперь можем дополнительно вращать
или смещать конус относительно точки «закрепления» на поверхности. Задайте для конуса rota-
teX=90, и он развернется макушкой вдоль нормали к поверхности тора.
Чтобы задать положение конуса на поверхности, надо выбрать folliclel и в Attribute
Editor, во второй закладке, установить нужные значения атрибутов Paramete U/V, задающих UV-
координаты точки на поверхности. Задайте ParameterU=ParameterV=0.5, и конус переместится на
внешнюю часть тора.
Примечание 1. Как видите, нода follicle работает не только со сплайновыми
поверхностями, но и с полигонами. Однако вы должны понимать, что в отличие
от сплайнов, полигональные поверхности не всегда имеют хорошие и равномерно
распределенные UV-координаты, поэтому вам надо заранее позаботиться о том,
чтобы в том месте поверхности, куда вы собираетесь «сажать» ваши объекты,
были адекватные значения UV-координат.
Примечание 2. Большое преимущество такого подхода в том, что в разделе Extra
Attributes у ноды follicle есть атрибут Map Set Name, позволяющий задать, из
какого UV-набора будут использоваться UV-координаты для определения положения
точки на поверхности.
Примечание 3. В случае сплайновых поверхностей вместо атрибута outMesh надо
присоединять атрибут Local от поверхности к атрибуту Input Surface ноды
follicle.
Полученная сцена сохранена как follicleConstraint.ma. Вы всегда можете открыть ее, как
образец, и исследовать связи между объектами в Hypergraph.
Таким образом вы не должны ограничивать себя использованием только «легальных» нод,
148
Книга Сергея Цыпцына
№
по их прямому назначению. Ведь AAAYA - это конструктор, поэтому если какой-то объект или нода
подходят для выполнения «не свойственных» им задач, смело используйте их в своих целях.
Примечание. Самые проницательные умы конечно же, обнаружат в тайниках
MAYA вяло документированные ноды furPointOnMeshlnfo и furPointOnSubd. Никто
не может запретить вам использовать их для решения только что описанной
задачи. Эти же ноды позволяют также определить, в пределах какой грани (faceln-
dex) вы хотите задать точку на поверхности.
Рассмотрим далее еще один пример «нелегального» использования нодовой архитектуры.
Цветокоррекция.
Использование анимационных кривых не по назначению
Для получения качественной картинки почти всегда в шейдерах приходится использовать
разного рода текстуры, и в первую очередь текстуры для цвета. И почти всегда исходный материал
для них приходится дорабатывать. Отчасти из-за специфики освещения (свет может быть
сильным или даже цветным), отчасти для того, чтобы добиться точного цветового баланса между
различными составляющими сцену объектами при рендеринге. Определенным образом можно
«подправить» цветовой баланс используемой текстуры в Attribute Editor с помощью атрибутов
из раздела Color Balance, но для более сложных правок приходиться пользоваться внешними
программами, например, это Photoshop.
Однако, если на канале цвета появляется не просто файловая текстура, с которой легко
поработать в программе Photoshop, а целая сетка из процедурных и файловых текстур и утилит,
то перед присоединением этой сетки материалов к каналу цвета хочется слегка поправить ее
результирующий цвет . Потренируемся на простой сцене с одной файловой текстурой.
Откройте новую сцену.
Откройте HyperShade и выделите материал lambertl.
Перетащите его в рабочую область HyperShade и увеличьте его изображение.
Выбрав его, откройте Attribute Editor и назначьте на канал цвета какую-нибудь файловую
текстуру. Возьмите, например, стандартное изображение:
X:\Program Files\Alias\MayaN.N\brushlmages\wrapCloud.iff
Можно заметить, что текстура назначилась не только на цвет, но и на прозрачность (это
ненавязчивый «майский» сервис, распознающий альфа-канала в назначаемом изображении.)
Выберите в HyperShade материал lambertl и покажите его входные связи (Graph=>lnput
Connections.)
Выделите связь, идущую на прозрачность материала (transparency), и удалите ее, чтобы
лучше видеть текстуру, назначенную на цвет.
Попробуем встроить в наш материал конструкцию, функционально повторяющую известный
и один из наиболее общеупотребительных инструментов Photoshop'a: Adjust Curves.
Очевидно, что между нодой filel и нодой lambertl надо вставить некие кривые, которые
будут модифицировать полученный из текстуры цвет и отдавать его материалу lambertl.
Архитектура
149
Первое, что приходит на ум, это анимационные кривые, которые можно удобно
редактировать. Коль скоро анимационные кривые также являются нодами с своими атрибутами,
надо просто создать их и вставить между текстурой и материалом, установив необходимые
связи.
Вопрос в том, как создать «пустые» анимационные кривые? Можно, конечно, установить
ключи на какой-нибудь объект, а потом убрать в Hypergraph все связи анимационной кривой с
другими нодами (в данном примере понадобились бы ключи и анимационная кривая от инструмента
Set Driven Key). Однако проще сделать кривые с помощью команды createNode, создающей ноды
определенного типа.
Итак, откройте Script Editor и выполните три набора команд, создающие три анимационные
кривые, которые позволят нам модифицировать каждый из цветовых каналов (RGB) текстуры:
createNode animCurveUU
setKeyframe -f 0 -v 0;
setKeyframe -f 1 -v 1;
n redColorCorrectionCurve;
createNode animCurveUU -n greenColorCorrectionCurve;
setKeyframe -f 0 -v 0;
setKeyframe -f 1 -v 1;
createNode animCurveUU -n blueColorCorrectionCurve;
setKeyframe -f 0 -v 0;
setKeyframe -f 1 -v 1;
Обратите внимание, что после каждой команды createNode следует пара команд
setKeyframe, расставляющая два ключа на только что созданной кривой. Можно, конечно, было бы
пытаться добавить ключи к пустой анимационной кривой «вручную», через Graph Editor, но
поверьте мне: выполнить две MEL-команды гораздо проще. Длинные имена после флага -п для
создаваемых кривых совершенно ни к чему, это, так сказать, эстетские выкрутасы.
Теперь мы должны разорвать связь атрибутов filel.outColor и lambertl.color, затем
выход каждого из цветовых каналов текстуры (красного, синего и зеленого) подать на вход
соответствующей анимационной кривой, а затем выходы анимационных кривых подать на
соответствующие цветовые каналы материала lambertl.
Выделите и удалите связь между filel.outColor и lambertl .color в HyperShade.
Затем откройте Connection Editor, выделите текстуру filel и загрузите ее в левую панель
Connection Editor.
Для того, чтобы быстро разыскать созданные анимационные кривые, откройте Outliner и
снимите в его меню галочку DAG Objects Only.
150
Книга Сергея Цыпцына
Выбрав затем redColorCorrectionCurve, загрузите ее в правую панель Connection Editor.
Соедините Out Color R слева и Input справа.
Проделайте тоже самое с кривыми greenColorCorrectionCurve и blueColorCorrectionCurve,
загрузив их в правую панель Connection Editor и присоединив их атрибут Input к атрибутам текстуры
Out Color G и Out Color В, соответственно.
Совет. Можно загрузить в правую часть Connection Editor сразу несколько
выбранных объектов, чтобы сэкономить время и соединить несколько атрибутов
одновременно.
Архитектура
151
Теперь подсоединим кривые к материалу lamberti. Выберите все три анимационные
кривые в Outliner и загрузите их в левую часть Connection Editor. Для удобства можете выполнить
Left Display=>Outputs Only. Затем выберите lamberti и загрузите его в правую часть Connection
Editor.
Присоедините аттрибут Output анимационной кривой redColorCorrectionCurve к каналу
(атрибуту) Color R материала lamberti. Проделайте то же самое с кривыми greenColorCorrectionCurve
и blueColorCorrectionCurve, соединяя их атрибут Output с Color G и Color В, соответственно.
Если взглянуть на связи в HyperShade, то выглядеть это будет примерно так:
Коль скоро на вход одного из атрибутов материала lamberti приходят связи от анимационных
кривых, то можно выбрать его, а затем открыть окно Graph Editor и увидеть анимационные кривые
для каждого цветового канала. (Только не забудьте нажать клавишу «f».)
Выбирая каждый канал в Graph Editor, можете отредактировать соответствующую кривую
всеми известными способами. Результат будет моментально отражаться в HyperShade.
152
Книга Сергея Цыпцына
Таким образом, с помощью анимационных кривых мы получили привычные кривые для
цветокоррекции. Вы можете расставлять и удалять ключи на них, как вам угодно, в том числе
добиваясь экзотических эффектов.
Примечание. Если связи присоединяются к индивидуальным каналам цвета
материала (как в нашем случае), то MAYA плохо обновляет цвет материала
на экране в окне камеры. Чтобы избежать этой проблемы, надо собрать три
входящих в цвет атрибута и преобразовать их в один «тройной» атрибут, а
потом уже подать «целиком» на цвет материала. В нашем случае это можно
сделать, например, создав ноду-утилиту Multiply Divide, задав ей Operation=No
Operation, и присоединив выходы - атрибуты Output - от анимационных кривых на
атрибуты Input 1Х, Input 1Y, Input 11, соответственно. Выход этой утилиты, то
есть «тройной» атрибут Output, надо присоединить к атрибуту Color материала
lamberth
Приведенный пример еще раз подчеркивает, что вы не должны ограничивать себя только
«документированными» способами построения дерева сцены. Для создания сети материалов вы
вправе использовать не только утилиты из меню Create окна HyperShade, но ноды других типов,
которые решают поставленную вам задачу. И наоборот, вы можете использовать текстуры для
управления совсем не «текстурными» свойствами объектов, например, количеством испускаемых
с поверхности частиц.
Архитектура
153
Изучение MAYA.
Методы оперативного вскрытия и анализа внутренностей.
Сценарии исследования MAYA
Итак, вникнув в общую логику устройства «майской» сцены и вооружившись концепцией
дерева зависимостей, далее вы вполне можете изучать MAYA самостоятельно. Напомню еще раз:
при изучении новых модулей, инструментов, плагинов или чужих сцен вы всего лишь должны
понять, какие ноды являются базовыми и каков тип этих нод (это позволит ознакомиться с их
описанием в документации), а самое главное - какие атрибуты содержатся в этих нодах и каково
их предназначение.
Кратко обрисую возможные пути изучения некоторых модулей.
Paint Effects. Необходимо изучить всего две ноды: штрих (тип stroke) и кисть (тип brush). Конечно,
количество атрибутов ноды brush велико (их более трех сотен), однако не нужно изучать ничего,
кроме свойств этих двух объектов. Большинство операций из меню Paint Effects работает с
атрибутами ноды brush, изучив устройство которой, вы легко поймете, как они работают.
Fluid Effects. Еще проще. Все свойств нового объекта зашиты в нем самом. Контейнер (нода
типа fluidShape) содержит в себе атрибуты, описывающие не только положение его в пространстве,
но и все динамические свойства, визуальные характеристики, параметры текстурирования и
даже алгоритмы просчета уравнений движения сплошной среды. Алгоритмы рассортированы по
разделам и все, что вам надо сделать - это как следует их пошевелить, делая выводы, о том, какое
предназначение они имеют.
Динамика твердых тел. Нетрудно заметить, что на каждом объекте, превращенном в
твердое тело, появляется некая «скорлупа» - нода типа rigidBody, которая содержит в себе набор
атрибутов, определяющих именно динамические свойства твердого тела, такие, как упругость
или масса. Игра с этими атрибутами позволяет быстро выяснить их назначение. (Атрибуты с
неочевидными свойствами описаны в документации к ноде rigidBody.) Изучение связей этой ноды
в Hypergraph позволяет обнаружить еще одну важную ноду типа rigidSolver, ответственную за
просчет движения всех твердых тел в сцене. Знание ее атрибутов необязательно, но желательно,
так как понимая предназначение ее атрибутов, вы сможете решать проблемы с той точностью, с
какой производится обсчет траекторий и коллизий.
Создав пару полей, вы можете заметить, что все они устроены практически одинаково и
имеют большой набор общих атрибутов. «Методом тыка» по отношению к этим атрибутам можно
быстро разобраться с полями.
Динамика частиц. Большинство свойств частиц, как динамических так и визуальных,
собраны в одной ноде типа particleShape. Источники частиц (ноды типа emitter) также имеют
набор вменяемых атрибутов, хорошо поддающихся дрессировке. Конечно, от знания expressions
для частиц вас никто не освобождал, но следует помнить, что такие expressions, как правило,
модифицируют значения атрибутов (скорости, ускорения и пр.), назначение и тип которых надо
понимать.
MAYA Fur. Все основные свойства меха сосредоточены в ноде типа FurDescription. Можно
рассматривать ее как большую процедурную текстуру. Изучив параметры такой текстуры, можно
довольно быстро освоится с «майским» мехом. Конечно, работа с картами атрибутов меха
требует некоторого времени для освоения и понимания, однако вам не придется сталкиваться с
многочисленными вспомогательными объектами. Вся работа с мехом выполняется, как правило, с
помощью Attribute Editor для ноды FurDescription и инструмента Fur Paint Tool, меняющего атрибуты
этой ноды. Свойства специального рендерера для визуализации меха также сосредоточены в
одном месте, в ноде типа FurGlobals, атрибуты которой довольно внятно описаны в документации
(иногда в документацию заглядывать придется, особенно когда речь заходит про рендеринг).
MAYA Hair. Совершенно шикарная и стройная концепция. Всего две ноды определяют
поведение и внешний вид волос. Общие свойства прически задаются нодой типа hairSystem,
154
Книга Сергея Цыпцына
№
включая форму, цвет, физические свойства и параметры численного просчета траекторий.
Индивидуальные свойства каждой «волосины» определяются атрибутами ноды типа follicle.
Встроенная в ноду hairSystem гравитация и турбулентность, а также способность к отслеживанию
столкновений, позволяет почти не привлекать стандартную динамику и сосредоточиться на
работе с атрибутами только двух нод. Большинство операций в меню Hair предназначены для
удобства выбора и отображения системы волос, основная работа же производится опять-таки с
атрибутами.
К сожалению, часть MAYA, касающуюся моделинга и анимации, не удастся так же ловко
описать, пользуясь концепцией работы с атрибутами базовых нод. Форма объекта определяется
набором точек, редактируемых, как правило, вручную (никто, кроме программистов, не пытается
изменять атрибут inMesh!), а вид анимации задается набором ключей, которые также проставляются
в основном вручную. Количество вспомогательных объектов и операций для моделирования и
анимации чудовищно велико, поэтому и освоение этих областей MAYA требует и времени и усилий,
несопоставимых с другими модулями. Но делать нечего - из MAYA слова не выкинешь. В дальнейших
главах я попробую взглянуть на моделирование и анимацию изнутри и попытаться описать логику
использования инструментов и ключевые понятия, лежащие в основе их «майской» реализации.
Догоняя MAYA
Благодаря MAYA, мне довелось много путешествовать. Первая вылазка была в ноябре 1997
года на тренинг по MAYA в Лондоне. Главным техническим специалистом в компании, где я тогда
работал, был Леша Плотников, человек добрейшей души и центнера весу. Именно он и должен
был поехать учиться, и на вопрос начальства: «Леша, поедешь на учебу в Лондон?», Леша широко
улыбался и мечтательно растягивал: «Да-а-а-а!...». Однако в ответ на следующий вопрос: «А что
у тебя с загранпаспортом?», Леша вдумчиво мял свою шикарную бороду и, как настоящий митек,
отвечал: «Ну, дык, ведь, елы-палы, типа, паспорт, кхгм...». Что означало: паспорта нет, но он
постарается.
И в результате в Лондон поехал я. В аэропорту Хитроу таксист спросил меня, куда ехать,
на таком английском, что я подумал, будто перепутал самолеты и улетел в другую страну,
языка которой не знаю. Позже выяснилось, что это был «кокни» (лондонский диалект), но тогда
я всерьез призадумался, а пойму ли хоть слово на будущих занятиях. Занятия, впрочем, мало
походили на учебу, несмотря на то, что сидеть пришлось всего по двое за одной станцией SGI
Indigo. Все равно это больше напоминало групповую медитацию или массовое просветление. Франк
Китцен показывал какие-то такие невероятные вещи в MAYA, что со всех сторон неслось: «Не
может быть!», «Конец глазам!», «Разбудите меня!», «Фрэнк, давай еше!». И Фрэнк давал еще...
Так продолжалось три дня. С тех пор я перестал играть в компьютерные игры. Есть только одна
игра, и я привез ее из Лондона...
Второе «майское» путешествие было более замысловатым. Началось все с того, что завис
компьютер. Причем не мой, а в немецком посольстве, где мой паспорт ждал проставления в нем
визы. Не знаю, что это был за мегакомпьютер, но висел он не час и не два, а ровно три дня.
Партсобрание компании Alias IWavefront проходило тогда в Испании, в местечке Марбейя около
Малаги, поэтому без шенгенской визы туда было никак не добраться. Дима Озерец, с которым
мы должны были вдвоем лететь в январскую Испанию, счастливый обладатель трехгодовой визы,
утром уехал в Шереметьево, ехидно заметив, что мероприятие начинается на следующий день в
10 утра, и было бы любопытно посмотреть, как я собираюсь успеть к началу, не имея не то что
билетов, но и визы на руках. Ласково глядя ему вслед, я уныло поплелся в посольство, вызволять
свой незавизированный паспорт. Там, однако, мне сообщили, что ультракомпьютер заработал,
и выдали мне визу в течение пяти минут. И вот в два часа дня я стою на улице Кравченко и
соображаю: как же успеть на встречу с MAYA завтра в 10 утра?
Марш-бросок в Шереметьево и опрос девушек, продающих билеты, показал, что все
рейсы в Испанию на сегодня давно улетели. «А куда еще не улетели? Дайте билет на попутный
самолет!», истошно вопрошал я, лихорадочно прокладывая в голове маршрут в сторону Испании.
Очаровательно улыбаясь, девушки отправили меня последним самолетом в Мюнхен. Разница во
времени работала на меня, и в аэропорту Мюнхена я снова общался с девушками и ловил попутный
самолет. Он был только до Барселоны. Я летел над Пиренеями поздним вечером и соображал,
Архитектура
155
как же проехать восемьсот километров от Барселоны до Малаги: автостопом или на поезде,
совершенно не предполагая, что самолеты могут летать по ночам. Однако совершенно случайно,
в самолете Мюнхен-Барселона, в тот момент, когда все уже нетерпеливо толпились в проходе в
ожидании трапа, я вдруг обнаружил соотечественника, давно живущего в Испании и знающего,
в каком направлении надо совершить забег по безумному аэропорту Барселоны, чтобы попасть
к кассам внутренних авиалиний. Забег (не меньше километра) был совершен, и я в третий раз
умолял очередных девушек устроить меня на аэропопутку. И хотя билетов не было, лист ожидания
был открыт, и через час я уже сидел в довольно забавном самолете, берущем курс на Малагу.
Проехать оставшиеся 60 ночных километров оказалось делом техники, отточенной еще в Москве
до совершенства, и в два часа ночи я застал участников грядущего семинара, идущих из бара
нетвердой походкой. Видели бы вы лицо Димы...
Семинар удался, до выхода первой версии MAYA оставалось два месяца, и все демонстрации
возможностей MAYA воспринимались, как соприкосновение с чем-то сакральным и потусторонним.
Все ждали чуда и были переполнены самыми невероятными иллюзиями. Время было удивительное,
и Artisan тогда еще назывался Jasper...
Возвращение обратно было не менее замысловатым. Я уговорил Диму вылететь на
сутки позже из Мадрида, а освободившийся день использовать для поездки в Сьерра-Неваду,
аргументируя, что это как раз по пути. Я давно мечтал попасть на этот самый южный горнолыжный
курорт Европы, у меня просто в голове не укладывалось, как в семидесяти километрах от моря
могут существовать горы высотой более трех километров и все это - прямо напротив марокканского
побережья Африки (http://www.iespana.es/sierra-nevada/). Мы взяли напрокат маленький «Фиат»
и двинулись на восток, вооруженные картой и моим оптимизмом. По дороге Дима не один раз
пристально поинтересовался, а не будет ли осложнений на дороге при подъеме на такую высоту
(ведь именно он сидел за рулем), и я с видом коренного тореадора уверенно отвечал, что дорога
будет просто шикарная. Действительно, первые 150 километров оказались чудовищно хороши, в
Гранаде мы набили багажник изумительным вином "Malaga" и начали углубляться в материк. Я
по-прежнему обещал чудесную дорогу до самой Сьерра-Невады и остервенело изучал карту. Все
было просто прекрасно, правда, когда до цели оставалось двадцать километров, пошел мелкий
дождь. Минут через 15 он превратился в уверенный ливень и Дима начал нехорошо посматривать
на меня. Вдобавок моментально стемнело, и фары маленького «фиата» с трудом выхватывали
горную обочину из хлещущего в темноте ливня. Когда указатель сообщил, что до цели - пять
километров, дождь без всяких предупреждений превратился в снег. Дорога кучеряво лезла
вверх, но наша машина цеплялась за нее всеми колесами... Дабы не пугать себя, я старался не
поворачивать голову в сторону Димы и тщательно считал стометровые столбики, которые были
пусть с трудом, но видны. Когда, по моим подсчетам, мы должны были въехать в поселок, снег
превратился в настоящий буран, и мы, естественно, проскочили поворот в кромешной тьме,
продолжая карабкаться куда-то в тучи. Подозрительным казалось также полное отсутствие машин
на дороге в течение уже довольно длительного времени. В салоне было тепло и темно, и лишь
побелевшие костяшки водительских пальцев, судорожно вращавших руль, освещали озверевшее
лицо Димы. Когда появился непредвиденный поворот, мы обнаружили, что, проскочив въезд в
поселок, мы взобрались на уровень первой очереди подъемников и перед нами открылся туманный
вид освещенного поселка, лежащего прямо внизу перед нами. Причем буран неожиданно стих или
просто остался за спиной, а вниз, в поселок, по склону сбегала практически прямая дорожка.
Сбегать-то сбегала, но прямолинейность дороги с лихвой компенсировалась ее крутизной.
Сколько Дима ни пытался остановить машину, это было бесполезно. Маленький «Фиат», набрав
снега под колеса, вскоре превратился в детские санки, неторопливо ползущие вниз и никак не
реагирующие на усилия водителя. В ответ на повороты руля санки вяло рыскали, кое-как позволяя
уворачиваться от запаркованных по обочинам машин. Машины были засыпаны снегом, одеты в
цепи и являли собой образец благоразумия. Хорошо, что в конце дороги был здоровенный сугроб,
в который мы мягко ткнулись, крайне удачно при этом запарковавшись.
Если бы у водителя еще оставались силы, я вряд ли писал бы сейчас эти строки...
За ужином мы раздумывали, где раздобыть цепи и как выбраться отсюда, поскольку
наш самолет улетал из Мадрида, который находился где-то на полтыщи километров севернее.
Однако солнечным утром мы обнаружили абсолютно чистую дорогу с остатками тающего снега.
Это позволило нам с легким сердцем откататься полдня в удивительных горах Сьерра-Невады и
без проблем домчаться до Мадрида за три с небольшим часа. Второе майское путешествие было
закончено, и в Москве меня ждала седьмая бета-версия MAYA 1.0...
156
МОДЕЛИРОВАНИЕ
1АМША
Немного «воды»
Трехмерное моделирование можно довольно условно определить как процесс создания
геометрических форм (поверхностей и кривых) для их последующей анимации и визуализации.
Можно также условно выделить два крупных направления в трехмерном моделировании: создание
реалистичных моделей для компьютерного дизайна и построение моделей для трехмерной
анимации. К моделям для дизайна предъявляются, как правило, повышенные требования с точки
зрения реалистичной визуализации и точной передачи форм объектов. Сюда же следует отнести и
такое направление, как архитектурное моделирование. Можно, однако, с известной долей цинизма
сказать, что для дизайна не так важно, как модель устроена или изготовлена, главное - чтобы она
хорошо выглядела. (Представляю, как возмутятся некоторые дизайнеры...)
Однако такой циничный подход неприемлем при изготовлении моделей для анимации, ибо
их основные критерии качества - «легкость» и «управляемость». Понятно, что супер-реалистичную
модель, составленную из пары миллионов полигонов, вряд ли можно назвать легко анимируемой:
в общем случае анимация предполагает деформацию, производительность которой напрямую
зависит от количества компонент модели.
Поскольку MAYA позиционируется в основном как средство для анимации и спецэффектов,
набор ее инструментов моделирования в основном предназначается - или, как говорится, «заточен»
- для создания «хороших» моделей для анимации. По моему субъективному мнению, MAYA не
является идеальным инструментом для промышленного дизайна и, несмотря на шикарный набор
средств сплаинового моделирования, не может обеспечить выполнения всех требования к форме
и точности моделируемых поверхностей в этой отрасли. Для таких задач существуют специальные
пакеты типа Alias Studio, способные адекватно решать соответствующие проблемы.
Еще чуть-чуть «воды»
Моделирование трехмерных поверхностей вполне естественно сравнить с такой областью
изобразительного искусства, как скульптура. Поэтому если у вас есть хотя бы небольшой опыт
лепки, создания объемных изображений из обычных материалов (пластилина, глины и т. п.), это
сослужит вам хорошую службу и в освоении программы. Кроме того, привычка и умение делать
наброски будущей трехмерной модели на бумаге перед началом работы сэкономят вам массу
времени и улучшат качество ваших моделей. Многие «трехмерщики», однако, имеют манеру
моделировать «из головы», мотивируя это недостатком времени. Имейте в виду: подобная
экономия времени в начале процесса оборачивается, как правило, многочисленными переделками
на поздних стадиях и сводит на нет эту, пресловутую «экономию».
История моделирования, но не Construction History
Давным-давно трехмерные модели были исключительно полигональными, поэтому
у компьютерных художников не было особых проблем с выбором подходящих инструментов
моделирования. Рахитичные компьютеры того времени еле ворочали скудное количество полигонов
по экрану, так что моделировать приходилось частично вслепую, оценивая результат лишь по
итогам рендеринга. Однако пытливые умы из рядов инженеров-конструкторов разработали для
своих секретных нужд программы типа CAD (Computer Aided Design, дословно «дизайн с помощью
компьютера»). Эти программы использовали параметрическое представление поверхностей и
дали миру инструменты сплаинового моделирования. История умалчивает, как все было на самом
деле, однако, по-видимому, группа товарищей-художников, зайдя «на чашку пива» к группе
приятелей-инженеров, увидела в одночасье, что форму сложной поверхности можно гладко
изменять с помощью лишь нескольких контрольных точек. Вот тут вся художественная команда
явно призадумалась... В результате, так или иначе, появился новый класс методов моделирования
и началось победное шествие сплайновых инструментов в индустрии компьютерной графики. К
слову сказать, еще в 1999 году, когда я обучался в компании Alias - тогда еще Wavefront, сплайновые
инструменты позиционировались как оружие будущего, а полигоны - как скромные труженики
села. Про сабдивы тогда никто вслух еще не говорил. Боялись.
158
Книга Сергея Цыпцына
№
Тем не менее, за прошедшие пять лет концепция создания трехмерных моделей несколько
изменилась. Во многом благодаря возросшей мощности компьютеров и новым методам вычисления
неявных поверхностей.
Методы моделирования
Имеет смысл еще немного поговорить о различных методах создания трехмерных форм
и их адекватном применении. Дальнейшие рассуждения отражают моё субъективное мнение на
этот счет и никак не могут считаться категорическим императивом.
Так вот, вернемся к истории. Сплаиновые поверхности имели массу достоинств перед
полигонами. Прежде всего они были потрясающе легкие - при помощи нескольких контрольных
точек, можно было задавать формы, требовавшие сотен и тысяч вершин в полигональном
представлении. (Все написано в прошедшем времени для усиления литературного эффекта, но
они, сплаиновые поверхности, и сейчас все еще легкие.) Сплайны имели идеальные текстурные
координаты, в отличие от адского процесса UV-маппинга полигонов. Они позволяли создавать
гладкие сопряжения между поверхностями без всякой ручной работы! Их можно было гладко
резать (тримировать). Список можно продолжить, читая рекламные брошюры тех лет.
Однако у сплайнов был маленький недостаток по сравнению с полигонами - объект не мог
иметь произвольную топологию (или, если попроще, форму). Любая сплайновая поверхность всегда
обязана быть сеткой из изопарм. Иначе говоря, сеткой из взаимно пересекающихся «параллельных»
кривых. Даже сплайновая сфера представляет собой сетку из меридианов и параллелей, состоящую
из прямоугольных ячеек. По-другому можно сказать, что сплайновую поверхность всегда можно
развернуть в прямоугольную сетку, или наоборот, свернуть из прямоугольной сетки.
Этот маленький недостаток наложил существенное ограничение на применение
сплайнов для, например, органического моделирования. Оказалось, что обыкновенную руку
можно представить, как минимум, с помощью одиннадцати объектов (сферическая ладонь,
пять цилиндрических пальцев и еще пять соединений между ладонью и пальцами ) и что эти
поверхности в принципе нельзя превратить в один сплайновый объект. На примере истории
развития MAYA можно сказать, что развитие инструментов сплайнового моделирования было
направлено на преодоление, а точнее на компенсацию этого недостатка. Появлялись методы,
позволяющие подтягивать и гладко сшивать края нескольких поверхностей, возник термин
«патчевое моделирование». Вершиной компенсации стал инструмент Stitch, позволяющий не
только бесшовно сшивать края поверхностей, но и удерживать эти края в гладко-сшитом состоянии
при последующих деформациях поверхностей. С помощью таких инструментов стало возможным
в принципе делать отличные модели персонажей. Вот только состоят такие модели из десятков
патчей, и при анимации основной задачей становится оберегание этих кусков от разъезжания
и сгибов. Кроме того, при попытке добавить детали в конкретную область модели приходится
перестраивать не только нужный патч, но и зачастую всю «сшитую» модель. (Оговорюсь на всякий
случай, здесь и далее речь идет о майских сплайнах.)
Поэтому сплайновое моделирование все меньше стало походить на процесс работы
скульптора и сильно напоминать работу инженера (даже при моделировании органических или
«непромышленных» форм). Художнику приходится удерживать в голове много технических
понятий, таких, как параметризация, степень гладкости, непрерывность по кривизне и пр.
Борьба за минимальное количество контрольных точек и топологическую «правильность» модели
приводит к тому что ее «легкость», с точки зрения анимации, теряет смысл. А моделирование
персонажей при помощи сплайнов больше напоминает конструирование персонажей.
Один из моих лучших учеников, Миша /1апицкий, человек с великолепным художественным
образованием и талантом, приходя в ужас от излагаемых мной кошмаров - от всяческих «бирэйлов»
(birail), «стичей» (stitch) и «алайнов» (align), просто брал сплайновый цилиндр, сгибал его так, чтобы
один край цилиндра принимал форму шеи, а второй сужался в область ротового отверстия. Затем
в течение получаса, добавляя, где надо, дополнительные ряды контрольных точек, Миша лепил
потрясающие, выразительные головы, заявляя при этом, что никогда скульптору не понять различия
Моделирование
159
между типами параметризации поверхностей и что он хочет просто моделировать персонажей, а
не делать бесконечный «ребилд» (rebuild)... И пусть его модель была «неправильная» (то есть
имела массу лишних контрольных точек в неиспользуемых областях), но еще через полчаса дл^\
нее появлялись «блендшейпы» (blendshapes) для морфинга, и модель начинала говорить, причем
не надо было бояться, что где-нибудь могут разъехаться швы между патчами. (Вышеупомянутый
метод моделирования хорошо известен и называется sock-head. Я подозреваю, что его придумали
художники, озверевшие от «инженерности» сплайнов. И до сих пор продолжают придумывать
другие методы...)
Смысл моих эмоциональных и субъективных эскапад, сводится к тому, что единственное
скромное преимущество полигонов перед сплайнами (а именно, возможность поверхности иметь
произвольную внутреннюю топологию) не может быть скомпенсировано никакими изощреннейшими
сплайновыми инструментами.
И тут появились сабдивы...
Терминологичекий комментарий. Если с полигонами все понятно, и даже военно-
патриотический термин «многоугольники» практически не путает пользователей,
то в отношениий сплайнового моделирования в народе употребляется масса
терминов: «нурбсы» (NURBS), «сплайны», «Безье», «патчи», кто-то слышал
даже про формы Эрмита и кубические параболы. Термин «сплайны» означает
параметрические кривые и поверхности, которые бывают разных типов. Самый
сложный и гибкий класс называется NURBS (non-uniform rational b-splines).
«Би-сплайны» означает, «базовые сплайны», здесь буква b означает basic.Это
специальный тип сплайнов, которые могут быть быстро вычислены как сумма
базовых функций. Он был придуман еще в 1946 году, однако методы быстрого
рекурсивного вычисления би-сплайнов появились только 1972 году.
Слово «неравномерные» (non-uniform) означает возможность неравномерной
параметризации вдоль протяженности поверхности, хотя в основном работа
ведется с равномерными (uniform) сплайнами.
«Рациональные» (rational), означает, что котрольные точки могут иметь
разные веса и притягивать к себе поверхность по-разному, хотя опять же, по
умолчанию работа в MAYA ведется с нерациональными поверхностями и кривыми,
веса точек у которых одинаковы.
Кривые и патчи Безье - более примитивный подкласс NURBS, в котором возможно
редактировать объекты только в конкретных узловых (knot) точках. В MAYA этот,
более простой тип сплайнов не используется для моделирования. Таким образом,
термины «сплайновые объекты» и «NURBS-объекты» являются синонимами (по
крайней мере, в этой книге).
Термин «патчи» применительно к MAYA имеет двоякое значение. Во-первых,
это просто NURBS-поверхности, как правило с гладко сшитыми краями, лоскутно
составляющие модель. Отсюда и термин «патчевое моделирование». Во-
вторых, патчами формально называются компоненты сплайновых поверхностей,
представляющие собой ячейки в сетке изопарм. Практическое применение патчей-
компонентов мне лично неизвестно, разве что для экспорта в спецпрограммы,
работающие с такими лоскутами.
Термин «сабдивы» окончательно прижился для обозначения subdivision
surfaces, или «поверхностей разбиения» (это, правда, довольно неуклюжий термин:
лучше уж было их назвать «поверхности сглаживания»). На сабдивах мы как раз и
остановились перед этим, развернутым комментарием.
160
Книга Сергея Цыпцына
№
Несмотря на то, что реально сабдивы впервые появились в застенках секретных лабораторий
и в работах Кэтмулла и Кларка еще в 1976 году, рассекретили их лишь несколько лет назад.
Почему так и - что же такое сабдивы?
Представьте себе полигональный кубик (можете даже создать его в MAYA). Примените к
нему мысленно или на практике полигональную операцию Smooth (сглаживание). Затем примените
ее еще несколько раз. На десятой попытке, в паузе между операциями Smooth, можно без особой
спешки попить чайку, на одинадцатои - сбегать в ближайшие кассы за билетом в Феодосию, а вот
на двенадцатой паузе можно уже прекрасно провести время на море и, вернувшись после отпуска,
обнаружить на экране гладкую сферу с некоторым количеством вершин. А теперь представьте,
что будет после применения беконечного количества операций smooth. Результатом и будет
subdivision surface, или сабдив.
Математические методы, позволяющие быстро вычислять subdivision surfaces, появились
лишь недавно, и это радикально изменило подход к трехмерному моделированию многих типов
объектов.
Дело в том, что subdivision surfaces обладают такой же степенью гладкости, как и NURBS.
Полу-математически говоря, любой сабдив может быть представлен как набор гладко стыкующихся
кубических NURBS-патчей. Но при этом он остается одной поверхностью!
Следовательно, subdivision surfaces унаследовали все преимущества сплайнов плюс одно
маленькое, скромное обаяние полигонов.
Поэтому моделирование в сабдивах ведется привычными полигональными методами, а
результат отображается в виде гладкой поверхности а-ля NURBS. В некоторых забавных трехмерных
программах даже используется термин metanurbs для обозначения subdivision surfaces.
Подробнее про внутреннее устройство полигонов, NURBS и subdivision surfaces можно
прочитать ниже в соответствующих разделах, а сейчас некоторые пытливые умы, несомненно,
уже задались вопросом о том, как распределяются области применения различных методов
моделирования в результате последних технологических революций. Проще говоря: что
моделируют чем?
Области применения методов моделирования
Весьма сложно четко определить области использования тех или иных методов
моделирования. Можно лишь привести основные тенденции, следование которым остается делом
вкуса, а также определяется опытом использования уже знакомых инструментов.
Если я скажу, что полигональное моделирование (вкупе с сабдивами ) больше подходит для
персонажного и органического моделирования, это означает: для моделирование антропоморфных
форм и различных «членистоногих» персонажей из животного мира для последующей анимации.
Масса персонажей может быть сделана при помощи сплайнов, особенно если модели могут быть
представлены небольшим количеством поверхностей, например модели пресмыкающихся.
Для моделирования всяческих механизмов и промышленных форм лучше подойдут,
наверное, сплайны - так же, как и для дизайнерских работ. Любители моделировать модные
автомобили также обязаны вникнуть в сплайновые методы и инструменты. Архитектурное
моделирование активно использует оба подхода - в зависимости от конкретной задачи и типа
визуализации.
Изготовление моделей для игр, естественно, требует использования только полигональных
инструментов: средний игровой движок попросту «не поймет» сабдивы или сплайны.
Любую сплайновую модель можно легко сконвертировать в полигональную сетку, поэтому
область использования сплайнов существенно расширяется за счет изготовления «болванок» -
для дальнейшей полигональной «доводки». Обратное, к сожалению, невозможно, однако любая
Моделирование
161
iy.iij.ji
полигональная модель легко превращается в сабдив, поэтому области использования полигонов и
сабдивов часто совпадают.
Примечание, Пытливые умы тут, конечно, встрепенутся: ведь в MAYA существует
формальный способ превратить полигоны в сабдивы, а затем простодушно
сконвертировать их в NURBS, благо такие пункты меню имеются. Это так, однако
полученное количество сплайновых поверхностей и их взаимное распложение, как
правило, делают невозможным дальнейшее редактирование модели. Для тех, кто
заинтересовался вопросом о предсказуемом переводе полигональных моделей в
сплайновые поверхности, могу сказать, что для такого класса задач существуют
специальные пакеты, обтягивающие высокополигональные сетки, полученные
в результате 30-сканирования, адекватным количеством сплайновых патчей.
Самые известные из них - Paraform и CySlice.
Еще раз отмечу, что с появлением эффективных методов работы с subdivision surfaces,
области использования полигональных инструментов моделирования существенно расширились, и
это стимулировало как появление новых инструментов, так и совершенствование уже имеющихся.
Подробнее о всяких ZBrush, Modo и MudBox можно почитать в главе про полигоны.
Альтернативные и экстремальные методы моделирования
Рассмотренные методы моделирования с помощью NURBS, полигонов и сабдивов
(subdivision surfaces) относятся к, назовем это так, традиционным методам моделирования. Какие же еще
способы создания 30-поверхностей существуют в природе?
Импорт и форматы данных
Звучит, пожалуй, довольно радикально, но к методам создания моделей в MAYA я бы смело
отнес импорт объектов из альтернативных программ. Например, некоторые несознательные
пользователи жить не могут без кривых Безье и без возможности каждый день подергать кривые
и поверхности за «усики» и «гантельки». Эти пользователи могут спокойно моделировать свои
кривые, например в Adobe Illustrator, а затем импортировать кривые в MAYA в формате .ai, чтобы
затем обтянуть их поверхностями. Для импорта/экспорта поверхностей существуют другие
форматы.
Для обмена полигональными объектами между ЗЭ-пакетами стандартом де-факто до сих
пор является формат OBJ (или wavefront obj). Этот формат сохраняет не только полигональную
геометрию, но и текстурные координаты, поэтому большинство пакетов поддерживают импорт/
экспорт в этот формат (в состав AAAYA входит соответствующий плагин).
Обмен сплайновыми моделями происходит, как правило, через формат IGES, он позволяет
получать сплайновые поверхности и кривые из систем автоматического проектирования типа
различных CAD'ob.
Также существует некоторое количество специальных программ-конверторов (например,
PolyTrans, созданный компанией Okino Computer Graphics), позволяющих целиком конвертировать
сцены из одного ЗЭ-пакета в другой, включая не только модели, но и анимацию, камеры,
источники света и другие объекты. Однако в последнее время компания Kaydara (купленная,
кстати, создателем MAYA, компанией Alias, которую, в свою очередь, купила компания Autodesk ),
известная как производитель пакетов для производства анимации Filmbox и MotionBuilder, очень
агрессивно продвигает свой формат файлов FBX, рекламируя его как универсальный формат
обмена трехмерными сценами между различными ЗЭ-пакетами. Действительно, плагины для
импорта и экспорта в этот формат доступны для скачивания и абсолютно бесплатны (www.kaydara.
com), причем с некоторого времени они уже включены в состав MAYA.
162
Книга Сергея Цыпцына
№
Метаболы
К менее радикальным методам создания трехмерных поверхностей можно отнести
использование технологии «метаболов» (metaballs). Технология заключается в том, что вокруг
нескольких полигональных объектов создается гладкая процедурная поверхность, равномерно
обтягивающая все объекты. В MAYA нет встроенных иструментов работы с метаболами.
Существовавший некоторое время плагин AM_Metaballs умер где-то между третьей и четвертой
версиями MAYA, так и не выйдя из состояния перманентной бета-версии. Использование концепции
метаболов реализовано также в плагине MTOR (MAYA То Renderman converter), но, правда, только
на стадии рендеринга.
Процедурное моделирование
Далее можно сказать про различные методы процедурного моделирования. Это модное
словосочетание означает, что модели создаются не в результате «ручной работы» , а в соответствии
с некоторыми законами или формулами, которые задает либо пользователь, либо конкретный
инструмент.
Например, к процедурному моделированию можно отнести майскую систему флюидов,
где с помощью динамики сплошных сред можно смоделировать поведение и форму жидкости в
некотором объеме. Правда, используя флюиды, можно моделировать не только форму жидкости,
но и совершенно произвольные абстрактные формы, Главное: результатом такого моделирования
может быть трехмерная поверхность.
Система Paint Effects также являет собой яркий пример процедурного моделирования.
L-системы
Другой пример процедурного моделирования - это L-системы (L-systems, вестимо),
описывающиесозданиедревоподобной, «ветвистой» геометрии, с помощью задания коэффициентов
ветвления. Это, конечно, довольно примитивное описание L-систем, поскольку с их помощью
можно получать не только «ботанические» объекты, но и куда более замысловатую геометрию.
Обидно, что простенький, но многообещающий плагин для работы с L-системами в MAYA не получил
дальнейшего развития и «почил в бозе» пару лет назад. Так что на сегодня поддержки работы с
L-системами в MAYA формально нет.
MEL-моделирование
Зато в MAYA имеется возможность абсолютно произвольным образом задавать формулы
для построения кривых и поверхностей. Зная соответствующие MEL-команды, для создания
объектов и работы с их компонентами можно легко построить генераторы кривых и поверхностей
по параметрическим формулам - их пользователю несложно найти в соответствующей литературе
или определить самому .
Для взрослых. Пытливые умы и взрослые мальчики тут, естественно, попросят
ответить за базар, то есть за такие лихие базовые заявления.
Пожалуйста. Создайте кривую любой степени. Назовите ее proCurve. Создайте
следующий expression:
float $x=2*sin(time*5);
float $y=2*cos(time*5)*sin(time*5);
float $z=0.5*time;
if(frame==1) curve -p $x $y $z -r proCurve;
else curve $x $y $z -a proCurve;
Моделирование
163
Проследите, чтобы начало анимации было установлено в первый кадр и жмите на
проигрывание.
Дайте волю своему любопытству и как угодно изменяйте коэффициенты в
первых трех строчках. И не только коэффициенты, но и сами формулы, пользуясь
известными вам функциями.
Примером процедурного MEL-моделирования могут служит скрипты, позволяющие строить
траекторию объекта в виде кривой или рисующие циклоиды, кардиоиды, ленты Мёбиуса, бутылки
Клейна, сапоги Шварца или другие кривые и поверхности.
Генераторы всего на свете
К системам процедурного моделирования можно отнести также всяческие генераторы
ландшафтов, растительности, водной глади и прочих природных явлений и форм. Как правило,
эти системы осуществляют не только моделирование геометрии, но и процедурную анимацию
полученных объектов, но, тем не менее, их первоочередной задачей является создание трехмерных
объектов. Обычно эти системы представляют собой отдельные независимые программы либо
плагины, расширяющие функциональность MAYA. Самые известные ботанические системы,
работающие с MAYA - это Xfog и Атар. Популярны генераторы ландщафтов TerraGen и WorldBuilder.
Процедурное моделирование и анимацию морских поверхностей осуществляет пакет Digital Nature
Tools. Аналогичные задачи решает и встроенный в MAYA Fluids модуль Ocean.
Рисовальные эффекты как средство моделирования
Говоря про процедурное моделирование, нельзя не сказать про систему Paint Effects,
которая появилась в MAYA, начиная с версии 2.5, и которая представляет собой квинтэссенцию
процедурного подхода. Возможность быстро создавать довольно сложные трехмерные объекты,
причем в большом количестве и с приемлемым качеством, делают Paint Effects полноценной
системой моделирования. С помощью этой технологии можно создавать модели не только
ботанической или другой узкой направленности, но и самому определять и направленность и
законы, по которым новая геометрия возникает.
В пятой версии MAYA появилась возможность конвертировать штрихи Paint Effects в
полигональные сетки. Это сделало ее полноценной трехмерной системой моделирования, явно
относящейся к классу генераторов всего на свете.
Если вы новичок в MAYA и хотите получить мощный энергетический заряд, быстро
смоделировав, санимировав и отредерив сложную и красивую сцену, я советую вам начать
моделирование с Paint Effects.
Во-первых, если следовать традиции и документации, а значит начать работу в MAYA с
изучения сплайнового моделирования, то можно просто сильно утомиться (а местами и испугаться)
и потерять часть мотивации для изучения MAYA.
Во-вторых, как в анекдоте про обрезание, Paint Effects - это просто красиво.
В-третьих, концепция использования кистей и штрихов близка людям с минимальными
художественными навыками, и это не может не послужить хорошим введением в майские
инструменты моделирования.
В-четвертых, практически мгновенный и эффектный результат применения Paint Effects
создает иллюзию успешного понимания MAYA - что в общем-то и является целью данной книги.
И, «в-последних», без умения работать с кривыми трудно будет эффективно использовать
Paint Effects, поэтому тут уже от изучения сплайновых инструментов не отвертеться.
164
Книга Сергея Цыпцына
Примечание. Пользователям пакета Expressions легко перенести привычную
концепцию процедурных кистей на трехмерный случай. Опыт работы в Painter
также будет очень полезен.
В главе, посвященной Paint Effects, описан довольно подробный пример моделирования
(а также анимации и рендеринга) насекомых в большом количестве. Хотите попробовать себя в
процедурном моделировании? Начинайте с этого энтомологического примера.
Моделирование
165
Эта глава построена следующим образом. В начале много теории (я было написал «немного
теории», но вскоре понял, что неправ). При этом теория излагается в основном на примере работы
с кривыми, и описывает основные методы и ключевые понятия NURBS-моделирования. И если
инструменты работы с кривыми описаны довольно плотно, то методы работы с поверхностями
освещены на конкретном примере и далеко не в полном объеме. Я считаю, что, разобравшись
с теорией и кривыми, вы будете в состоянии провести аналогии и ухватить суть работы с
поверхностями.
Можете вообще не слишком углубляться в теорию, если не собираетесь заниматься
точным моделированием или дизайном,если ваши интересы лежат в области органического
моделирования, а NURBS-кривые и поверхности вы собираетесь использовать для вспомогательных
целей Поэтому, проделав упражнения, можете с облегчением забыть кошмары параметризации и
прочую жуть.
Если у вас не хватает времени, но вы, тем не менее, хотели бы постичь природу и характер
сплайновых объектов, попробуйте просто проделать упражнение на изготовление сглаженного
кубика, приведенное в конце главы. Если вы сможете одолеть его, сделать все до конца, вы,
похоже, внутренне готовы ко всем прелестям сплайнового моделирования и можете больше
ничего не читать.
Если вы совсем ничего не знаете про моделирование при помощи NURBS, очень рекомендую
сначала поэкспериментировать со сплайновыми кривыми. Основные особенности устройства
сплайнов и тонкости работы с ними удобно изучать именно на примере кривых.
Работа с кривыми
При работе со сплайновыми кривыми удобно представлять их мысленно в виде упругой
жесткой проволки из которой вы пытаетесь изготовить нужную форму. В глубоком прошлом,
когда для постройки морских судов использовали дерево, сплайнами назывались длинные тонкие
изогнутые деревянные пластины, из которых набирались корпуса судов. В землю определенным
образом забивали колышки, между ними вставляли деревянные рейки, изогнутые в соответствии
с колышками, рейки эти поливали водой, и после высыхания они принимали нужную форму. При
работе с кривыми в MAYA их, к счастью не надо поливать водой и сушить, однако следует помнить,
что у них есть свой «упругий» характер (говоря об упругости, я имею в виду кривые третьей
степени и выше, ломаные кривые первой степени в этом смысле абсолютно бесхарактерны).
Применения кривых
Даже если вы не собираетесь погружаться в пучину моделирования NURBS-поверхностей,
вам все равно придется освоить некоторые инструменты для работы со сплайновыми кривыми.
Конечно, основное применение кривых - это служить образующими (или, проще говоря, каркасом)
для построения по ним поверхностей, а также для вычисления проекций или пересечений между
поверхностями и кривыми.
Однако анимация вдоль пути невозможна без построения кривых. Некоторые операции
полигонального моделирования (например, Extrude Face) также используют кривые для построения
поверхности. И динамика волос базируется на кривых. Кисти Paint Effects часто удобно класть на
готовые кривые. Деформеры Wire или Wrap используют кривые для анимации формы. Испускание
166
Книга Сергея Цыпцына
Сплайновое моделирование
№
частиц из кривых и динамика мягких тел... Список можно продолжать. Поэтому от изучения работы
с кривыми вам не отвертеться.
Немного теории
Все приведенные в этом разделе сведения в принципе необязательны для изучения. Если
вас страшат показавшиеся ниже формулы, можете переходить к следующему разделу, касающемуся
практических методов построения кривых. Изложенный здесь материал просто расширит вашу
эрудицию и поднимет самооценку.
Некоторые из вас, возможно, учились в школе. А кое-кто даже в институте. Вероятно, кто-
то из вас еще помнит такие выражения как «кубическая парабола» или «линейная зависимость».
Просвещенные умы даже представляют, что график уравнения типа
у = хЗ
или
у = х2
представляет из себя гладкую параболу.
А уравнение
у = а*х + b
задает просто прямую.
Если в школе вы записывали уравнения кривых в виде явной зависимости между х и у, то
в компьютерной графике принято представлять эти кривые в виде параметрической зависимости.
Например, приведенное выше уравнение кубической параболы в параметрическом виде будет
выглядеть как
x = t
y = t3
а уравнение прямой как
х = t
у = a*t + b
В общем трехмерном случае параметрическое задание кривой выглядит как
х = а + b*t + с * tl + d*t3 + ...
у = р + q*t + г * t2 + s*t3 + ...
z = i + j*t + k * t2 + m*t3 + ...
Здесь t является параметром, а остальные буквы - коэффициентами. Максимальная
степень, с которой t входит в такие уравнения, называется степенью кривой.
Представьте себе теперь, что параметр t потихоньку растет, а х, у и z в левой части этих
формул также меняются, рисуя в пространстве некую трехмерную траекторию. Это и есть кривая,
заданная параметрически.
Можно предположить, что чем выше степень кривой, тем более сложную форму можно
представить с помощью такой кривой. По крайней мере, гладкая парабола выглядит сложнее,
чем просто прямая линия. Формально это так, однако на вычисление таких высокостепенных
кривых может уйти много времени и процесс построения кривых (во всяком случае, для нужд
Сплайновоемоделирование
167
моделирования) будет неэффективным.
В MAYA сложная кривая (к примеру, третьей степени), представлена в виде набора
сегментов-кривых, каждый из которых задан параметрическим уравнением третьей степени и
вычисляется очень быстро.
Следующий вопрос состоит в том, насколько гладко можно соединить такие сегменты? Для
сегментов кривых первой степени, то есть прямолинейных отрезков, необходимо задать всего
две точки, чтобы однозначно определить отрезок. Поэтому два прямых отрезка можно срастить
«концами» и получить, таким образом, ломаную кривую.
Для построения отрезка кривой второй степени необходимо задать уже три точки (то есть
девять значений координат точек или девять соответствующих коэффициентов в уравнениях).
Поэтому для сращивания двух таких сегментов можно использовать крайние точки для соединения
концов, а средние точки каждого сегмента использовать для обеспечения гладкого соединения.
(«Гладко» в данном случае, с точки зрения математики, означает, что касательные для каждого
сегмента в точке соединения параллельны)
Однако в компьютерной графике для работы с гладкими формами обычно используют
кривые и поверхности третьего порядка. Чтобы задать сегмент кривой третьего порядка надо
уже двенадцать коэффициентов или четыре точки в пространстве. Соседние с крайними точки
используются гладкой стыковки ,а следующие за ними точки обеспечивают совпадение в точке
соединения «кривизны» стыкуемых сегментов.
AAAYA поддерживает также работу с кривыми и поверхностями пятой и седьмой степени.
Такие объекты используются для дизайна поверхностей, предъявляющих повышенные требования
к гладкости и кривизне и применяются, например, в автомобильной промышленности при
проектировании и подготовке поверхностей для изготовления реальных прототипов. Для
большинства задач, решаемых с помощью MAYA, достаточно кривых и поверхностей первой и
третьей степени, поэтому я не буду обсуждать остальные варианты.
Степень и гладкость
Терминологически сложились некоторые названия для объектов первой и третьей степени.
Для первых часто употребляются термины «линейная» или «ломаная» кривая (или поверхность).
Для третьей степени используются названия «гладкая» или «кубическая» кривая. Таким образом,
степень кривой или поверхности является зачастую обозначением ее гладкости.
Тангенс и кривизна
Разберемся далее с терминами «тангенс» и «кривизна». Эти термины большинство
майщиков употребляют, мягко говоря, некорректно, хотя звучит это весьма доходчиво.
168
Книга Сергея Цыпцына
«Тангенс» употребляется для обозначения касательной в точке кривой или поверхности.
Если для кривой касательная в точке одна, то для поверхностей обычно уточняется конкретное
направление в некой касательной плоскости. Слово «тангенс» закрепилось благодаря формуле
вычисления касательной, в которой используется тригонометрическая функция - тангенс.
«Кривизна» действительно обозначает кривизну в точке кривой, то есть величину обратно
пропорциональную радиусу окружности, максимально удачно вписанной в точку на кривой. Если
кривая прямолинейная, то радиус такой окружности бесконечен, а кривизна равна нулю. Кривизну
также можно абстрактно представить как скорость изменения касательной в точке.
Термины «кривизна» и «тангенс» часто употребляются при описании концов кривых или
краев поверхностей, прилегающих друг к другу. Будем дальше говорить только о кривых, для
краткости изложения.
Непрерывность
Если конец одной кривой просто совпадает с началом другой, то говорят, что кривые
имеют непрерывность по позиции (positional continuity). Кривые в этом случае, могут встречаться
под любым углом. Такой вид непрерывности иногда обозначается как GO.
Если кривые соединяются, так что в точке соединения касательные к каждой кривой
совпадают (точнее противоположно направлены вдоль одной прямой), то кривые имеют
тангенциальную непрерывность (tangent continuity, G1). В народе обычно говорят, что кривые
стыкуются (совпадают, сращены) по тангенсу (хотя корректно, наверное, говорить стыкуются по
касательной). Однако радиусы кривизны в точке соединения могут быть различны.
Онлайновое моделирование
169
Если же в точке соединения совпадает не только тангенс, но и кривизна обеих кривых, то
кривые имеют непрерывность по кривизне (curvature continuity, G2). Иначе говоря, стыкуются по
кривизне.
Некоторые пытливые умы спросят, а зачем дополнительно добиваться стыковки по
кривизне, если по тангенсу и так гладко. Действительно, «наощупь» две поверхности, стыкующиеся
по тангенсу, но не по кривизне, будут гладкими, однако при визуализации таких поверхностей
рубленый блик в области соединения будет сразу выдавать наличие шва между поверхностями.
Иногда, непрерывность по кривизне не требуется, но в общем случае, когда говорят, что
поверхности или кривые гладко стыкуются, имеется в виду непрерывность и по тангенсу и по
кривизне.
Почему столько внимания уделяется стыковке поверхностей и кривых? Дело в том, что
основное занятие моделлера, использующего сплаиновые инструменты, это сшивание и подгонка
краев поверхностей. Так как NURBS-поверхности не могут быть произвольно объединены в один
объект (мы поговорим об этом далее), то, как правило, приходится собирать модель из лоскутов,
гладко прилегающих друг к другу.
Рассмотрим теперь все эти понятия и названия на примере работы с кривыми. А про
пугающую параметризацию поговорим чуть позже.
Создание кривых. Практические инструменты и методы
Можно выделить несколько способов создания кривых в MAYA.
Во-первых, существует два примитива в меню Create=>NURBS Primitives. Это круг
Circle и квадрат Square. Пропустим их обсуждение. Также пропустим инструменты создания дуг
Create=>Arc Tools.
Во-вторых, если вы привыкли работать с кривыми в любимой программе Adobe Illustrator,
можете продолжать в ней работать. Втащить эти кривые в MAYA вы можете с помощью операции
File=>Import или с помощью специального инструмента для создания трехмерных текстов из
кривых: Create=>Adobe Illustrator Object.
Остальные способы получения кривых не так тривиальны и требуют некоторых действий
от пользователя. Кривые можно «отдирать» от поверхностей, в том числе и от полигональных
ребер. Можно пересекать поверхности, порождая кривые в местах пересечения. Можно резать и
соединять несколько кривых. Но основной способ, естественно, это создание кривых вручную с
помощью CV Curve Tool и ЕР Curve Tool.
170
Книга Сергея Цыпцына
CV Curve Tool
Добраться до этого инструмента можно через меню Create. Как и положено инструменту
(Tool), курсор принимает определенную форму, и вы попадаете в контекст инструмента, то есть
MAYA ждет от вас активных действий. Как следует из Help Line, нужно пощелкать мышкой в окне,
расставляя контрольные точки (CV или Control Vertices), а затем нажать Enter, чтобы вернуться к
одному из стандартных инструментов, который использовался до выбора CV Curve Tool.
Во время расстановки точек можно при помощи средней кнопки мыши корректировать
последнюю добавленную точку или нажимать Insert, чтобы отредактировать положение уже
поставленных точек, не выходя из контекста построения кривой.
По умолчанию создается кривая третьей степени, поэтому для создания хотя бы одного
сегмента кривой необходимо, как уже говорилось выше, поставить минимум четыре точки.
При построении сегмента кривой третьего порядка можно опять привести аналогию с
упругой проволокой. Представьте, что концы упругого стержня зажали в тиски и развернули эти
тиски в некоторых направлениях. Концевые контрольные точки определяют позицию этих тисков,
а соседние с ними - угол разворота концов. Форма сегмента кривой повторяет форму упругого
стержня, зажатого таким образом.
Каждое дальнейшее добавление контрольной точки вызывает добавление нового сегмента
(span). Для изучения свойств кривых бывает удобно включить отображение сегментов для всех
создаваемых кривых. Это можно сделать в Windows=>Settings/Preferences=>Preferences..=>NURBS,
включив галку New Curves- Edit Points.
Естественно, форму кривой можно отредактировать после построения, нажав правую
кнопку мыши над кривой и выбрав в качестве компонент Control Vertices. Далее употребляя все
известные инструменты трансформаций (а не только Move Tool), вы можете делать с контрольными
точками все, что хотите.
Сплайновое моделирование
171
ШЖУ.
Совет. При интенсивном таскании за точки иногда хочется сразу хватать и
тащить вершину, а не сначала выбрать и только потом тащить. Нужная галка
находится по адресу Windows=>Settings/Preferences=>Preferences... = >Selection=>Clic
k Drag Select.
Если вы хотите «достраивать» уже имеющуюся кривую, выберите ее и используйте Edit
Curves=>Add Point Tool.
Пытливые умы могли заметить, что начало кривой, то есть первая контрольная точка
обозначается небольшим квадратиком (на самом деле это - квадратный нолик), а вторая
точка, задающая направление в начале кривой, буквой U. (Буквами U и V принято обозначать
параметрические координаты на кривых и поверхностях, но об этом позже). Направление кривой
имеет важное значение для всех последующих операций. Поменять его, то есть развернуть кривую,
всегда можно при помощи Edit Curves=>Reverse Curve Direction.
ЕР Curve Tool
А где же колышки, воскликнут романтические умы, которые забивают в песок? Сейчас,
сейчас... Для построения кривой, проходящей точно через поставленные точки, используют
инструмент Edit Curves=>EP Curve Tool. В ходе расстановки точек Edit Points кривая третьей степени
пытается вписаться в эти точки, проходя точно через них и упруго изгибаясь в промежутках.
Каждое добавление новой точки создает новый сегмент. Концы сегментов, в отличие от CV Curve
Tool, определяются расставляемыми точками.
Терминологический комментарий. Если для CV сложились различные названия
(такие как «контрольные точки» или «контрольные вершины»), то для ЕР пока
что нет ни одного термина. Сказать «редактируемые точки» совершенно
неадекватно и не отражает сути. «Узлы (knots)» - гораздо лучше и ближе по смыслу,
но как-то не прижилось, а, скажем, «границы сегментов» - это слишком сложно и
длинно. Конечно, в трудовых коллективах народ активно использует нецензурные
«сивишки» и «епэшки», но употреблять такие «термины» в этой книге даже у меня
не хватает экстремизма. К счастью, по сравнению с контрольными вершинами,
Edit Points используются гораздо реже, поэтому я постараюсь обойтись вообще без
перевода. На всякий случай, замечу только, что термин «сегменты» я употребляю
для перевода слова «spans».
Форму кривой можно также редактировать при помощи Edit Points, нажав правую кнопку
мыши над кривой и выбрав в качестве компонент Edit Points.
CV или ЕР? Кто главный?
Пытливые умы естественно не могут удержаться от вопроса: а «кто», собственно говоря,
«главный» - CV или ЕР? Вообще-то, вы можете не особенно беспокоиться по этому поводу и попросту
использовать оба типа компонент, но если быть математически корректным, то «главнее» CV.
Именно по положению контрольных вершин вычисляется форма кривой, ее разбивка на сегменты
и, следовательно, набор Edit Points. (Проверьте, что перетаскивание контрольной вершины всегда
влияет на три ближайших Edit Points, если контрольная вершина не крайняя).
При редактировании Edit Points MAYA также меняет форму кривой, а следовательно и
положения CV. Но изменение CV влечет изменение Edit Points и получается замкнутый круг...
Да, действительно, в случае редактирования Edit Points MAYA решает неявную задачу некоторым
итеративным методом, подбирая форму кривой, но для пользователя все выглядит по-честному.
(Поэкпериментируйте. Для кривой с достаточно большим количество сегментов пошевелите
как следует какую-нибудь Edit Point. Вы увидите, что такое шевеление приводит к смещению
множества контрольных вершин (а реально почти всех), то есть MAYA перестраивает кривую не
локально, а полностью!).
Следовательно, старайтесь использовать для редактирования кривых контрольные
172
Книга Сергея Цыпцына
№
вершины, a Edit Points применяйте только для небольших и локальных корректировок формы
кривой.
Начинающим пользователям может показаться, что строить новые кривые проще при
помощи Edit Points, однако после некоторых упражнений становится понятно, что втискивать
упругие кривые в набор точек не совсем удобно.
Таким образом, для редактирования и создания кривых используются в основном
контрольные вершины. Edit Points применяются, например, для ротоскопинга (обрисовки кривых
с отсканированных изображений) и для локального редактирования кривых.
Параметризация. Длина кривой.Способы параметризации.
Первые ужасы параметризации
Параметризация, является ключевым понятием для NURBS-моделирования. Поэтому как
бы ни делалось вам жутко, попытайтесь вникнуть в суть ниженаписанного. Это сильно облегчит
вам жизнь в дальнейшем.
Настройки инструментов CV Curve Tool и ЕР Curve Tool практически идентичны.
Выбор степени кривой (Curve Degree) тривиален. В случае кривых первой степени, эти
инструменты действуют идентично, так как позиции контрольных точек совпадают с концами
сегментов и, следовательно, с позициями Edit Points. А вот параметр Knot Spacing заслуживает
отдельной дискуссии. Этот параметр определяет, как будет «пронумерована» создаваемая
кривая.
Интуитивно понятно, что кроме направления кривой, неплохо бы иметь параметр,
описывающий, как далеко от начала кривой находится данная точка, то есть неплохо бы знать
длину дуги кривой. Например, при анимации движения объекта вдоль пути, объект должен «знать»,
какую часть пути он уже прошел, и эту информацию он должен получать от самой кривой. Вот эта
«нумерация» вдоль кривой и называется параметризацией. В каждой точке кривой всегда задан
параметр, возрастающий от начала к концу и определяющий как бы «координату вдоль кривой»
(тот самый параметр t, из раздела про теорию). Для кривых такая координата обозначается буквой
U и однозначно определяет положение (или точку) на кривой.
В MAYA существует два способа параметризации (то есть задания параметра) кривых и
поверхностей. Второй из них называется Chord Length (параметризация с использованием длины
кривой), и он более естественен для понимания, так как определяет параметр как длину кривой.
То есть в любой точке кривой значение параметра равняется длине кривой от начала до этой
точки. Пытливые умы спросят, а как же еще можно параметризовать (измерить) кривую? То бишь,
каков первый способ?..
С точки зрения удобства построений кривая может быть пронумерована следующим образом.
Сплайновоемоделирование
173
1ШШ
В каждой точке на границе сегмента (то есть в Edit Point) значение параметра полагается равным
номеру этого сегмента, то есть целому числу. А в промежутках равномерно распределяется вдоль
длины сегмента. Этот способ называется Uniform (равномерная параметризация), он и является
первым, используемым по умолчанию методом параметризации, его и используют в настройках CV
Curve Tool и ЕР Curve Tool.
Примечание. Можно привести физическую аналогию параметризации. Представьте
себе у что у вас прямой кусок упругой, но растягивающейся веревки. И вы можете
схватить его где-то посередине в двух-трех отмеченных краской местах (это
границы сегментов), чтобы изогнуть. Если вы схватите веревку в этих местах
с помощью жестких зажимов-прищепок и потянете, то веревка растянется и
изогнется, однако границы обозначенных сегментов останутся на месте, то
есть под зажимами. Это - аналог Uniform-параметризации. Если вместо зажимов
потянуть веревку скользящими кольцами (а точнее, трубками), она будет
изгибаться, одновременно распределяя свою длину между кольцами и гладко
проскальзывая между ними. Первоначальные границы сегментов, естественно,
проскользнут в новые положения на самой веревке. Это - аналог Chord Length-
параметризации.
Следующий вопрос беспокойных умов естественно будет о том, какой метод лучше?
У каждого метода свои плюсы и минусы, но, похоже, у метода Chord Length минусов больше.
(Возможно, я делаю здесь «политически некорректные» заявления, унижая один метод, по
сравнению с другим, поэтому оговорюсь: это - моя совершенно субъективная точка зрения.) Коль
скоро из кривых будут получены поверхности, наследующие параметризацию, о плюсах и минусах
пойдет речь на примере поверхностей.
Параметризация Chord Length интуитивно понятна и дает представление о распределении
параметра прямо по внешнему виду кривой или поверхности. Текстуры ложатся на поверхности
с такой параметризацией более равномерно, без «гармошки» в местах скопления изопарм (для
Uniform-параметризированных поверхностей, на этот случай существует галка Fix Texture Wrap
в разделе Texture Map в Attribute Editor). При построении вручную Chord Length-параметризация
дает более гладкое распределение кривизны. Попробуйте построить кривые, проходящие через
одни и те же точки, с помощью ЕР Curve Tool, но задавая разные методы параметризации.
Обратите внимание, что при использовании CV Curve Tool кривые, построенные с
различными методами параметризации, отличаются не так сильно.
Работа с поверхностями с параметризацией Chord Length не так предсказуема, особенно
при сшивании краев, так как диапазон параметра с каждой стороны оказывается разным.
Поэтому, как правило, проще, надежнее и более предсказуемо использовать кривые
и поверхности с Uniform-параметризацией. Кроме того, любую существующую поверхность
или кривую можно параметризовать заново (то есть перераспределить параметр), но только с
использованием метода Uniform. Изменить Uniform-параметризацию на Chord Length невозможно
без написания скриптов.
174
Книга Сергея Цыпцына
r%
Да, к сожалению, для эффективного использования NURBS-объектами приходится постоянно
помнить про параметризацию. Ситуация осложняется еще и тем, что одни операции (например, loft)
создают поверхности с Uniform-параметризацией, а другие (например, fillet) с параметризацией
Chord Length. И приходится постоянно следить за распределением параметра на объектах, а
операция rebuild становится вашей второй натурой. Но об этих «ужасах» побеседуем позже, а
пока договоримся, что, по возможности, будем придерживаться Uniform-параметризации.
«А как ее придерживаться и как за ней следить?» - воскликнут пытливые умы. Следить
надо в Attribute Editor. Там для поверхностей и кривых, в закладке для shape, всегда указан
диапазон параметра и количество сегментов в выбранном объекте.
curve4 curveS hape4 j
- NURBS Qifve History
[М1п Max Value [O.OOQ |3000
Spans |3
Form I Jll
В принципе, до какого-то момента на параметризацию можно не обращать внимания,
особенно если вы только начали осваивать сплаиновое моделирование. Пока речь не пойдет
о гладкой подгонке или склеивании разных поверхностей, все, как правило, будет работать
по умолчанию. Так что если мне удалось вас напугать и вы уже нервничаете, просто на время
забудьте это страшное слово, параметризация, а потом, окрепнув духом, вернетесь к нему, если
понадобится.
Операции над кривыми
Склеивание и разрезание. Detach и Attach.
Способы склейки. Keep originals
После создания и редактирования кривые чаще всего нужно резать или склеивать.
Операция Detach позволяет разрезать кривую в любом месте, а не только на границах сегментов,
как у кривых Безье. Чтобы отметить любое место на кривой, надо в контекстном меню выбрать
Curve Point, а затем щелкнуть на любом участке кривой. Возникшая желтая точка - это не
компонента кривой, а просто маркер, позволяющий отмечать или выбирать произвольное место на
кривой для применения некоторых операций. Поэтому вы можете заметить такое предупреждение
в командной строке:
Warning: Some items cannot be moved in the 3D view.
Это означает: такие маркеры не предназначены для редактирования формы
объекта и не могут перемещаться обычными инструментами. Изопарма
поверхности тоже дает пример такого маркера.
Сплаиновое моделирование
175
Как только один или несколько маркеров на кривой выбрано (не забудьте про shift),
достаточно выбрать Edit Curves=>Detach, чтобы разрезать кривую.
Чтобы склеить две кривые, требуются чуть большие усилия и использование операции
Attach. Конечно, необходимо выбрать кривые перед тем, как склеивать, но какие концы у двух
кривых вы хотите соединить? MAYA обычно использует концы, расположенные ближе всего, но
бывают ситуации, когда такая близость неочевидна. В таких случаях, вместо выбора самих кривых
рекомендуется выбрать Curve Point (то есть маркер) на конце каждой кривой.
Необходимо также выбрать метод склеивания, который задается через Option Box операции
EditCurves=> Attach.
По умолчанию используется метод Blend, гладко соединяющий две кривых в одну. Опция
Insert Knot позволяет вставить две дополнительные точки рядом с местом соединения - это в
случаях, когда концы кривых недостаточно хорошо «пригнаны» друг к другу перед соединением.
А дополнительный Insert Parameter определяет близость такой вставки к месту соединения.
Очевидно, что, пользуясь принципом Construction History, можно изменить и метод
соединения и другие параметры уже после применения операции. Достаточно просто открыть
Attribute Editor или Channel Box и отредактировать там атрибуты ноды attachCurve, автоматически
создаваемой после применения операции Attach.
Примечание. В Option Box любой команды редактирования кривых и поверхностей
есть опция Keep Originals, включение которой задает создание нового объекта для
результата выполнения операции и сохранения исходных объектов нетронутыми.
По умолчанию эта опция выключена у всех операций, кроме команды Attach. При
включенной опции Keep Originals удобно наблюдать изменения в форме у объектов,
получаемых после выполнения операции, в сравнении с исходными объектами. Как
правило, выключение этой опции не препятствует созданию Construction History,
176
Книга Сергея Цыпцына
№
однако при операции Attach, создающей из двух объектов один, для сохранения
истории нужно обязательно сохранять «исходники», поэтому опция Keep Originals
для нее включена по умолчанию.
attachCurvel |
Blend Bias 10.500 ' J
17 Blend Knot Insertion
Parameter |0.256 " ■ J
Второй метод соединения кривых называется Connect, и служит он для «негладкой» склейки
кривых. Он делает «угол» между кривыми не сглаженным, вставляя в место соединения кривых
«жесткую» точку. «Жесткая» точка - это означает, что кривая в этой точке теряет свою гладкость
и сегменты справа и слева от нее совершенно независимы.
Совет. Постарайтесь сразу отказаться от идеи использования «жестких» точек и
метода Connect при работе как с кривыми, так и с поверхностями.
И вот почему.
Во-первых, кривые и поверхности с такими острыми углами порой непредсказуемо ведут
себя при деформациях и попытках склеить их с другими объектами.
Во-вторых, наличие жестких ребер противоречит главному принципу построения
реалистичных изображений - «Не допускать острых углов!». Если оглядеться вокруг, то можно
заметить, что там, где, как нам кажется, находятся острые углы между поверхностями, на самом
деле существуют хоть небольшие, но скругления, и свет, отражаясь от поверхностей, дает
пусть крошечный, но реальный блик. Подробнее о принципах создания реалистичных моделей
и изображений можно почитать, например, в книге Флеминга «Создание фотореалистичных
изображений» и в других источниках, посвященных этому вопросу.
Сплайновоемоделирование
177
Работа с углами
Посмотрим практически, как поступать в тех случаях, когда требуется сделать «гладкий
угол» на кривой.
Во время построения кривой при помощи CV Curve Tool в том месте , где вы собираетесь
сделать угол, надо нажать клавишу f и еще немного подъехать к последней поставленной точке,
а затем поставить рядом еще, как минимум, две контрольные точки.
После этого надо «отъехать» до нормального масштаба и поставить следующую точку
примерно с тем же отступом, что и предыдущие точки, поставленные до «угла».
Далее перейдите в режим редактирования положения точек, для этого нажмите Insert, а
затем стрелку влево. Это выберет предпоследнюю поставленную точку. Снова нажмите f, чтобы
«наехать» на угол. Нажимая стрелки вправо и влево, отредактируйте положение точек так, чтобы
угол стал «правильным» с вашей точки зрения.
178
Книга Сергея Цыпцына
Далее снова нажмите Insert и продолжайте строить кривую.
Теперь можете воспринимать эти три точки, определяющие угол, как единое целое, то
есть как одну точку.
Конечно, в зависимости от поставленной задачи и подробности воспроизведения «угла»,
точек в углу может быть и больше. Пять точек позволят редактировать «угол», не влияя на
прилегающие к нему длинные стороны.
Совет. При построении кривых используйте клавишу shift. Она позволяет ставить
следующую точку строго по горизонтали или по вертикали относительно
предыдущей точки.
Сплайновое моделирование 179
liiOJMi
Использование сеток
При построении кривых старайтесь максимально использовать привязку к сетке. Это
позволит, во-первых, распределять точки более равномерно, а во-вторых, сделает задачу
последующего выравнивания и стыковки ощутимо легче. В Option Box команды Display=>Grid есть
все необходимые параметры для изменения частоты и цвета сетки.
Для взрослых. Можно использовать две MEL-команды, увеличивающие и
уменьшающие частоту сетки:
iff grid -q -dx-5 > 0) grid -d f grid -q -d'-5);
grid -d f grid -q -d%+5);
Их удобно назначить на горячие клавиши для оперативного использования прямо
во время работы с кривыми.
Тактика построения кривых
Старайтесь экономить контрольные точки. Пытайтесь описать нужную вам форму при
помощи минимального набора контрольных вершин. Если количества точек не хватает для задания
необходимой формы, добавляйте точки, там, где это необходимо, с помощью команды Insert
Knot. Если вы чувствуете, что ваша кривая стала «перегружена» точками, можно воспользоваться
командой Rebuild, которая постарается максимально уменьшить количество точек на кривой при
минимальном искажении формы самой кривой (степень допустимого искажения вы задаете сами).
Разберем эти две команды.
Совет. Контрольные точки можно удалять клавишей Delete!
Вставка точек. Команда Insert Knot
Нельзя просто вставить контрольную точку (CV), так как она не лежит на кривой и,
соответственно, непонятно, как задать ее новое положение. Зато можно вставить Edit Point в
любое место на кривой. Это добавит новый сегмент и новую контрольную точку. Как обычно,
любое место можно выбрать при помощи контекстного меню и Curve Point. После чего следует
просто применить команду Edit Curves=>lnsert Knot с параметрами по умолчанию.
Для пытливых умов в Option Box команды Insert Knot есть опция Between Selection,
позволяющая вставить несколько новых Edit Points между выбранными маркерами. Остальные
параметры, позволяющие менять жесткость (Multiplicity) точек, нас не интересуют, так как мы
договорились пытаться не использовать жесткие точки.
Перестройка. Операция Rebuild.
Про операцию Rebuild можно рассказывать бесконечно. Количество ее параметров
вызывающе велико. Попробуем разобрать лишь некоторые, наиболее полезные случаи.
Эту операцию применяют в различных целях.
Во-первых, чаще всего, ее используют для перепараметризации, то есть для
перераспределения параметров на кривой.
Во-вторых, эту операцию применяют для изменения (в основном для уменьшения)
количества контрольных точек на кривой.
180
Книга Сергея Цыпцына
№
В третьих, она нужна, чтобы сделать одинаковым количество точек сразу для нескольких
выбранных кривых.
Перестраивать кривую можно различными способами, определяемыми параметром Rebuild Туре.
Уменьшение количества контрольных точек кривой задается с помощью опции Reduce для Rebuild
Туре.
В этом случае MAYA сама посчитает, насколько можно уменьшить количество точек, так
чтобы оставшиеся точки сместились в пространстве на величину, не большую, чем параметр
Tolerance (если хотите задать его сами, включите опцию Use Tolerance=Local), и кривая максимально
сохранила прежнюю форму.
Метод Curvature, напротив, добавляет дополнительные точки в местах сильной кривизны
и не является сильно полезным.
Метод Match Knots позволяет сделать одинаковое количество точек (корректнее говорить:
количество сегментов, number of spans) у всех выбранных кривых. Образцом для подражания
считается последняя выбранная кривая. Эта опция исключительно полезна при подготовке кривых
для построения по ним поверхностей, например, с помощью операции Loft. Понятно, что если
кривые будут разбиты на одинаковое количество сегментов, то и поверхность, проходящая через
них, тоже будет иметь это же самое (весьма предсказуемое) количество сегментов.
Чтобы одним махом избавиться от неведомо откуда взявшихся «жестких» точек (например,
после применения операции Curve Fillet) нужно воспользоваться методом No Multiple Knots.
Сплайновое моделирование
181
Самым многовариантным и используемым по умолчанию является метод Uniform. Разберем
его многочисленные предназначения.
Прежде всего, он позволяет изменить параметризацию существующей кривой, не изменив
положения ее контрольных точек (правда, форма кривой при этом может чуть-чуть измениться).
Для этого надо выбрать нужный вариант для параметра Parameter Range, а затем «заморозить»
положения контрольных точек с помощью установки параметра Keep=CVs. Это довольно часто
выполняемая процедура при интенсивной работе с кривыми, и я рекомендую обратить на нее
внимание.
Совет. Я продолжаю советовать придерживаться параметризации 0 to ttSpans,
что означает «от нуля до определенного количества сегментов», то есть это
Uniform-параметризация, которая обсуждалась выше, в разделе про построение
кривых.
Параметр Keep определяет, какие компоненты кривой нужно заморозить и не трогать во
время «перестройки».
Если зафиксировать положения контрольных точек (опция CVs), то все что может сделать
с кривой операция Rebuild, это изменить ее параметризацию или степень, при помощи параметра
Degree.
182
Книга Сергея Цыпцына
Если зафиксировать количество сегментов (опция NumSpans), можно просто равномерно
перераспределить существующие сегменты - а следовательно, и контрольные точки вдоль кривой,
не добавляя новых компонент.
По умолчанию, однако, параметр Keep установлен в Ends, что фиксирует лишь положение
концов кривой. Поэтому результирующее количество новых сегментов определяется в этом случае
числовым параметром Number of Spans.
Сплайновое моделирование
183
Равномерное перераспределение сегментов и точек может потребоваться при построении
кривых для анимации объекта по пути, для создания мягких тел, для подготовки к операции
Extrude.
Правило вычисления количества контрольных вершин. Помните о том, что
количество контрольных точек для кривой всегда равно количеству сегментов плюс
степень кривой, то есть для кривых третьего порядка количество контрольных
вершин всегда на три больше, чем количество сегментов. Количество сегментов
всегда можно посмотреть в Attribute Editor как значение атрибута spans. Если
кривая является замкнутой (или периодической), то количество ее контрольных
вершин в точности равно количеству сегментов. Проверить, является ли кривая
замкнутой, можно, взглянув на атрибут Form в Attribute Editor, где значение
Periodic означает замкнутость.
На этом можно покончить с командой Rebuid Curves. Для поверхностей существует
аналогичная операция, по адресу Edit NURBS=>Rebuild Surfaces. Большинство ее параметров и
логика их использования совпадают с аналогичными параметрами для кривых. Основное отличие
поверхностей с точки зрения этой операции - это возможность перестраивать поверхности
индивидуально по двум направлениям. Интуитивно должно быть понятно, что, в отличие от
кривых, положение точки на поверхности должно задаваться уже двумя параметрами, U и V. Точно
так же, как положение конкретной точки на глобусе задается при помощи широты и долготы. Все,
что выше сказано по поводу параметризации, справедливо также и для поверхностей, для которых
всегда определены два параметра U и V в направлениях «вдоль» и «поперек» поверхности, причем
вдоль этих направлений тип параметризации может быть различным.
Остальные операции для работы с кривыми
Перечислять все инструменты для работы с кривыми, подробно описывая их параметры,
было бы расточительно с точки зрения имеющего у нас времени. Для этого есть документация.
Поэтому перечислю наиболее популярные и наиболее загадочные из них.
В соответствии с общей идеологией, перед применением этих операций необходимо что-
либо выбрать, причем в одних случаях это могут быть сами кривые, в других их контрольные
вершины, в третьих - точка на кривой Curve Point. Внимательно читайте Help Line, наводя курсор
на соответствующий пункт меню: там всегда написано, что надо предварительно выбрать.
Самая основная операция - это таскание вершин. Помните, что массу вещей быстрее сделать
вручную, чем подгонять параметры соответствующих операций.
Modify=>Lock Length - очень полезная операция, особенно при перетаскивании вершин.
Позволяет зафиксировать и удерживать постоянной длину кривой.
Duplicate Surface Curves - позволяет «отодрать» выбранные изопармы или полигональные
ребра (!) и превратить их в обычные трехмерные кривые. Причем с сохранением истории.
184
Книга Сергея Цыпцына
Align Curves - как правило, используется для подгонки концов двух кривых. Погоняет концы
кривых так, чтобы они гладко стыковались по кривизне или по тангенсу.
Move Seam - для замкнутых кривых передвигает начало кривой в узел, ближайший к
отмеченной точке на кривой.
Cut Curve - разрезает кривые в месте их пересечения. Позволяет резать несколько кривых
с помощью последней выбранной кривой.
Intersect Curves - ничего не режет, а просто находит и постоянно отслеживает места
пересечения нескольких кривых, чтобы можно было совершать привязку к этим пересечениям.
Сплайновое моделирование
185
Extend Curves - удлиняет кривую различными методами. Полезна для «выращивания»
кривых, может быть использована в анимации.
Offset Curve - «отступает» от кривой равномерно по все длине, при этом могут возникать
перехлесты и петли, особенно при отступе «внутрь» изгиба кривой. Для борьбы с этим перехлестами
есть опция Loop Cutting, включенная по умолчанию. Однако она меняет количество точек и должна
применяться с осторожностью.
Fit B-Spline - хорошее название, ничего не скажешь. Просто проводит новую кривую так,
чтобы ее Edit Points совпадали с контрольными вершинами выбранной кривой.
Smooth Curve - посмотрите в англо-русском словаре, что делает эта операция.
Project Tangent - довольно полезная операция. Позволяет модифицировать начало или конец
кривой так, чтобы он гладко (или строго перпендикулярно) стыковался с выбранной поверхностью.
Конец кривой при этом должен лежать на выбранной поверхности.
186
Книга Сергея Цыпцына
В меню Modify Curves также находятся операции для глобального «процедурного» изменения
формы кривой целиком, такие как сгибание (Bend), закручивание (Curl), выпрямление (Straighten)
и другие.
Кривые на поверхности: Curves on surface.
«Оживление»: Make Live
Нельзя пройти мимо одного уникального типа объектов в MAYA. Это так называемые
«кривые на поверхности». Вещь исключительно удобная, особенно для вырезания отверстий в
поверхностях или пришивания поверхностей друг к другу.
«Кривые на поверхности» могут быть получены как результат пересечения поверхностей.
Также они возникают в результате проектирования обычной кривой на поверхность. Их можно
рассматривать как изопармы произвольной формы или как нарисованные линии на поверхности.
Кроме того, такие кривые можно просто нарисовать вручную на любой сплайновой поверхности,
используя привычные инструменты. Попробуйте создать их с нуля.
Для того, чтобы нарисовать «поверхностную» кривую, создайте любую поверхность
(например, сферу) и сделать ее «живой» (Modify=>Make Live), то есть пригодной для рисования по
ней. Затем можно взять CV или ЕР Curve Tool и просто нарисовать на поверхности нужную форму
кривой, щелкая мышью, как обычно.
В отличие от полигональных поверхностей (которые тоже можно делать Make Live),
контрольные точки в данном случае не просто «приснапливаются» к NURBS-поверхностям, но и
Сплайновое моделирование
187
UMl
намертво «вшиваются» в них. Точнее говоря, в поверхности лежат не только контрольные вершины,
но и сама кривая целиком. (Чтобы снова сделать поверхность «неживой», то есть обычной, надо
еще раз выполнить Modify=>Make Not Live).
Если выбрать полученную кривую, а затем взять Move Tool, то выяснится, что у таких
кривых «не хватает одной оси».
Кроме того, эти кривые не появляются в Outliner, что само по себе вызывающе.
Дело в том, что, как я уже говорил, это особый тип кривых. Для этих кривых трехмерное
пространство схлопнулось до размеров поверхности, на которой они находятся. Их контрольные
точки также лежат на поверхности и имеют всего две степени свободы - их можно перемещать
лишь в двух направлениях, вдоль поверхности. Как нетрудно догадаться, это направления U и
V, определенные для каждой NURBS-поверхности. Такие кривые лучше называть «кривые в
поверхности», чтобы подчеркнуть их «вшитость» в поверхность. По причине такой «вшитости» эти
кривые можно увидеть в Outliner, только если включить отображение shape-нод (Display=>Shapes).
Это подчеркивает их принадлежность форме поверхности, а не трехмерному пространству.
188
Книга Сергея Цыпцына
«Кривые на поверхности» можно использовать как обычные кривые во всех операциях
моделирования типа Loft или Bevel. Однако их «принадлежность» к поверхности позволяет
использовать их в операциях, учитывающих кривизну поверхности, на которой они лежат, например
Freeform Fillet. Это делает «кривые на поверхности» просто незаменимыми для построения гладких
сопряжений между объектами.
Расширение сознания и понимания природы кривых на поверхности
Проделайте небольшое упражнение, позволяющее лучше понять природу кривых на
поверхности, а также ответить на вопрос, почему в MAYA нет примитива «спираль».
Создайте в новой сцене NURBS-цилиндр.
Растяните его по вертикали и сделайте его «живым»: Modify=>Make Live.
Сплайновое моделирование
189
Сейчас мы нарисуем на цилиндре, нет, не кривую, а прямую линию.
Откройте Option Box инструмента CV Curve Tool и выберите там Curve Degree=1 Linear (то
есть первую степень для рисования ломаных линий).
Затем поставьте всего две точки на цилиндре (этого достаточно, чтобы создать отрезок
кривой первой степени). Одну внизу, другую вверху. Нажмите Enter.
А теперь попытайтесь осознать, что же вы натворили. На поверхности третьего порядка, вы
нарисовали отрезок прямой линии! Причем MAYA даже не выругалась по ходу дела. Если осознать
содеянное не удается, проделайте (можно мысленно) такой эксперимент.
Возьмите чистый лист бумаги. По краям нарисуйте две точки на разной высоте. Соедините
их прямой линией. А теперь сверните лист в трубочку, так чтобы края соприкоснулись. Как
выглядит прямая линия? Правильно, как кусок спирали.
Точно так же, построенная кривая является отрезком прямой на поверхности цилиндра.
Но поскольку цилиндр суть свернутая в трубку плоскость, мы видим кусок спирали. Кривая
целиком лежит в поверхности цилиндра и соединяет кратчайшим путем две точки на цилиндре (в
математике для взрослых такие кривые называются геодезическими).
Выберите верхнюю контрольную точку кривой. Подвигайте ее за манипулятор в
горизонтальном направлении, вдоль края цилиндра. Если изловчиться, то можно «намотать»
конец кривой на цилиндр в несколько оборотов.
190
Книга Сергея Цыпцына
show).
Когда устанете мотать, загляните в Channel Box, и там вы обнаружите строчку CVs (Click to
Щелкните по ней - увидите координаты выбранной контрольной вершины. Только
координаты не в пространстве, а на плоскости цилиндра, типа широты и долготы. Также можно
заметить, что координата Z равна нулю. Пытливые умы быстро сообразят, что X и Y соответствуют
координатам U и V.
Вбейте для Y довольно большое значение, например, 64. Спираль намотается на цилиндр
около восьми раз. Поэкспериментируйте со значением X и положением нижней точки.
Вдумайтесь еще раз: всего две точки определяют спираль, притом с произвольным
количеством витков. Вспоминайте про лист бумаги (если будет совсем туго).
Недовольное примечание. То, что MAYA рисует построенную кривую в виде ломаной
угловатой линии - это глюк последней версии программы, чья-то недоработка,
чистая профанация или неуклюжее желание напомнить пользователю, что кривая
имеет первую степень. На самом деле, такая кривая абсолютно точно лежит «в
поверхности» и никоим образом не оттопыривается в виде ломаных уголков. (Ведь
при сворачивании листа бумаги нарисованная линия не топорщится!) В версии MAYA
1.0, помнится, такого безобразия не было.
Чтобы завершить свой «психоделический эксперимент», выберите кривую на поверхности
целиком и превратите ее в обычную трехмерную кривую с помощью операции Edit Curves=>Duplicate
Surface Curves.
Возникнет новая обычная кривая третьей степени, которую можно оттащить в сторону и
Сплайновоемоделирование
191
шиш
убедиться, что Construction History полностью сохраняется в ходе выполненной операции. Изменяя
форму цилиндра, вы будете изменять форму спирали.
Дальше я изложу еще немного теории, предназначенной /\ля взрослых мальчиков и
связанной с понятием «жесткости» точек (Multiplicity), их весами (CV weights) и определением
граничных условий. В принципе изложенных сведений про кривые достаточно, чтобы начать с
ними работать, особенно если ваши задачи лежат только в области создания органических форм.
Однако если вы намерены строить изощренные сплайновые модели или собираетесь заняться
полупромышленным дизайном, деваться некуда - вы просто обречены на углубленное изучение
свойств сплайновых объектов.
Небольшой раздел для взрослых. Multiplicity.
Концевые условия (End Conditions)
MAYA позволяет притягивать кривую к контрольным точкам с помощью операции Edit
Curves=>CV Harden. (Не надо путать эту операцию с изменением весов контрольных точек, она
оперирует таким понятием как CV Multiplicity.)
Эта операция работает адекватно, только если включить опцию Keep Originals. В этом
случае создается нода типа hardenPoint, у которой можно вручную задавать значение параметра
multiplicity. В противном случае значение multiplicity всегда устанавливается равным степени
кривой, то есть трём в нашем случае. Эта команда также работает только в том случае, если
справа и слева от выбранной контрольной точки находятся по две точки со значением multiplicity
равным единице. Иначе говоря, эта операция не работает на концах кривой.
Терминологический комментарий. Multiplicity можно перевести как
«множественность» или, если уж совсем по-умномуу «мультипликативность».
Этот термин указывает, сколько реально точек скрываются под одной видимой
192
Книга Сергея Цыпцына
№
точкой, В случае, когда в одном месте пространства находятся нескольких
контрольных вершин, говорят про CV Multiplicity. Если совпадают несколько Edit
Points, их называют multi-knot или multiple knot.
Аналогичного эффекта «множественности точек» можно достичь, вставляя в любом месте
кривой (в том числе и в Edit Point) multiple knot при помощи операции Edit Curves=>lnsert Knot. В
этом случае контрольная точка как бы притягивается к кривой и приобретает multiplicity равную
трём. При перемещении ее также обнаруживается угол на кривой.
Если вы выберете Edit Point в этом углу и понажимаете стрелки вправо и влево, то увидите,
что там, на самом деле, целых три точки. Правда, попытка таскать их индивидуально не будет
успешной. В этом и состоит иллюстрация понятия multiple knot, то есть «множественный узел».
При этом, контрольная вершина в углу одна, в чем также нетрудно убедиться, нажимая стрелки
вправо-влево.
Нетрудно также убедиться, что на концах любой кривой всегда присутствуют
«множественные» точки, то есть multiple knots. Однако команда Rebuild с опцией No Multiple Knots
не «развязывает» эти узлы. Для того, чтобы удалить «множественность» на концах кривой нужно
задать Rebuild Туре = End Conditions и установить End Conditions = No Multiple Knots.
Пытливые умы тут же вспомнят, что в иструментах создания кривых (CV/EP Curve Tool)
была похожая опция, которая называлась Multiple End Knots, включенная по умолчанию.
Если ее выключить, то создаваемые кривые не будут касаться своим концами первой и последней
контрольной точки.
Сплайновое моделирование
193
Такие кривые, конечно, не сильно удобно редактировать с помощью контрольных точек,
однако они обладают весьма замечательными свойствами.
Если вы построите и гладко состыкуете две обычных кривых, а потом примените к ним
обоим любой деформер (например, Lattice или Bend), то в месте соединения кривых явно вылезет
угол. Тоже самое будет и с поверхностями.
Однако если построить две кривые с выключенной опцией Multiple End Knots и гладко
их состыковать (это очень легко сделать, просто «приснапив» три последние контрольные точки
первой кривой к трем первым точкам второй кривой, причем можно это сделать прямо в процессе
построения), то применение любого деформера не вызовет появления швов и углов между
кривыми. (Пример применения bend деформера сохранен в файле endConditions. та.) Можете также
проверить это явление и для поверхностей, у которых края не являются «множественными».
Таким образом, кривые и поверхности без multiple knots на концах обладают весьма
полезными свойствами, однако их применение совершенно не распространено в связи с
трудностями контроля и редактирования границ объектов.
Веса контрольных точек (Weights)
Теперь разберем, что такое веса контрольных точек. Особо эрудированные пытливые умы
уже прослышали, что буква R в аббревиатуре NURBS, означает «rational», что, в свою очередь,
194
Книга Сергея Цыпцына
означает: веса контрольных точек кривых и поверхностей могут иметь значения, отличные от
единицы, и пользователь может произвольно изменять их.
Совсем уж филологически подкованные умы спросят, а где же ratio (отношение) из слова
rational? Ответ на это - сугубо математический: формула для NURBS может представлять собой
отношение (частное) двух полиномов.
Изменение весов контрольных точек должно вести к изменению степени притяжения
кривой или поверхности к этим контрольным точкам.
«И как будем менять?», спросите вы.
Легально никак! MAYA работает с rational-геометрией в режиме Read Only. То есть, она
понимает такие объекты и корректно отображает их. Если вы, например, сымпортируете в MAYA
сцену в формате IGES, созданную за пределами AAAYA и содержащую геометрию с дробными весами,
то MAYA прекрасно ее скушает и даже позволит вам с нею работать. Но никаких стандартных
инструментов для изменения значений весов в MAYA нет. И, похоже, не будет, так как MAYA
позиционируется как пакет для анимации, а не для промышленного дизайна, и поэтому требования
к точности построения сплаиновых поверхностей не являются слишком строгими. Более того, MAYA
имеет определенный набор инструментов, чтобы избавляться от rational-геометрии. В частности,
в опциях операции Rebuild Surfaces есть метод Non-Rational, с помощью которого вычищаются все
веса, отличные от единицы, и поверхность перестраивается в тип non-rational.
Однако, зная, как пользоваться языком MEL, и обладая известной сообразительностью,
можно попробовать поиграть с весами точек. С помощью документации к ноде nurbsCurve=>curve
Shape=>controlPoints выясняем, что представляет собой атрибут weights, который содержит веса
точек.
Строим сплайновую окружность по умолчанию Create=>NURBS Primitives=>Circle.
В Script Editor выполняем команду
getAttr .wt[0:7]
// Result: 11111111//
Полученные единицы и есть веса восьми контрольных точек окружности. Пробуем изменить их
командой
setAttr .wt[0:7] 5 15 15 15 1
Получаем «угловатую окружность», притянутую к своим четным контрольным точкам.
Сплайновое моделирование
195
Продолжим издевательства. Выполните команду
setAttr .wt[0:7] 10 10 10 10
Получим квадрат.
Таким образом, чтобы изменить вес контрольной точки кривой, надо знать ее номер и
синтаксис команды setAttr. Для поверхностей все немного сложнее, так как номер точки зависит
от количества столбцов и строк контрольных точек, однако вычисляется это без труда. На сайте
www.highend3d.com находится некоторое количество скриптов с адекватными интерфейсами для
редактирования весов точек. Однако я бы не советовал увлекаться rational-геометрией, так как
многие операции работы с поверхностями не будут корректно работать с такими объектами. В
частности, операция Align не обеспечит гладкую стыковку, а конвертирование таких поверхностей
в сабдивы просто игнорирует rational-геометрию.
Для любителей Безье
Для неутомимых любителей кривых и патчей Безье могу предложить один инструмент,
который, возможно, немного скрасит их ностальгию по «усикам» и «гантелькам». Но немного и
ненадолго. Для кривых такой инструмент называется Edit Curves=>Curve Editing Tool. При помощи
него можно выбрать любое место на кривой и отредактировать кривую в этом месте. В отличие
от кривых Безье, этот инструмент позволяет редактировать кривую в любом месте, а не только на
границах сегментов.
196
Книга Сергея Цыпцына
Манипулятор этого инструмента представляет собой «паровоз», который умеет ездить
по кривой, может изменять положение любой точки кривой, а также величину и направление
касательной в любой точке.
Просто щелкая в любое место кривой, вы можете потащить кривую за это место и при
помощи манипуляторов отредактировать касательную в этой точке. Коль скоро мы договорились
не использовать острые углы, вопрос «ломания» касательной обсуждать не будем.
Две пунктирные линии позволяют сделать касательную к кривой вертикальной или
горизонтальной. Часто это удобно делать для крайних точек кривой, когда надо «подвести» кривую
к какой-нибудь границе строго вертикально или горизонтально.
Для поверхностей существует аналогичный инструмент по адресу Edit NURBS=>Surface
Editing=>Surface Editing Tool. Он также позволяет перемещать любую точку поверхности и
дополнительно редактировать направление нормали.
Лично мне редактирование кривых и патчей с помощью узлов и касательных, напоминает
процесс создания скульптуры при помощи дощечек, надетых на руки. Представьте, что вам нужно
получит нужную форму из пластилина, прикладывая такие дощечки в строго определенных местах
и легонько их поворачивая.
В этом месте очень удобно сделать стремительный реверанс в сторону артизана. И заодно
потихоньку перейти к работе с поверхностями.
Артизан. Воплощение в скульпуре
Артизан (Artisan) это название набора различных инструментов инструментов, использующих
концепцию трехмерных кистей для выполнения разного рода задач, которые могут быть сведены к
раскрашиванию поверхностей различными свойствами.
В приложении к моделированию Артизан имеет три воплощения. Это три инструмента: Edit
NURBS=>Sculp Geometry Tool, Edit Polygons=>Sculp Polygon Tool и Subdiv Surfaces=>Sculp Geometry
Tool.
Сразу оговорюсь: все они относятся к разряду инструментов абсолютно неточного
моделирования. Их задача состоит в том, чтобы облегчить нормальному человеку
(а не безумному инженеру) создание трехмерных форм привычными и интуитивно
Сплайновое моделирование
197
ниш
понятными способами. Дело в том, что на заре компьютерной графики координаты
точек приходилось набивать вручную и затем смотреть, что из этого получилось.
Потом придумали манипуляторы и стало можно перетаскивать точки прямо на
экране. Но если речь идет о скульптуре или лепке трехмерных моделей, а не о
конструировании, такой метод весьма далек от естественного. Чтобы хоть
как-то адаптировать традиционные скульптурные методы, были разработаны
инструменты Артизан для работы с поверхностями.
Инструменты основаны на концепции кистей, которыми можно надавливать (Push),
вытягивать (Pull) или сглаживать (Smooth) поверхность прямо в трехмерной перспективной
камере.
Эти инструменты подходят для создания базовых или грубых форм для дальнейшего
редактирования. При работе с ними акцент делается не на детали, а на форму модели целиком,
на ее характер и общие очертания.
Использование этих инструментов вызывающе просто. Достаточно выбрать объект, затем
соответствующий инструмент, а далее желательно открыть Option Box этого инструмента, чтобы
получить доступ ко всем его настройкам. Настройки всех артизановских инструментов практически
идентичны, поэтому я буду пока говорить про Edit NURBS=>Sculp Surface Tool.
Совет. Можно быстро добраться до этого инструмента с помощью меню на правой
кнопке мыши, где нужно выбрать Paint=>Sculpt.
Так как это инструмент (Tool), то курсор мыши принимает форму кисти, соответствующую
этому инструменту, а дальше можно красить (или царапать мышью, если угодно) объект, с
восхищением наблюдая происходящее на экране.
Настройки инструмента, хоть и многочисленны, но быстро осваиваются методом тыка.
Первое, во что стоит потыкать, это радиус кисти и тип операции (Operation). Так как по кнопке
Tool Help выскакивает очень понятная документация с картинками, нет смысла перечислять все
параметры. Комментариев к некоторым из них и немного практических советов будет вполне
достаточно.
Идеальным является наличие планшета при использовании Артизана. Наличие двух
радиусов позволяет задать диапазон изменения радиуса кисти при нажатии на планшет. В случае
использования мыши второй радиус игнорируется.
Совет. Используйте горячую клавишу Ъ' для интерактивного изменения радиуса
кисти (brush). Для этого нажимайте и удерживайте эту клавишу, при этом
198
Книга Сергея Цыпцына
нажимайте и перемещайте левую кнопку мыши прямо в окне камеры.
Нажатая и удерживаемая кнопка 'и' показывает marking menu, «обслуживающее»
инструмент Артизан. В нем можно быстро выбрать операцию и другие
параметры.
Во время рисования удобно отключить сетку и назначить на поверхность бликующии
материал. Отключение сетки делается в настройках инструмента, в разделе Display, с помощью
выключения галки Show Wireframe.
Часто бывает необходимо рисовать сразу двумя кистями симметрично относительно какой-
нибудь оси. Это можно сделать в разделе Stroke, включив галку Reflection и выбрав ось.
Совет. Чтобы замаскировать часть поверхности, то есть защитить ее от
рисования, выделите нужные контрольные вершины, а потом снова включите
инструмент. Рисование будет производиться только по выбранным вершинам.
Сплайновое моделирование
199
Следует отчетливо понимать, что результатом ваших безумных манипуляций с Артизаном
будет банальное перемещение контрольныхточек. Поэтому для адекватных результатов поверхность
должна быть достаточно «плотная», то есть содержать приличное количество контрольных вершин.
Это плохо согласуется с инженерным подходом и советом экономить контрольные вершины, но
чудес не бывает, и за удобство использования такого «человеческого» инструмента приходится
платить.
Совет. Если вы хотите начать красить другой объект, но не хотите при этом
переключаться в Select Tool, выбирать объект и снова включать Артизан,
используйте пункт Select в контекстном меню, выпадающем над любым объектом
при нажатии правой кнопки мыши.
Полезное применение Артизана заключается также в загрузке карты изображения прямо
в выбранную операцию. Иначе говоря, выдавливание и вытягивание объекта целиком по карте
изображения. Некий интерактивный displacement.
Для этого нужно выбрать операцию (например Pull), а затем в разделе Attribute Maps=> Import
нажать кнопку Import и выбрать нужный файл с изображением.
Но одно из самых полезных и не таких очевидных применений Артизана основано на
его способности сглаживать поверхности. Дело в том, что операция Smooth предназначена не
только для того, чтобы сглаживать ваши неуклюжие движения мышью. Ее можно применять
для редактирования поверхностей, вообще не затронутых Артизаном прежде. Операция Smooth
«расправляет» поверхность, более равномерно распределяя точки вдоль самой поверхности.
Это очень удобно, когда ваша поверхность в результате редактирования «запуталась», то есть
200
Книга Сергея Цыпцына
ряды контрольных точек стали переплетаться или просто превратились в неравномерную сетку.
Применение операции Smooth «разгладит» такие участки и распределит контрольные точки
вдоль поверхности более равномерно. Полезно включить отображение компонентов Hull для
NURBS-поверхностей (Display=>NURBS Components=>Hull), чтобы интерактивно наблюдать процесс
«расправления». В этом случае также полезно использовать различные значения параметра
Reference Vector, определяющего в каком направлении происходит сглаживание. Кнопка Flood,
применяющая выбранную операцию ко всей поверхности целиком, тоже может сослужит хорошую
службу в случае сглаживания поверхности.
Для полигонов операция Smooth также делает своеобразное «расслабление» полигональной
сетки, стремясь выровнять расстояния между вершинами.
Еще раз оговорюсь, что применение инструментов Sculpt Tools весьма ограничено.
Адекватно применять их для работы с органическими, расплывчатыми и «неточными» формами.
Эти инструменты позволяют сэкономить время в случае, когда надо быстро «слепить» или «помять»
поверхность предсказуемым образом, не перетаскивая при этом огромное количество контрольных
точек и полигональных вершин.
Примечание. Кодовое название для Артизана - Jasper. Попробуйте сделать поиск по
этому слову в палке, где установлена MAYA.
Работа с поверхностями. Идеологические особенности
Многие методы работы с поверхностями являются аналогами операций для работы с
кривыми. Команды Attach и Rebuild имеют аналогичные параметры. Вместо Insert Knot используется
Insert Isoparm, вместо Reverse Curve Direction - Reverse Surface Direction и т. д. И теоретическая
часть и все ужасы параметризации, изложенные в разделе, где описана работа с кривыми, по-
прежнему действуют и при работе с поверхностями. Все понятия (такие, как степень, тангенс
и кривизна, параметризация, multiplicity) также применимы к поверхностям, хотя и с одной
маленькой поправкой - у поверхностей всегда есть два направления.
NURBS-поверхность - это всегда сетка, состоящая из двух семейств кривых-образующих,
Сплайновое моделирование
201
шми
называемых изопармами. У каждого такого семейства есть свое направление, общее для каждого
семейства. Направления эти обозначаются буквами U и V, поэтому если показать контрольные
вершины для любой поверхности, в одном из углов поверхности можно увидеть квадратный нолик
(это начало поверхности) и две точки, обозначенные U и V и задающие два направления вдоль
поверхности.
В отличие от полигонов нормаль у NURBS-поверхностей всегда направлена в одну
сторону: вдоль всей поверхности. Направление нормали определяется взаимным расположением
направлений U и V (математически говоря, их векторным произведением), поэтому изменение
одного из направлений на противоположное при помощи операции Edit NURBS=> Reverse Surface
Direction приведет к развороту нормали в обратную сторону. Нормаль выбранного объекта всегда
можно показать через Display=>NURBS Components=>Normals.
Вместо маркера Curve Point у поверхностей существует Surface Point.
Также на поверхностях можно выбирать изопармы (Isoparms). Это кривые, лежащие прямо
«в поверхности» и предназначенные только для выбора с целью дальнейших построений. Их нельзя
перемещать в пространстве, редактируя таким образом поверхность. Изопармы всегда можно
«отодрать» от поверхности, скопировав и превратив их в обычные кривые с помощью операции
Edit Curves=>Duplicate Surface Curves.
202
Книга Сергея Цыпцына
Примечание. «Изопармы» можно перевести с русско-латинского как «линии
одинакового значения параметра». Вдоль любой изопармы значение параметра U
или V всегда остается одинаковым.
У поверхностей нет компонент типа Edit Points, но если вы хотите «схватить и потащить»
поверхность за произвольную точку, лежащую на поверхности, используйте Edit NURBS=>Surface
Editing=>Surface Editing Tool. В этом же меню находятся операции Break Tangent и Smooth
Tangent, позволяющие быстро «сломать» или наоборот «сгладить» поверхность в районе выбранной
изопармы.
Совет. Ряды контрольных точек удобно выбирать при помощи компонента
Hull. Строго говоря, Hull - не компонент, а просто экранная сетка, соединяющая
контрольные вершины. С их помощью можно не только выбирать целые ряды точек
в обоих направлениях, но и контролировать «запутанность» сетки контрольных
вершин.
Сплайновое моделирование
203
Главное ограничение сплаиновых поверхностей
Еще раз напомню об одном недостатке сплаиновых поверхностей, из-за которого и было
придумано столько различных изощренных инструментов.
Любая сплайновая поверхность всегда является сеткой из изопарм. Даже сплайновая
сфера представляет собой сетку из меридианов и параллелей, состоящую из прямоугольных
ячеек. Сплайновую поверхность всегда можно развернуть в прямоугольную сетку-плоскость, или
наоборот, свернуть из прямоугольной сетки. Об этом надо помнить всегда. Это природа сплаиновых
поверхностей и следствие их математического описания, и с этим ничего нельзя сделать. Напомню,
что обыкновенную руку можно представить как минимум одиннадцатью объектами: ладонь из
сферы, пять пальцев из цилиндров и еще пять соединений-колец между ладонью и пальцами. Если
пальцы и соединения-кольца еще можно пытаться «сшить» в один объект, то сферу с пальцами
нельзя соединить в один объект в принципе.
Примечание. Конечно, можно взять сферу, задать ей 10000 контрольных вершин и
вытянуть из нее руку с пальцами. Это будет один объект, но подумайте о том,
как это можно сделать, и самое главное, на что сгодится такая поверхность -
ведь к анимации она будет явно непригодна.
Дело в том, что сплайновые поверхности присоединяются друг к другу краями (или
границами). Операцию Attach Surfaces, «сшивающую» две поверхности в одну, всегда используют
для присоединения края поверхностей. Нельзя объединить две поверхности в одну произвольным
образом, можно только подтянуть их края друг к другу, а затем соединить их в новую сетку из
изопарм. Перед применением операции Attach Surfaces всегда представляйте себе, как будет
выглядеть сетка из изопарм для новой поверхности.
Кроме того, операция Attach Surfaces не работает с краями отверстий, вырезанных с
помощью Trim Tool, поэтому объединять поверхности вы сможете, только соединяя их реальные
границы.
Ограничением служит и то, вы не можете соединить только часть границы поверхности с
другой поверхностью. То есть края объектов соединяются целиком.
204
Книга Сергея Цыпцына
Конечно, операции Align и Stitch, позволяют «подогнать» часть края одной поверхности
к границе другой. Но они не объединяют две поверхности в одну, а речь сейчас идет именно об
этом.
Но даже если края двух поверхностей находятся друг напротив друга и примерно совпадают
по размеру, это еще не значит, что эти поверхности можно успешно «сшить» в один объект с
помощью Attach Surfaces. Края поверхностей должны быть совместимы.
Совместимые края поверхностей
Интуитивно понятно, что если вы собираетесь объединить две поверхности в одну
вдоль какого-нибудь края, то лучше будет, если количество сегментов вдоль этих краев будет
одинаковым.
Дальше я вместо «количество сегментов» буду иногда употреблять выражение «количество
изопарм», хотя количество видимых изопарм на экране отнюдь не всегда совпадает с количеством
сегментов на поверхности. Чтобы эти «количества» совпадали, то есть чтобы увидеть на экране
настоящее количество сегментов в виде изопарм, надо либо перейти в режим wireframe (клавиша
4) и нажать клавишу 1, либо включить в окне камеры режим Shading=>Shade Options=>Wireframe
on Shaded.
Потренируйтесь на двух NURBS-плоскостях, применяя к ним операцию Attach Surfaces
(включите Keep Originals, чтобы изменять исходные поверхности и тут же видеть результат).
Если вы соедините две плоскости, у которых количество сегментов вдоль границы,
например 3 и 7, то на результирующей поверхности их будет 9, то есть возникают дополнительные
ряды контрольных вершин, поверхность усложняется, и при этом новые изопармы расположены
не самым удачным образом.
Сплайновое моделирование
205
Если же количество сегментов на второй поверхности будет равным шести, то результат
будет более «красивый» и будет иметь также шесть сегментов.
Выводы делайте сами. Могу лишь посоветовать: перед стыковкой поверхностей надо
позаботиться о том, чтобы количество сегментов на объектах было хотя бы кратным одному и
тому же числу.
Но это - самое простое, но далеко не последнее условие для успешного объединения
поверхностей! Параметризация - ваш ночной кошмар - должна быть проверена перед стыковкой и
должна быть согласована на обеих поверхностях, даже если количество сегментов одинаково.
Совместимая параметризация
Даже если на обеих поверхностях задана параметризация одного типа (Uniform), но на
одной их них диапазон параметра определен от нуля до единицы, а на другой от нуля до количества
сегментов (0 to #Spans), то вас поджидают различные неприятности (о том, что происходит при
попытке объединить поверхности с Uniform и Chord Length параметризациями, можете посмотреть
в упражнении ближе к концу этой главы).
Создайте две одинаковые (!) плоскости и перестройте одну из них так (с помощью Re-
206
Книга Сергея Цыпцына
build Surfaces), чтобы задать Uniform-параметризацию типа 0 to #Spans. (По умолчанию диапазон
параметра на примитивной плоскости изменяется от нуля до единицы).
Затем примените операцию Attach Surfaces. To, что изопармы немного
использовался метод Blend), не так страшно.
«съедут» (если
Попробуйте наложить текстуру типа Checker на поверхность - вы увидите, что она ляжет,
мягко говоря, неравномерно.
Дело в том, что параметр совершенно неравномерно распределен вдоль поверхности. В
Сплайновоемоделирование
207
НШМА
одной половине поверхности, унаследованной от первой плоскости, параметр изменяется от нуля
до единицы, а во второй половине начинает быстро изменяться от сегмента к сегменту. Выберите
несколько изопарм и посмотрите в заголовке окна MAYA (или в Script Editor), какие значения
параметра соответствуют им.
Таким образом, перед применением операции Attach Surfaces (и не только ее, а и многих
других) всегда надо приводить поверхности к одному типу параметризации. Я советую использовать
параметризацию по количеству сегментов - 0 to #Spans. Это всегда можно сделать перестроив
нужные поверхности с помощью операции Rebuild Surfaces с опциями Rebuild Type=Uniform,
Parameter Range=0 to #Spans, Keep=CV.
Напомню, что определить тип параметризации и диапазон изменения параметра можно в
Attribute Editor раздела NURBS Surface History.
nurb$Plane2 nurb$PlaneShape2 ] rebuildsurfacel | makeNurbPlane2 | attacti
I*] Focus
nurbsSurface: |nurb$PlaneShape2
Г ▼! NURBS Surface History
Min Max Range U 10.000
Min Max Range V |0 000
Spans UV |6
Degree UV (з
Form U
В идеале максимальные значения атрибутов Min Max Range U/V должны совпадать с
количеством сегментов SpansllV, а минимальные - равняться нулю.
Примечание. После операции Detach Surfaces диапазон изменения параметра может
начинаться не с нуля, что тоже может быть источником проблем. Это же
относится и к кривым.
Вывод из всех этих устрашающих экспериментов следующий. Перед применением очередной
операции сплайнового моделирования старайтесь контролировать как количество сегментов, так и
тип параметризации на выбранных поверхностях и кривых. Привычка перестраивать поверхности,
сохраняя форму (Keep=CV) и перераспределяя параметр (Parameter Range=0 to #Spans), поможет
сэкономить вам массу времени, которое в противном случае придется затратить на устранение
проблем.
208
Книга Сергея Цыпцына
Конвертирование сплайнов в полигоны и тесселяция
Любую сплайновую поверхность можно превратить в полигональную. Обратное утверждение
- неверно. Полигональную поверхность можно пытаться представить в виде некоторого (обычно
весьма большого) числа сплайновых патчей. Ниже я покажу, как.
Преобразование сплайнов в полигоны может понадобиться, например, для экспорта вашей
модели в игровой движок или в систему рендеринга, не поддерживающую майские сплайны.
Конвертация сплайнов в полигоны производится с помощью операции Modify=>Convert=>NURBS
to Polygons. В Option Box этой операции вы можете выбрать, каким методом производить
конвертацию.
По умолчанию выбран метод Standart Fit - он автоматически добавляет разбиения на
полигоны в местах большой кривизны, на основе критериев и параметров, которые вы задали в
Option Box.
Для экспорта в игровые программы иногда удобно использовать метод Count, задающий
только требуемое число полигонов, a MAYA сама определяет критерии разбиения.
Самым предсказуемым является метод General, позволяющий установить, на сколько
полигонов будет разбит каждый сегмент поверхности. Для этого надо в параметрах разбиения
Initial Tessellation Controls обязательно установить U/V Type=Per Spans # of Iso Params (для каждого
сегмента между изопармами) и задать необходимое число разбиений для Number U и Number V.
Кстати, все методы и параметры можно настроить после конвертации, в результате
которой создается нода nurbsTessellate - в ее атрибутах есть все необходимые настройки для
экспериментов.
Процесс превращения сплайновой поверхности в полигональную также происходит каждый
раз в процессе рендеринга и называется тесселяцией (tessellation). Вы можете задавать настройки
тесселяции для каждой поверхности в Attribute Editor в разделе Tessellation.
Сплайновое моделирование
209
Эти настройки похожи на параметры конвертации для операции Convert=>NURBS to
Polygons, и для каждого объекта их надо настроить индивидуально. Вы должны понимать, что именно
эти настройки определят, насколько груб или гладко будет выглядеть ваш сплайновый объект на
финальной картинке - плюс от них зависит и время просчета этой картинки.
К сожалению, и родной майский рендерер и даже mental may в текущей версии используют
явное разбиение сплаиновых поверхностей на полигоны перед просчетом (mental ray делает это
достаточно интеллектуально, так что зачастую вам попросу не приходится заботится о настройках
тесселяции). Поэтому необходимо держать в уме, что даже самая гладкая и «красивая» сплайновая
модель с процессе рендеринга превращается в полигоны.
Теперь немного о конвертировании полигонов в сплайновые поверхности. Может так
случиться, что вы, например, неожиданно выиграете в лотерею тысяч семьдесят долларов и
купите на них хороший 30-сканер. Результат работы такого сканера - облако точек, которое,
как правило, довольно безболезненно превращается в густую полигональную сетку. Хитрыми
методами количество вершин такой модели может быть снижено до адекватного числа, однако
превратить такую полигональную сетку в сплайновую модель нажатием одной кнопки невозможно.
Для этого существует целый класс программ, типа Paraform, интеллектуально «обтягивающих»
полигональную сетку набором сплаиновых патчей, причем границы патчей задает вручную сам
пользователь. Любые методы автоматической конвертации вряд ли принесут успех.
Возьмите полигональную сферу и удалите у нее половину граней, затем сконвертируйте
этот огрызок в сабдивы с помощью Modify=>Convert=>Polygons to Subdiv.
А затем сконвертируйте получившийся сабдив в сплайновую модель: Modify=>Convert=>
Subdiv to NURBS.
210
Книга Сергея Цыпцына
А теперь откройте Outliner и с удивлением поглядите на десятки мелких сплайновых
поверхностей, созданных для того, чтобы повторить форму куска сферы. Таким образом,
поверхность, представленная одним полигональным объектом, может быть воспроизведена лишь
внушительным количеством сплайновых «кусков».
Теоретическая часть по сути дела исчерпана, поэтому вместо описания инструментов работы
с поверхностями, предлагаю сделать средних размеров практический пример, на основе которого
можно будет обсудить особенности использования различных методов работы с поверхностями.
Паровозостроение
Создайте новую сцену: File=>New.
Создайте NURBS-цилиндр: Create NURBS Primitive=>Cylinder.
Поверните и растяните его (rotateX=90; scale 2; 5; 2;).
Создайте NURBS-конус и расположите его над цилиндром
(translate 0; 3.5; 3.5; rotateX=180;).
Выберите конус и цилиндр. Перейдите в режим F3-Modeling.
Выполните Edit NURBS=>Surface Fillet=>CircularFillet.
Сплайновое моделирование
211
iilfliyj
Примечание. Если в тексте не указано открытие Option Box для операции Circu-
larFiilet и последующих действий, подразумевается использование параметров по
умолчанию. В случае, когда в Option Box ранее устанавливались другие параметры
для этих операций, следует зайти в Option Box и установить параметры по
умолчанию (Edit=>Reset Settings).
Похоже, что воротник для конуса великоват. Однако, чтобы не переделывать построение
заново, можно воспользоваться тем, что MAYA для каждой операции моделирования создает
специальную ноду, в которой запоминает параметры, с которыми эта операция применялась.
Выберите соединяющую поверхность.
В Channel Box щелкните на rbfSrfl и установите Primary/Secondary Radius=0.5;
Выберите конус. Отодвиньте его от края цилиндра (translateZ=3).
Поверхность сопряжения (Fillet Surface) последует за конусом и перестроится в соответствии
с введенными значениями для радиусов. MAYA помнит, что поверхность была построена между
конусом и цилиндром, и поэтому при перемещении конуса она перемещается и перестраивается
"на ходу". Точно так же при изменении параметров построения поверхность "подстраивается" под
новые параметры. Как я уже упоминал, такой принцип "запоминания истории" называется
Construction History. В соответствии с этим принципом большинство параметров выполнения той или
иной операции можно задавать не только в момент построения (через Option Box), но и изменять
впоследствии, как параметры элемента истории в Channel Box в разделе INPUTS.
Закроем дырку на переднем крае цилиндра.
Нажмите правую кнопку мыши на цилиндре и укажите Isoparm, затем выберите крайнюю
изопарму и выполните Surfaces=>Planar
212
Книга Сергея Цыпцына
Вообще-то, использование поверхностей типа Planar - дурной тон. Прежде всего потому,
что они совершенно непригодны для редактирования. Кроме того, для их построения требуются
исключительно плоские замкнутые кривые и любая попытка пошевелить исходную поверхность
или кривую, через которую был построен Planar, приводит к исчезновению последнего.
Попробуйте потаскать крайние контрольные вершины цилиндра и посмотрите на результат
и на всяческую «ругань» в Script Editor.
Контрольные точки самой Planar-поверхности отнюдь не представляют собой ряды
окружностей. Более того, взглянув на них, пытливые умы без труда определят, что это просто
прямоугольная плоскость, их которой вырезали нужную форму, определяемую кривой.
Мы однако оставим эту поверхность жить, и даже проделаем несколько операций с ней.
Врага надо знать в лицо и лучше знать, какие сюрпризы он может приготовить.
А пока сделаем шапку для трубы.
Нажмите правую кнопку мыши на конусе и укажите Isoparm, затем выберите крайнюю
верхнюю изопарму и выполните Surfaces=>Bevel.
В Channel Box откройте bevell и установите следующие атрибуты Width=0.3; Depth=0.5;
Bevel Shape Type=Curve Out.
Сплайновое моделирование
213
Операция Bevel применяют обычно для камуфлирования открытого края поверхности,
когда надо «снять фаску» с этого края. Правда, мы воспользовались ею для построения целого
«продвинутого цилиндра».
Добавим декоративную деталь.
Создайте NURBS-сферу.
Приподнимите ее: translateY=2.5.
Выберите сферу и цилиндр.
Выполните Edit NURBS=>Surface Fillet=>CircularFillet.
Выберите соединяющую поверхность.
В Channel Box откройте раздел rbfSrf2 и установите Primary /Secondary Radius=0.3;
Бесполезный коментарий. Совершенно непонятно, почему операции построения
поверхностей типа Fillet находятся в меню Edit NURBS, в то время как они явно
создают новые поверхности.
Сохраните сцену (traind .та).
Выберите все поверхности прямо на экране и сдвиньте их вправо.
214
Книга Сергея Цыпцына
Все разъехалось... Это не глюки новой версии, это вышеупомянутый Double
Transformation, или двойные перемещения, вызванные тем, что некоторые объекты (например, шапка конуса
икрышка цилиндра) двигаются и сами по себе (так, как они выбраны), и еще дополнительно, из-
за того, что смещаются «породившие» их объекты. Эти перемещения просто складываются. Все
это - проделки Construction History, которую самое время уничтожить, если мы удовлетворены
внешним видом поверхностей и не собираемся анимировать, например, перемешения конуса
вдоль поверхности цилиндра.
Удаляем историю для всех объектов во всей сцене.
Edit=>Delete All by Type=>History
Закруглим край цилиндра.
Выберите Edit NURBS=>Round Tool.
Коль скоро это инструмент (Tool), MAYA ждет от нас активнейших действий, о которых
можно и нужно прочитать в HelpLine.
Курсор при этом принимает хищную форму, призывая нас быть предельно внимательными.
Подсказка гласит, что надо выбрать ровно два края соприкасающихся поверхностей (Round Tool:
Select a pair of surface edges that meet).
Поэтому лучше переключится в режим Wireframe и подъехать поближе к краю цилиндра.
Теперь следует выбрать вместе и край цилиндра и край "крышки", но не задевая
продольных изопарм, иначе вы получите сообщение, что выбрали слишком много кривых.
Сплайновое моделирование
215
lilOJi!
При помощи появившегося желтого манипулятора задайте радиус скругления около 0.3.
Точное значение для радиуса также можно ввести в Channel Box. Нажмите Enter для
завершения работы с инструментом Round Tool и построения поверхности.
Развернутое примечание. Для всех, кто невнимательно прочитал главу про
интерфейс, ниже, на всякий случай, повторю вкратце концепцию инструментов и
операций, уже для конкретного контекста.
Все действия, производимые в MAYA через главное меню, можно разделить на две
категории: инструменты и операции (Tools и Actions).
Для выполнения операции, как правило, необходимо выбрать какие-либо объекты или
компоненты и применить к ним некоторое действие, то есть пункт меню Action.
Примером является операция Circular Fillet, перед применением которой следует выбрать
два объекта, а потом выполнить соответствующий пункт меню.
Если в названии пункта меню присутствует слово Tool (например, Round Tool или Trim Tool),
этот пункт соответствует инструменту.
Работа с инструментами (Tools), в общем случае, не требует предварительного выбора
216
Книга Сергея Цыпцына
объектов: после выбора нужного инструмента из меню курсор меняет форму (то есть инструмент
становится активным) и пользователь должен выполнить некоторое количество действий,
завершаемых, как правило, нажатием клавиши Enter. После чего активным становится последний
инструмент трансформаций.
Пока инструмент активен, в строке Help Line содержатся инструкции по выполнению
необходимых действий для правильного завершения работы инструмента.
Вас наверняка смутит внешний вид появившихся объектов. Лихорадочное нажатие клавиш
1, 2 и 3 немного улучшает картину, но смущение все равно не проходит, особенно в режиме
Shaded.
Ничего страшного, просто для отображения Planar-поверхности на экране рисуется
недостаточно полигонов. (Напоминаю: даже сплаиновые объекты, отрисовываются на экране в
виде полигонов, так как видеокарта ничего не знает и знать не хочет про любые поверхности,
кроме полигональных).
Увеличить качество отображения и количество полигонов для отрисовки этой поверхности
индивидуально можно в Attribute Editor раздела NURBS Surface Display.
Выделите торец паровоза и установите значение атрибута Crv Presicion Shaded равным 20,
чтобы щели на корпусе паровоза вас больше не смущали.
Заглянем в Outliner:
Display Show Panels
Сплайновое моделирование
217
Полный ужас! Несмотря на то, что на экране можно увидеть восемь законопослушных
поверхностей, весь Outliner кишит какими-то объектами-мутантами.
Лихорадочно убиваем историю, для всех объектов.
Не сильно помогает... NurbsCylinderl вообще превратился в пустой объект (вообще-то у
него просто выключен атрибут visibility для shape-ноды). Похоже на вирусы. Будем лечить.
Лечение заключается в том, что надо удалить остатки операции Circular Fillet и применения
инструмента Round Tool. (Наличие таких отходов производства - хороший повод научиться не
использовать эти операции...) Однако вы должны быть готовы к тому, что побочные объекты могут
возникать в процессе применения некоторых операций сплайнового моделирования.
Выберите все объекты прямо на экране и сгруппируйте их, нажав Ctrl-g.
Display Show Panels
В Outliner появится новая группа, в которую войдет все выбранные на экране объекты, а
все мутанты останутся за бортом.
Теперь мутантов можно выделить прямо в Outliner и с удовольствием и отвращением
удалить. Новую группу назовите Base и сохраните сцену (train02.ma).
Какой же паровоз не любит «быстрой звезды»? Той самой, которая красуется у него на носу
и летит впереди паровоза... Вопрос в том, как сделать хорошую звезду? Например, пятиконечную.
218
Книга Сергея Цыпцына
Конечно, особо извращенные умы возьмут в руки калькулятор и начнут высчитывать значения
углов между соседними кривыми, через которые надо провести лофт, который нужно потом
замкнуть, и т.д., и т.п.
Мы пойдем другим, менее извращенным путем.
Создайте NURBS-конус.
В Channel Box установите Degree=Linear, a Sections=10.
Сдвиньте его по оси Z, так, чтобы он не пересекался с другими объектами (translateZ=10).
Перейдите в камеру top и нажмите Т. Затем выберите контрольные точки по краю конуса в любом
направлении, но строго через одну.
Можно заметить: pivot выделения не находится точно по центру конуса, из-за того, что
пять выбранных точек не симметричны относительно оси X.
Выберите Scale Tool, нажмите Insert и с помощью привязки к сетке установите pivot точно
по центру. Нажмите Insert снова и сожмите к центру выделенные точки. Звезда почти готова!
Осталось перейти в перспективную камеру, выбрать сам конус, сжать его вдоль вертикали
и поставить на место. (translateZ=5, rotateX=90, rotateZ=18).
Пытливые умы могут самостоятельно догадаться, что 18 - это 360/10/2.
Теперь можно удалить с конуса историю и «забросить» его средней кнопкой мыши в группу
Base в окне Outliner.
Сплайновое моделирование
219
НИША
Займемся кабиной.
Создайте NURBS-куб. Передвиньте и отмасштабируйте его, чтобы создать "кабину".
(translate 0; 1.5; -6; scale 5; 8; 2; )
Примечание. Перемещать и масштабировать куб необходимо, выбрав группу
nurbsCubeh Дело в том, что примитивный сплайновый кубик состоит из шести
сгруппированных плоскостей, так как в силу топологических ограничений не может
быть представлен единой поверхностью с одинаковой топологией граней. Если вы
хотите выбирать куб на экране, а не в Outliner, не забывайте нажимать стрелку
вверх.
В Outliner выберите группу Base. Спрячьте ee(Ctrl-h).
Займемся окнами.
Перейдите в камеру front.
С помощью CV Curve Tool нарисуйте замкнутую кривую.
При установке последней точки используйте привязку к точками (клавиша V), чтобы
«приснапить» ее к первой точке кривой. Рисуйте кривую напротив правой половины кабины, так
как окон будет два.
220 Книга Сергея Цыпцына
Тот факт, что первая и последняя точки кривой совпадают, еще не делает кривую
замкнутой. Можете убедиться в этом в Attribute Editor, посмотрев на атрибут Form. Кривую надо
замкнуть вручную.
Возмущенное примечание. To что написано в Attribute Editor для атрибута
Form - сущая профанация! Кривая может быть либо замкнутая (periodic), либо
незамкнутая (open). Добавление типа Closed можно рассматривать как диверсию
против процесса понимания MAYA. Если вы создадите априори замкнутую
окружность (Circle) и «разорвете» ее в любом месте с помощью операции Detach,
то полученная кривая, как следует из Attribute Editor, будет принадлежать к
типу Closed. Однако вы легко можете добраться до первой или последней точки и
потянуть ее в сторону, разомкнув совпадение концов. Тип кривой, тем не менее,
останется Closed!!
Самое интересное впереди: если удалить историю, то тип кривой послушно меняется на
Open, однако, если три-четыре раза нажать Undo, то та же самая кривая, которая только что
идентифицировалась как Closed, теперь упорно представляется как Open.
Вывод следующий: тип Closed и Open - это просто одно и тоже. MAYA не всегда может
правильно распознать совпадение концов кривой и установить нужный тип. Кроме того, совпадения
концевых точек недостаточно для замкнутости, или лучше сказать, периодичности кривой. Для
этого нужно, чтобы совпадали по три контрольные точки с каждого конца, то есть необходим
«перехлест». Чтобы сделать такой перехлест и замкнуть кривую существует операция Open/Close
Curves.
Замкните построенную кривую.
Выберите ее.
Зайдите в Option Box операции Edit Curves=> Open/Close Curves и выберите Shape=lgnore.
Нажмите Open/Close.
Сплайновое моделирование
221
При помощи Undo можете поэкспериментировать и с другими опциями замыкания. Тип
Blend аналогичен такому же из настроек операции Attach, и используется он в основном в тех
случаях, когда концы кривых уже хорошо «пригнаны» друг к другу.
Теперь осталось «отмирорить» кривую (это реально используемый термин!!), то есть
получить копию объекта, зеркально отраженную относительно какой-нибудь координатной
плоскости. Однако в АЛАУА нет операции mirror для сплаиновых объектов. Вместо этого применяется
трюк с отрицательным масштабированием.
Скопируйте кривую с установками по умолчанию (Edit=>Duplicate).
И сразу установите scaleX=-1 для получившейся кривой.
Для наглядности можете подергать манипулятор Scale Tool, для лучшего понимания того,
что такое отрицательный масштаб объекта.
Щ Channels Object
Здесь важно помнить о том, что pivot построенной кривой, как и любого другого вновь
создаваемого объекта, находится в начале координат, а масштабирование происходит, конечно,
относительно pivot'a.
Примечание. То, что pivot вновь создаваемых геометрических объектов по
умолчанию попадает в начало координат - это чудовищно удобно! Далее вы
всегда можете сделать с pivot'ом что хотите, однако с точки зрения построения
симметричных, «отзеркаленных» и просто аккуратных моделей, расположение
pivot'а в нуле координат - безусловный плюс.
Совет. Старайтесь моделировать объект и детали «около» или «относительно»
начала координат. Вкупе с привязкой к сетке это сэкономит вам массу времени
и сил. Закончив предварительное создание и редактирование, вы всегда сможете
отодвинуть объект в нужное место, причем позднее будет несложно вернуться
по необходимости к центру просто обнулив атрибуты translate. Пользователи,
искалеченные привычкой рисовать кубики в произвольном месте экрана возможно
не сразу оценят преимущества такого подхода, однако со временем наименее
упрямые начнут работать около центра.
С помощью двух этих кривых мы будем «резать» окна в кабине. Для начала спроектируем
кривые на стенки куба, чтобы получить контуры для вырезания.
Вернитесь в перспективную камеру.
Выберите обе кривые, переднюю и заднюю стенки кабины (curvel, curve2, leftnurbsCubel,
rightnurbsCubel).
Откройте Option Box операции Edit NURBS=>Project Curve On Surface.
Установите Project Along=Surface Normal.
Это определит направление проектирования. Здесь мы воспользовались тем, что
стенки кабины плоские и нормаль к ним совпадает с предполагаемой линией проектирования.
222
Книга Сергея Цыпцына
Аналогичного результата можно было достичь, выбрав направление проектирования вдоль линии
взгляда (Active View) и перейдя в камеру front.
ЕЗ О nurbsCubel
J^ topnurbsCubel
JJ bottomnurbsCubel
Jj ieftnurbsCubel
JJ rightnurbsCubel
JJ frontnurbsCubel
/J backnurbsCubel
Нажмите Project.
На обеих сторонах кабины появятся новые спроектированные кривые. Если выбрать Move
Tool, то выяснится, что у таких кривых «не хватает одной оси» манипулятора.
Кроме того, эти кривые не появляются в Outliner. Очевидно, что это «кривые на
поверхности», о которых говорилось выше в этой главе. В данном случае они используются для
того, чтобы определить на поверхности кабины замкнутые области, используемые для вырезания
отверстий.
Можно брать в руки автоген и резать окна. Автоген в MAYA представлен инструментом Trim
Tool. Выберите переднюю стенку куба.
Далее выполните Edit NURBS=>Trim Tool.
Курсор принимает агрессивную форму, приглашая нас производить неистовые действия,
а поверхность разбивается на области, разграниченные замкнутыми кривыми на поверхности и
краями поверхности. Щелкните мышкой в средней части плоскости, выбирая часть поверхности,
которую следует сохранить, а части, которые будут вырезаны, остаются отмечены пунктирной
штриховкой.
Сплайновое моделирование
223
Нажмите Enter, как и положено при работе с большинством инструментов.
Повторите вырезание для задней стенки куба.
Для улучшения отображения краев отверстий на экране, увеличьте в Attribute Editor
значение атрибута Crv Presicion Shaded - в разделе NURBS Surface Display.
Примечание. Для успешной работы с инструментом Trim Tool, необходимо, чтобы
кривые на поверхности были замкнутыми.
Если нажать правую кнопку мыши над стенками кабины, то можно увидеть, что
тримированные поверхности имеют новый тип компонент - Trim Edge. Их нельзя перемещать или
вращать непосредственно, но можно использовать для построения новых объектов.
Нажмите правую кнопку мыши над передней стенкой и выберите тип Trim Edge.
Выберите край правого отверстия.
Затем нажмите правую кнопку мыши над задней стенкой и снова выберите тип Trim Edge.
224
Книга Сергея Цыпцына
№
Нажмите Shift и выберите край правого отверстия в задней стенке
Выполните Surfaces=>Loft.
Проделайте аналогичные операции со вторым окном. Коль скоро мы не удаляли историю,
посмотрим, как ее можно использовать.
Выберите кривые curvel и curve2. Перемещайте их по вертикали. Убедитесь, что
Construction History обновляет положение отверстий на поверхностях куба.
Нажмите Undo, если необходимо. Здесь нужно помнить, что при перемещении кривых
происходит «закадровое» перепроектирование их на плоскости, перетримирование и перестройка
обоих лофтов. И все это происходит практически мгновенно (в зависимости от начинки компьютера)
или по крайней мере интерактивно. Если вы собираетесь анимировать, например, подмигивание
паровоза левым окном, можете просто проанимировать форму кривой (к примеру, с помощью
blendshape). Construction History позволить передать анимацию формы кривой на изменение
формы окна.
Онлайновое моделирование 225
Мы, правда, не собираемся делать подмигивающий паровоз, поэтому можете просто
подкорректировать форму окон, редактируя исходные кривые.
Теперь удалите историю для всей кабины и также удалите исходные кривые.
Судя по форме окошек, паровоз скорее всего будет водоплавающим, поэтому получившиеся
форточки должны напоминать иллюминаторы.
Быстро сделаем крышу и передохнем немного от сплайновых объектов.
Создайте полигональный куб и сделайте крышу кабины
Переместите куб наверх (translate 0; 6, -6; scale 6; 1; 4 )
Особенно эстетствующие умы могут схватить верхние точки кубика и с помощью Move и
Scale Tool сделать на крыше козырек. А экономные пользователи могут удалить верхнюю плоскость
кабины, находящуюся под крышей и поэтому совершенно бесполезную.
Совет. Прячьте или удаляйте объекты, которые заведомо не попадут в область
видимости, это сокращает время рендеринга и экономит память.
В Outliner выберите все объекты, относящиеся к кабине.
Еще раз удалите историю и сделайте новую группу (Edit=>Group).
Назовите ее Cabin.
Спрячьте ее (Ctrl-h).
Сохраните сцену (train04.ma).
На экране должно быть пусто, так как спрятаны обе группы. Самое время заняться колесами.
Перейдите в камеру front. Зайдите в Option Box инструмента CV Curve Tool и установите там Curve
Degree=Linear, чтобы рисовать ломаные кривые первой степени. Активно пользуясь привязкой к
сетке, нарисуйте в верхней части окна L-образный профиль будущего колеса.
226
Книга Сергея Цыпцына
Выберите кривую, нажмите Т.
Немного сгладим профиль. Для этого воспользуемся операцией Fillet.
Нажмите правую кнопку мыши над кривой, выберите Curve Point.
С помощью Shift отметьте две точки на профиле.
Откройте Option Box операции Edit Curves=>Curve Fillet и установите Trim=on, Join=On,
Construction=Freeform. Это означает, что после построения сглаживающего участка остаток угла
будет отрезан и удален, а новый участок будет присоединен к исходной кривой. После построения
можете поэкспериментировать с типами сглаживаний в Attribute Editor.
При желании закруглите другие углы и не забудьте удалить историю.
Вращаем профиль вокруг оси X.
Выберите построенную кривую. Для этого откройте Option Box для Surfaces=>Revolve,
задайте Axis Preset=X и нажмите Revolve.
Сплайновое моделирование
227
В Outliner выберите кривую профиля и удалите ее.
Для создания спиц колеса создайте NURBS-цилиндр.
В Channel Box можете установить Degree=Linear и наиболее понравившееся вам экзотическое
количество spans. Например, три. Переместите и отмасштабируите цилиндр, чтобы построить
подобие спицы.
Размножим спицу вдоль внутри колеса.
Необходимо сделать так, чтобы новая копия поворачивалась относительно предыдущей на
45 градусов. Всего будет восемь спиц, одна уже есть, поэтому надо сделать еще семь копий.
Зайдите в Option Box для Edit=>Duplicate.
Установите Rotate Х=45, Number of Copies=7.
Нажмите Apply.
228
Книга Сергея Цыпцына
Мы забыли сместить pivot!
Жмите Undo и срочно редактируйте положение pivot'a.
Нажмите Insert и, с помощью привязки к сетке, установите pivot в начало координат. (Не
забудьте снова нажать Insert, чтобы вернуться в нормальный режим).
Снова жмем Apply для копирования и, если все в порядке, сбрасываем параметры в
значения по умолчанию (Edit=>Reset Settings), а затем закрываем Option Box.
Создайте NURBS-сферу и поместите ее в центр колеса. Эстетствующие маргиналы могут
развернуть ее вокруг оси Z на 90 градусов и установить Degree=Linear для makeNurbsSphere. Совсем
уж дизайнеры могут также задать spans=3 и rotateY=22.5.
Сплайновоемоделирование
229
В Outliner выберите все объекты, относящиеся к колесу, и удалите историю.
Сделайте новую группу (Edit=>Group).
Переименуйте ее в WheeM.
Теперь надо поставить колесо на место.
В Outliner выберите группы Base и Cabin.
В Channel Box установите Visibility=on.
Выберите группу WheeH, отмасштабируйте и переместите на место первого колеса.
Теперь перед нами стоит задача размножить колесо вдоль паровоза, не зная заранее
расстояния между соседними копиями.
Нажимаем Ctrl-d и сдвигаем полученную копию на новое место.
Чтобы получить следующую копию с таким же смещением, нужно воспользоваться
операцией Edit=>Duplicate with Transform.
230
Книга Сергея Цыпцына
Смысл этой операции состоит в создании копии объекта и применении к нему всех
трансформаций, которые были произведены над исходным объектом с момента последнего
копирования. Эта операция незаменима при изготовлении всяких лестниц, спиралей и прочих
декораций.
Теперь надо получить симметричный ряд колес. Быстрее всего это сделать при помощи
дополнительной группировки и отрицательного масштабирования, пользуясь тем, что pivot новой
группы по умолчанию устанавливается в начало координат.
Объедините все три группы (WheeH, Wheel2, Wheel3) в новую группу и назовите ее
WheelsLeft. Скопируйте ее (Edit=>Duplicate).
В Channel Box задайте scaleX=-1 и переименуйте группу в WheelsRight.
Все хорошо, однако некоторые дотошные умы, смущенные отрицательным масштабом могут
заметить, что если выбрать два симметричных колеса и попытаться их покрутить, то направления
вращения у них будут разные.
Сплайновое моделирование
231
НИША
Это и есть следствие махинаций с масштабом. Для того, чтобы избавиться от «вывернутости»
масштаба, надо применить к группе WheelsRight операцию Freeze, которая сбрасывает все значения
атрибутов translate, rotate и scale, оставляя при этом объект на месте, как будто бы он только что
был создан в такой позиции и с таким размером. (Подробнее о Freeze Transformations и Reset
Transformations читайте во главе про изнанку MAYA.)
Выберите группу WheelsRight и выполните Modify=>Freeze Transformations. Это решит
проблему отрицательных вращений.
Объедините все четыре группы (Base, Cabin, WheelsRight, WheelsLeft) в новую группу и
назовите ее Train.
Сохраните файл (train05.ma).
Паровоз готов, займемся железной дорогой.
Спрячьте группу Train.
Выберите Option Box для CV Curve Tool и установите Curve Degree=3 Cubic.
Постройте кривую пути для паровоза.
232
Книга Сергея Цыпцыно
По поводу прокладывания пути для железной дороги есть весьма поучительная история из
реальной жизни.
Мой хороший друг Олег Булгак поехал работать по распределению в Новый Уренгой.
Работать ему пришлось на разных объектах, в том числе и на строительстве железной дороги.
И хотя в его обязанности никак не входили задачи проектирования, однажды он был застигнут
неопределенного рода начальством с безапелляционным предложением проложить маршрут для
очередного участка железной дороги между местных болот. На робкие возражения, что, мол, не
обучен и, типа, некомпетентен, последовал убойный аргумент: «Вы там штаны протирали пять лет,
вот и покажите, на что способны! А то кому же еще план рисовать да бумагу марать, инженеры
разныя!» Вместо «разныя» подставлялись различные прилагательные, характеризующие степень
компетентности в инженерном деле. Выхода не было, дело пахло скандалом, начальство пахло
перегаром, и Олег, просидев несколько часов над секретным планом окрестных топей и болот,
начертал дрожащей рукой кривую третьего порядка, ставшую впоследствии следующим участком
железнодорожной магистрали. Дождаться конца строительства Олегу, к счастью, не довелось, и
скоро он вернулся в менее сибирскую Молдавию. Однако через несколько лет ему пришлось ехать
по той самой железной дороге. Всю дорогу скорый поезд мчался среди безлюдной местности,
практически обгоняя свой собственный шум. Однако в районе знакомых болот состав вдруг
сбросил скорость и стал медленно и осторожно красться между кустиков осоки и кочек моха,
подобно змее, подбирающейся к добыче. Добыча, видать, была пугливая, потому что тащился
поезд довольно долго. Однако затем, как ни в чем не бывало, весело рванул в направлении
пункта назначения. Бывалый Олег связал было такое странное поведение поезда с состоянием
здоровья машиниста и его помощника, однако все-таки поинтересовался у соседей о причинах
столь значительной задержки. Соседи в незатейливых выражениях быстро объяснили, что пару
лет назад какой-то шибко умный инженер из Москвы проложил здесь железнодорожный маршрут
ТАК, что любой поезд сходит с рельс, если движется быстрее пешехода. Далее следовали слова
благодарности этому инженеру и его родителям. Олег скромно промолчал, избегая лучей славы,
однако поклялся больше не заниматься железнодорожным делом.
История не только реальная, но и поучительная, притом применительно к компьютерной
графике. Если вы рисуете траекторию движения или, тем более, путь для паровоза, избегайте
внезапных поворотов и резких изгибов. Вращение объекта на таких поворотах будет дерганым.
Кроме того, при попытке сделать копию кривой с отступом (offset curve), внутри резких изгибов
будут появляться острые углы. Поэтому старайтесь рисовать траектории движения максимально
гладкими, если только это не противоречит замыслу «жесткого» движения.
Выберите построенную кривую и выполните Edit Curves=>Offset=>Offset Curve.
Это создаст кривую, «отступающую» от исходной на фиксированное расстояние (в данном
случае, distance=1, как следует из Channel Box). Такую копию невозможно получить, просто
масштабируя кривую, так как точки новой, «отступающей» кривой сдвигаются по нормали к
исходной, а не относительно центра масштабирования.
Снова выберите первую кривую и снова выполните Edit Curves=>Offset=>Offset Curve.
В Channel Box установите distance=-1. Это создаст «отступ» в другую сторону.
Сплайновое моделирование
233
Направляющие для рельс готовы, осталось изготовить профиль и запустить его по
направляющим.
Перейдите в камеру front.
Откройте Option Box для CV Curve Tool и установите Curve Degree=Linear.
Постройте профиль вокруг начала координат с помощью привязки к сетке.
Уменьшите кривую. Установите scale=0.2; 0.2;0.2
Выберите построенную кривую профиля, а потом одну из полученных через Offset кривых
(порядок выбора, как обычно, важен).
Откройте Option Box для Surfaces=>Extrude.
Установите параметры по «правилу правой руки» - для первых четырех параметров должны
быть установлены крайние правые опции (Tube, At Path, Component, Profile Normal). В этом случае
получается «хороший» и предсказуемый extrude.
234
Книга Сергея Цыпцына
Нажмите Apply.
Снова выберите кривую профиля и вторую кривую и снова нажмите Apply. Закройте Option
Box. Профиль слишком велик. Воспользуемся Construction History.
Снова выберите профиль и установите все scale-атрибуты в 0.1.
Если вас устраивает размер полученных объектов, спрячьте профиль.
Займемся шпалами.
Лучшая шпала в мире - это полигональный куб. Создайте его и задайте приблизительные
предварительные размеры (Scale = 0.3; 0.8; 3.0).
К сожалению, «прогнать» поверхность вдоль пути с помощью операции Extrude невозможно.
Необходимо размножить поверхность вдоль пути. Такая задача решается с помощью анимации. То
есть сначала надо запустить шпалу вдоль пути, а потом в каждом втором или третьем кадре снять
с нее копию. В этом случае некоторые методы анимации можно рассматривать как инструменты
моделирования.
Сплайновое моделирование
235
Установите на Range Slider диапазон анимации равным 100 кадрам.
Выберите шпалу, а затем кривую между рельсами (порядок, как ни странно, опять важен).
В основном меню выберите Animate=>Motion Paths=>Attach to Motion Path.
Шпала «насадилась» на путь и при нажатии кнопки Play на TimeLine весело бегает по пути.
Недостаток один - она насадилась на путь своим pivot'oM, который расположен прямо в центре
шпалы. Попробуем сдвинуть pivot прямо на анимированной шпале.
Нажмите Insert и тяните pivot вверх!
Чтобы скомпенсировать смещение вверх вынужденного оставаться на пути пивота, шпала
смешается вниз.
Загнав шпалу под рельсы, снова нажмите Insert.
Теперь осталось снять копию шкалы в каждом третьем кадре. Трудолюбивые умы могут
сделать это и вручную, однако мы воспользуемся операцией Snapshot.
Выберите шпалу.
Откройте Option Box для Animate=>Create Animation=>Snapshot.
Установите диапазон Time Range=Time Slider. Это определит диапазон выполнения
копирования равным диапазону анимации.
Задайте параметр lncrement=3, это установит каждый третий кадр для копирования
анимированного объекта.
236
Книга Сергея Цыпцына
После выполнения операции Snapshot вдоль пути возникнет последовательность из шпал,
а в Outliner появится snapshots Group.
Коль скоро мы вооружились передовыми знаниями по запусканию объекта вдоль пути,
поставим паровоз на рельсы. Залезем немного в анимацию.
В Outliner выберите группу Train и покажите ее (например, установите visibility=on).
Смасштабируите паровоз приблизительно так, чтобы он вставал на рельсы. (Пользуйтесь только
центральным манипулятором). Не обязательно точно подбирать размер, это можно сделать позже.
Перемещать паровоз тоже необязательно: MAYA сама сделает это.
Выберите группу Train, затем центральный путь.
Выполните Animate=>Motion Paths=>Attach to Motion Path.
Засада! Паровоз, конечно, бодро ездит по пути. Но как-то ... боком.
Очевидно мы использовали установки по умолчанию и запустили паровоз по пути «носом
вперед». Правда, не определили, где у него «нос». Глядя на манипулятор Scale Tool, можно понять,
что локальная ось X паровоза направлена вбок, а ось Z - в «нос».
В Attribute Editor можно разыскать закладку для ноды motionPathl, отвечающей за
присоединение паровоза по пути. Там можно определить, какой локальной осью объект поедет
вперед по пути. Установите Front Axis=Z. Паровоз встанет в правильную стойку.
Сплайновоемоделирование
237
С помощью махинаций с pivot'oM и регулировки размера паровоза установите его на рельсы
окончательно.
Запустите анимацию, откиньтесь на спинку кресла и скажите: «Волшебно!». Или
«Омерзительно!». В зависимости от настроения. Если вас не веселит безумная шпала, носящаяся
по пути вместе с паровозом, спрячьте ее.
Сохраните сцену.
Пытливые умы, дожившие до запуска паровоза по пути и сохранившие ясность ума,
воскликнут: «А мы же не удаляли историю с тех пор, как строили путь! А если сейчас поредактировать
центральную кривую?». Действительно, от центральной кривой зависит множество объектов:
и рельсы (через offset и extrude), и шпалы (через snapshot) и паровоз (через анимацию). Если
в режиме Wireframe выбрать центральную кривую, то на экране порозовеют все объекты. Это
означает их зависимость от выбранного объекта.
Попробуйте слегка потащить вверх или вниз несколько контрольных точек центральной
кривой. Перестроятся рельсы, обновится путь для паровоза. Только вот шпалы останутся на
местах.
Дело в том, что обновление всей группы скопированных шпал дело непростое и по
умолчанию интерактивно не обновляется. Однако вы можете выбрать любую шпалу и выполнить
Animate=>Update Motion Trail/Snapshot, чтобы поставить шпалы на место.
238
Книга Сергея Цыпцына
На этом первое сражение с NURBS-поверхностями и кривыми закончено. Нетерпеливые
умы, которым очень хочется перейти к анимации или к полигонам, могут пропустить следующую
часть битвы. Тем более, что она будет страшно занудная. Однако основные прелести, грабли для
наступания, неприятности и ограничения, возникающие при работе со сплайнами будут описаны
как раз ниже.
Продвинутое паровозостроение
Если вы подумали, что на этом построение паровоза заканчивается, вы, извините,
ошиблись. До сих пор было ознакомление с инструментами и операциями моделирования, в духе
«ваш первый паровоз в MAYA». Теперь посмотрим, как можно улучшить нашу модель в соответствии
в практическими рекомендациями лучших паровозоводов.
А практические рекомендации следующие:
• Избегайте острых углов между поверхностями. Для реалистичной визуализации.
• Старайтесь не применять Trim и Planar (в пределах разумного, без фанатизма), в
основном из-за потенциальных дырок на швах.
• Не оставляйте видимыми открытые края поверхностей. Они выглядят как острые грани
и режут глаз. Загните или закамуфлируйте их чем-нибудь.
• Не используйте Round Tool и Circular Filet. Они работают медленно, создают тяжелую
геометрию, а результат не всегда предсказуем.
Далее следуют некоторые инструкции по улучшению некоторых частей модели. Они
призваны продемонстрировать некоторые хитрости сплаинового моделирования и не могут быть
рассмотрены как руководство к полной сборке паровоза. Я лишь попытался обозначить часто
встречающиеся проблемы и привести методы их решения.
Котел
Начнем с котла. То есть с цилиндра. Цилиндр проще создать заново или можно выбрать
его и выполнить Edit NURBS=>Untrim.
Закрытие дырки при помощи Planar и Round Tool и борьба с объектами-мутантами - это
неспортивно. Закрываем дырку вручную. Сначала вставим несколько (а именно, пять) изопарм на
краю цилиндра.
Выберем крайнюю изопарму и одну изопарму недалеко от края и применим операцию
Insert Isoparm с опцией Between и количеством, равным четырем.
Сплайновое моделирование
239
Получим пять дополнительных изопарм и, соответственно, столько же рядов контрольных точек.
Дальше нам предстоит таскать и масштабировать ряды контрольных точек. Это удобно
делать в камере side, выбирая ряды точек с помощью компонентов Hull. Будьте внимательны:
таскать будем только по оси Z, а масштабировать строго за центральный манипулятор.
Выбираем крайний ряд точек и сжимаем его.
240
Книга Сергея Цыпцына
При помощи стрелки вправо выберите второй ряд точек. Нажимите «х» для привязки к сетке и
тащите второй ряд влево, пока он не прилипнет к сетке в том же месте, где находится первый
ряд.
Масштабируйте его так, чтобы верхняя точка была немного ниже края цилиндра.
Сплайновое моделирование
241
Выбирайте следующий ряд и проделайте с ним аналогичные действия, только сжимайте
поменьше.
Следующий ряд просто выбираем и сдвигаем влево, не масштабируя. При этом уже возникает
довольно хороший скругленный угол.
242
Книга Сергея Цыпцына
Выбрав следующий ряд и придвинув его (без привязки) к краю, можно отрегулировать степень
скругления.
Дальнейшую настройку скругления можно производить при помощи двух рядов точек
«справа» от угла (их нужно перемещать) и двух рядов «внутри» угла (их надо масштабировать).
Сплайновое моделирование
243
Совет. Часто бывает полезно включить опцию отображения изопарм в закрашенном
или текстурированном режиме Это можно сделать с помощью меню в панели
камеры Shading=>Shade Optwns=>Wireframe on Shaded.
Труба
Продолжим работу с конусом. В прошлый раз мы использовали Circular Fillet и могли
регулировать только радиус без возможности контролировать положение границ «воротника»
между конусом и цилиндром. Сейчас пришьем конус к цилиндру при помощи Freeform Fillet. Этим
способом часто пришивают конечности к туловищу (точнее пришивали, пока сплайны не вышли из
моды в области органического моделирования).
Берем конус (translateX=3.5, translateZ=3.5, rotateX=180).
Выбираем изопарму в том месте, где будет начинаться сочленение, и применяем Edit
NURBS=>Detach Surfaces.
244
Книга Сергея Цыпцына
Наметим границу на цилиндре, к которой будем пришиваться. Выберите нижнюю изопарму
на остатке конуса и выполните Edit Curves=>Duplicate Surface Curves. Это создаст копию изопармы
как обычную кривую, которую мы тут же спроектируем на цилиндр. Если кривая выбрана, выберите
дополнительно цилиндр. Перейдите в камеру top и выполните Edit NURBS=>Project Curve on
Surface с установками по умолчанию.
В перспективной камере на цилиндре появятся две кривые, сверху и снизу. Нижнюю
кривую нужно удалить. Теперь надо выбрать оставшуюся спроектированную на цилиндр кривую
и дополнительно нижнюю изопарму остатка конуса, а затем выполнить Edit NURBS=>Surface
Fillet=>Freeform Fillet.
Сплайновоемоделирование
245
Удаляем нижнюю часть.
Несмотря на это, для верхней половины можно изменять «линию отреза» с помощью
атрибута Parameter ноды detachSurface.
Freeform Fillet подобно операции Loft создает поверхность, проходящую через две
кривые. Однако исходные кривые для Freeform Fillet должны быть «поверхностными кривыми»
(изопармами, краями тримированных дырок и т. д.) и поэтому, в отличие от Loft, результирующая
поверхность гладко подходит к кривым.
Пытливые умы могут выбрать в Outliner кривую, скопированную с нижней изопармы конуса,
отцентрировать ей pivot (Modify=>Center Pivot) и отмасштабировать ее, влияя таким образом на
радиус нижнего сочленения.
Понятно, что можно даже придать ей любую форму, которая через проекцию будет влиять
на нижнюю границу.
246
Книга Сергея Цыпцына
№
Некоторые неутомимые умы, глядя на то, как хорошо совпадают сетки конуса и «воротника»,
могут вознамериться применить операцию Attach к этим двум поверхностям. Однако результат
применения этой операции с опцией Blend приводит к плачевным результатам.
Последствия параметризации
Виной тому странная параметризация поверхности сочленения (ее можно наблюдать в
Attribute Editor). Дело в том, что операции, создающие Fillet, порождают параметризацию Chord
Length, и попытка сшить такую поверхность с другим объектом не приводит к успеху. Надо просто
изменить параметризацию поверхности на Uniform.
Для этого достаточно применить к ней Rebuild Surfaces с опциями Rebuild Type=L)niform,
Parameter Range=0 to #Spans, Keep=CV.
После этого применение операции Attach (с опциями Blend, Insert knot=On, Parameter=0.5,
Keep Original=Off) проходит совершенно безболезненно для конуса и «воротника».
Сплайновое моделирование 247
У получившейся поверхности довольно богатая Construction History. Например,
можно разыскать в Attribute Editor ноду ffFiletSrf, отвечающую за построение Freeform Filet и
отредактировать атрибуты Depth и Bias, корректирующие форму сочленения.
Иногда требуется вырезать дырку под конусом, но в нашем случае это будет лишней
работой. Это несложно сделать, так как замкнутая кривая на цилиндре уже существует и операция
Trim выполняется в один щелчок мыши.
Как и раньше, если вы удовлетворены результатом, Construction History можно удалить
вместе с кривой для проектирования.
Шапка
Займемся шапкой для трубы. Как и раньше, выделите верхнюю изопарму конуса.
Заходите в Option Box операции Surfaces=>Bevel Plus.
В разделе Outer Bevel Style выберите Convex Crease, а в закладке Output поставьте Output
Geometry=Nurbs. Нажав кнопку Bevel, получите шапку для конуса, причем форму шапки можно
менять в Attribute Editor, но с одним условием: никаких острых углов.
Шапку надо пришить к конусу. Выбираем обоих.
Далее Attach (Method=Blend, Insert knot=On, Parameter=0.1, Keep Original=Off).
248
Книга Сергея Цыпцына
Совет. Не оставляйте открытые края поверхностей видимыми. Если вы знаете,
что в процессе анимации открытый край поверхности попадет в камеру,
обработайте его, Загните его, запустите вдоль края что-нибудь типа трубки, в
общем, прикройте его любым способом.
Воспользуемся этим советом. Край трубы надо утащить внутрь.
Выбирайте верхнюю, последнюю изопарму.
Скопируйте ее: Edit Curves=>Duplicate Surface Curves.
Выполните Modify=>Center Pivot.
Сожмите окружность немного.
Теперь вместе с окружностью выберите верхнюю крайнюю изопарму и выполните
Surfaces=>Loft. В Attribute Editor или Channel Box задайте для Loft атрибут Section Spans равным
пяти, это добавит объекту гибкости.
Удалите внутреннюю кривую, а затем при помощи Hull постепенно утаскивайте вниз
кольцевые ряды контрольных точек, начиная с внутреннего.
Сплайновоемоделирование
249
Если попытаться опять сшить при помощи Attach две оставшиеся поверхности, то MAYA
запутается в краях поверхностей.
Помогите ей: выберите примыкающие друг к другу изопармы на обеих поверхностях
(используя Shift и перетаскивание мышкой) и выполните Attach с прежними установками.
Труба готова. Аналогичные действия по разрезанию и «приклеиванию» сферы
предоставляются вам для самостоятельной работы. Сохраненный на этом этапе файл называется
trainNewl.ma.
Звезда
Займемся звездой. Звезда нас, в принципе, устраивает. Но если рассматривать ее
выпуклые ребра как жесткие, то могу предложить оригинальный способ их сгладить. Напомню,
что звезда была сделана из конуса первой степени. Для сглаживания надо перевести этот объект
в поверхность третьей степени.
Выберите звезду и откройте Option Box операции Rebuild.
Установите Rebuild Туре в Bezier, остальные параметры оставьте по умолчанию.
Результирующая поверхность будет иметь то же количество изопарм, но каждая из них будет
иметь multiplicity=3, потому что выбран тип Bezier и степень поверхности установлена в Cubic.
250
Книга Сергея Цыпцына
После операции Rebuild контрольные точки и Hulls равномерно покрывают поверхность.
Идея состоит в том, чтобы по обеим сторонам жестких ребер надо вставить дополнительные
изопармы, а «жесткую» изопарму удалить.
Если выбрать изопарму, идущую вдоль ребра, то в Script Editor, можно увидеть
запротоколированную команду типа
select -г nurbsCone2.v[25.2] ;
Имя конуса, естественно, может отличаться от вышеприведенного. Число 25.2 соответствует
значению параметра V, определяющему именно эту изопарму.
Сплайновое моделирование
251
Если же выбрать две изопармы рядом с предыдущей, то в Script Editor появятся команды типа
select -г nurbsCone2.v[25.088083534043] ;
select -tgl nurbsCone2.v[25.2803155979991] ;
Если мы хотим строго симметрично выбрать две таких изопармы рядом с угловой, мы
должны отредактировать и выполнить эти две команды, так, чтобы значения в квадратных скобках
были «симметричны» относительно 25.2. Например 25.2±0.05.
Выделяем две последние команды в верхней части Script Editor и перетаскиваем их в
нижнюю часть Script Editor.
Редактируем:
select -г nurbsCone2.v[25.15] ;
select -tgl nurbsCone2.v[25.25] ;
И выполняем (Ctrl+Enter).
После этого выполняем операцию Insert Isoparm (At Selection, Set to, Multiplicity=1).
Теперь можно поднаехать на ребро, выбрать при помощи Hull угловой ряд точек и удалить
252
Книга Сергея Цыпцына
его. Ряд точек удаляется просто нажатием клавиши Delete.
В результате, ребро сгладится, а аналогичную операцию придется проделать еще с
четырьмя ребрами. Возможно, вам понадобится калькулятор.
На данном этапе сцена сохранена как trainNew2.ma.
Поработаем с историей.
Надо заметить, что заглянув в Outliner можно обнаружить некоторое количество пустых
групп, оставшихся от Bevel и других операций. Однако эти группы, несмотря на отсутствие
видимых форм внутри них, не пустые. Они содержат так называемые intermediate objects, то есть
невидимые промежуточные объекты, не удаленные ради сохранения Construction History.
Примечание. В Attribute Editor в разделе Object Display для ноды nurbsSurface есть
атрибут определяющий «промежуточность» объекта. Не надо его трогать! Он
устанавливается автоматически.
Сплайновое моделирование
253
Если удалить историю для всех объектов в сцене, а это то, что мы хотим сделать прямо
сейчас (Edit=>Delete All by Туре=>History), все пустые группы исчезнут автоматически. Если
что-то и останется, можно «добить» это вручную. Останется всего четыре поверхности и две
«поверхностные» кривые, которые тоже следует удалить.
Display Show Help
Это несколько проще (по крайней мере понятнее), чем борьба с объектами-мутантами,
порождаемыми Round Tool и Circular Fillet.
Сцена после удаления Construction History сохранена как trainNew2noHistory.ma.
Перейдем к кабине. Сделать NURBS-кубик с скругленными краями в MAYA - это довольно
веселое занятие, в ходе которого вылезают все прелести ограничения NURBS-поверхностей на
произвольную топологию.
Наверное, проще сделать кубик в отдельном файле, а потом использовать его как заготовку
для будущих кубических объектов. Если вы очень торопитесь, можете пропустить этот чисто
теоретический пример. Тем более, что с помощью полигонов такая задача решается в десять раз
быстрее.
Моделирование хорошего сплайнового куба
Данный пример носит академический характер и служит не столько для изготовления
реальной заготовки для кабины паровоза, а для обсуждения возможностей и ограничений
некоторых инструментов сплайнового моделирования. Построить куб со сглаженными краями и
углами можно десятком способов, причем предназначение и дальнейшее использование такой
модели могут определять способ ее изготовления с точки зрения экономии временных затрат. И
хотя практическая задача состоит обычно в том, чтобы модель хорошо выглядела в конкретной
сцене или в конкретном ракурсе, теоретическая задача этого раздела состоит в построении
куба со сглаженными краями с возможностью независимого изменения размеров куба и радиуса
скруглении. И с сохранением Construction History и контролем непрерывности на швах между
поверхностями.
Предвижу упреки в непрактичности. Как можно тратить на простой кубик десятки страниц?
Может, лучше построить человеческую голову?
Во-первых, лучше кубик.
Во-вторых, кубик совсем непростой.
В-третьих, вы можете прочитать документацию и даже сделать массу упражнений
на применение операций Fillet или Square, однако вы практически нигде вы не обнаружите
акцентирование на информации о том, что первая создает кривую параметризацию, а вторая не
обеспечивает произвольную точность. Или сведений о том, как с этим бороться.
254
Книга Сергея Цыпцына
Создайте NURBS-куб по умолчанию. Напомню, что это - группа из шести плоскостей.
Выберите шесть плоскостей прямо на экране.
Выполните Modify=>Center Pivot.
Выберите Scale Tool и сожмите немного все плоскости одновременно.
Далее надо сделать Freeform Fillet между всеми соседними краями плоскостей.
Для того, чтобы удобно было выбирать соседние изопармы, нажмите F8, отключите выбор
точек в Selection Masks и включите выбор изопарм.
\\ &*%[Щ |1 ■ • 4 Ф Г ® + '
Выбирайте последовательно пары соседниех изопарм и применяйте к ним операцию Free-
form Fillet.
Меню Edit NURBS=>Surface Fillet удобно при этом оторвать.
Старайтесь двигаться по часовой стрелке и от боковых граней к горизонтальным для
единообразного направления поверхностей.
Для закрытия «уголков» используется операция построения поверхности Square.
Сплайновое моделирование
255
Эта поверхность использует три или четыре пересекающихся кривых и натягивает на них
«каркас». Особенность этой поверхности заключается в том, что если кривые-образующие являются
«поверхностными» кривыми (типа изопарм), то Square гладко стыкует края с окружающими
поверхностями.
Выбирайте изопармы на краях «уголков» и применяйте Surfaces=>Square.
Особенность построения состоит в том, что построение Square зависит от порядка выбора
кривых. Иногда поверхность просто «переглючивает» (точнее, перекручивает). В этом случае надо
просто выбрать изопармы в противоположном направлении. Кроме того, методом тыка старайтесь
выбирать изопармы так, чтобы поверхность строилась полюсом вверх. (Я выбирал, начиная с
левой изопармы, по часовой стрелке для верхних углов и против часовой стрелки, для нижних).
В принципе куб готов. Благодаря Construction History, можно даже регулировать радиус
скругления и размер куба.
В Outliner выберите шесть плоскостей входящих в группу куба и при помощи Scale Tool
порегулируйте зазор между плоскостями и, как следствие, радиус склеивания. Если же выбрать
куб как группу, то можно менять размеры и пропорции самого куба.
Однако если вы сделали зазор слишком маленьким, все угловые Square-поверхности вдруг
начинают исчезать с истошными сообщениями об ошибке. Дело опять в параметризации.
Дело втом, чтооперацияРгее^гт Fillet создает поверхности с Chord Length параметризацией.
256
Книга Сергея Цыпцына
Поэтому значение параметра для крайних изопарм Fillet-поверхностей, по которым строится
Square, постоянно меняется при масштабировании плоскостей. Construction History не может
работать в таких постоянно меняющихся условиях. Рецепт состоит в том, чтобы перестроить все
Fillet-поверхности и задать им Uniform параметризацию. К сожалению, все «уголковые» Square-
поверхности не выдержат такого обращения и их придется удалить и построить заново.
Выбираем все Fillet-поверхности и делаем Rebuild (Uniform, Keep CV, Parameter Range=0 to
#Spans), чтобы задать Uniform-параметризацию, не трогая контрольные вершины.
Теперь крайние изопармы этих поверхностей имеют всегда фиксированной значение.
Постройте заново все угловые Square-поверхности.
Теперь при масштабировании плоскостей все остается в порядке. Если вдруг на совсем
узких зазорах углы начинает «скручивать», это можно исправить уменьшением значения атрибута
End Point Tolerance (точность построения) ноды squareSrf.
Итак, построенный куб состоит из шести плоскостей, двенадцати Fillet-скруглений,
к которым применена операция Rebuild, и восьми Square-уголков, проведенных через края
скруглений. Construction History не удалена и позволяет регулировать зазор и масштаб куба.
Сохраняем файл как roundedCubel.ma.
Казалось бы, все. Можно импортировать сделанный куб в сцену с паровозом, задавать
размеры и положение, резать дырки и т.д. Те, кто устал от параметризации и прочих
нехудожественных подробностей, могут так и сделать и перейти к следующему разделу (главе,
книге). Однако для пытливых умов - еще немного деталей.
Если отрендерить крупным планом угол такого куба, то обнаружатся некоторые дырки на
швах между поверхностями.
Сплайновоемоделирование
257
Дело в том, что при рендеринге все NURBS-поверхности разбиваются на полигоны. Этот
процесс называется теселяциеи. При моделировании в сплайнах часто приходится помнить и
следить за тем, как поверхности теселируются.
Кстати, Maya Software Render и Mental Ray for Maya используют различные методы теселяции
объектов. Mental Ray производит более интеллектуальный анализ кривизны поверхностей, и
зачастую дополнительное вмешательство не требуется.
Однако необходимо уметь контролировать и влиять на процесс теселяции для того, чтобы
иметь представление, как сплайновая модель будет выглядеть на финальном изображении.
Совет. При слишком близких подъездах к объекту MAYA начинает отсекать
детали, находящиеся очень близко к камере. Точнее отсекать начинает сама
камера, которая имеет соответствующие атрибуты, определяющие дальнюю и
переднюю плоскости отсечения. Чтобы видеть близлежащие детали, выберите
камеру, откройте Attribute Editor и в закладке для shape, уменьшите значение
атрибута Near Clip Plane до 0.001.
Теселяция
Полигоны, на которые NURBS-объект разбивается при рендеринге, можно увидеть прямо на
экране. Для этого в Attribute Editor надо открыть во второй закладке раздел Tesellation и включить
галку Display Render Tessellation. К сожалению, отображаются только полигоны для Maya
Software Render. Для каждого объекта, степень теселяции задается индивидуально, то есть локально.
Чтобы определить критерии разбивки на полигоны для всей сцены целиком, то есть глобально,
есть пункт меню Render=>Set NURNS Tessellation.
258
Книга Сергея Цыпцына
По умолчанию, для каждого объект качество теселяции, то есть степень подробности
разбиения на полигоны, задается в условных единицах «лучше-хуже», определяемых атрибутами
U/V Division Factor, а необходимость добавлять больше полигонов в местах большей кривизны
управляется предустановками атрибута Curvature Tolerance. (Mental Ray использует только этот
атрибут).
Можно пытаться «задирать» эти атрибуты вверх, чтобы получить настолько плотные сетки,
что дырки на швах перестанут быть видны, но такой подход нельзя назвать особо эффективным и
экономным, особенно при работе с мелкими деталями.
Для того, чтобы управлять, как именно происходит разбиение на полигоны, можно включить
метод неавтоматической теселяции (раздел Advanced Tessellation, галка Enable Advanced
Tessellation). Используя этот метод, можно задать, на сколько полигонов разбивается каждая ячейка
сетки из изопарм. Другими словами, на сколько отрезков разбивается каждый сегмент между
соседними изопармами. (Дополнительные подразбиения производятся после этого на основе
критериев из раздела Secondary Tessellation Attributes.)
В нашем случае поверхности - будем называть их теперь Fillet (продольные скругления)
и Square(yMbi) - построены таким образом, что изопармы соседних объектов как бы «втекают»
друг в друга. Это показатель хорошего качества стыковки поверхностей, и надо всегда стремиться
обеспечить такое совпадение изопарм на краях.
Поэтому если для каждой поверхности задать одинаковое количество отрезков, на которые
разбиваются сегменты между изопармами, то полигоны на краях будут просто иметь одинаковые
ребра.
Будем использовать число 3 по умолчанию для атрибутов Number U/V, поэтому просто
включите галку Enable Advanced Tessellation для всех поверхностей.
Сплайновоемоделирование
259
Теперь при рендеринге исчезнут дырки, возникающие в результате различной теселяции
на краях.
Совет. Чтобы быстро установить значение атрибута, доступного только в
Attribute Editor сразу для многих поверхностей, можно использовать редактор
Window=>General Editors=>Attribute Spread Sheet.
Артефакты, различимые на нижней границе «уголков», связаны с математической
точностью построения поверхности Square, которой недостаточно для точного совпадения границ
поверхностей. В этом можно убедиться, включив режим отображения контрольных точек и сильно
«наехав» на границу между поверхностями.
260
Книга Сергея Цыпцына
Очевидно, что контрольные точки не совпадают, следовательно не совпадают и края
поверхностей. Операция Square не идеальна и тоже имеет свои маленькие слабости.
Дело в том, что по умолчанию края соседних поверхностей подгоняются друг к другу так,
чтобы касательные к поверхности на этих краях совпадали. Если вы откроете Attribute Editor,
то в закладке для squareSrfl, вы можете найти раздел Continuity (непрерывность, гладкость), в
котором задаются условия гладкой стыковки краев поверхности.
Сплайновоемоделирование
261
По умолчанию, метод вычисления гладкости стыковки (Continuity Туре) определен как
Tangent. Этот метод «честно» пытается гладко состыковать края поверхностей, причем ему это
не всегда удается, так как условие гладкости на стыках является довольно сильным. Об этом
свидетельствуют галки в разделе Continuity Passed (Выполнение условия гладкости), показывающие,
на каких краях поверхности Square удалось добиться выполнения гладкой стыковки. В нашем
случае галка напротив Continuity Passed 2 отсутствует, что означает: на второй (нижней) границе
MAYA не смогла (ну, не смогла, и все тут!..) идеально точно состыковать края поверхностей. Можно
дополнительно увеличить точность вычислений вдоль границ путем увеличения атрибута Curve Fit
Checkpoints, однако добиться полного успеха все равно не удастся, и кроме того, это повлечет за
собой появление дополнительных изопарм, повлияет на тесселяцию и пр.
В данном случае имеет смысл изменить метод стыковки на более простой и установить
для всех трех границ Continuity Туре = Implied Tangent (неявный тангенс). Этот метод более прост
и стыкует поверхности не так математически строго, как метод Tangent, но визуально вполне
приемлемо. Кроме того, он позволяет избежать разъезжания границ и появления артефактов.
Примечание. Если вы собираетесь использовать Renderman for Maya для просчета
сцены, то вам не надо заботиться о тесселяции, так как последний не использует
полигоны при просчете сплайновых поверхностей. Однако точность прилегания
краев поверхностей друг к другу необходимо обеспечивать, поэтому для бесшовной
картинки придется применять метод Continuity Туре = Implied Tangent.
262
Книга Сергея Цыпцына
В большинстве практических случаев на все эти мелкозернистые детали можно закрыть
глаза. И поэтому можно подвести промежуточный итог, и сказать, что практически идеальный куб
построен, Construction History по-прежнему позволяет менять зазор, масштабируя первоначальные
стенки куба, теселяция на швах выбрана адекватным образом.
Проверяем. В Outliner выбираем первоначальные грани куба и неистово масштабируем их.
Кубик не должен разъезжаться. Рендерим. Если дырок нет, сохраняем файл (результат в rounded-
Cube2.ma). Если дырки есть, моем руки и делаем все заново.
sCubel
кубом.
Осталось подготовить файл для будущего использования.
Выберите все построенные Fillet и Square и сгруппируйте их. Назовите группу Corners.
После этого перетащите средней кнопкой группу Corners и бросьте ее на группу nurb-
. Теперь группа nurbsCubel содержит в себе все поверхности и полностью управляет нашим
Попробуйте масштабировать группу nurbsCubel. Засада! Все разъехалось.
Это, естественно, происки Construction History. Угловые поверхности получают двойное
масштабирование - от плоскостей и от себя лично.
Сплайновое моделирование
263
А жаль. Так хорошо было бы иметь одну группу для всей модели.
Ищем решение. Оно скрывается в Attribute Editor для группы Corners. Там надо выключить
галку Inherit Transform (наследовать трансформации), чтобы группе Corners не передавались
масштабирование и прочие трансформации от родительской группы nurbsCubel.
Теперь масштабирование группы nurbsCubel работает, как ожидалось.
Сохраните сцену (roundedCube3.ma) и подумайте о том, как мы будем ее дальше
использовать. В дальнейшем мы будем импортировать этот файл в нужную сцену, Задавать
положение и размеры куба, настраивать величину скругления и удалять Construction History,
которая дальше не потребуется.
Сделаем себе еще один маленький подарок. Небольшое неудобство заключается в том,
что для того, чтобы задавать размер, приходится выбирать группу nurbsCubel, а для настройки
скруглении приходится разыскивать и выбирать шесть плоскостей. И так каждый раз. Попробуем
«вытащить» размер плоскостей (то есть регулировку зазора) наверх, на группу nurbsCubel.
Выберите группу nurbsCubel и добавьте к ней новый атрибут gap со значением по умолчанию
0.9: Modify=>Add Attribite (Default=0.9).
Теперь откройте Windows=>General Editors=>Connection Editor и нажмите Reload Left, чтобы
загрузить nurbsCubel в левую панель.
Выберите в Outliner все шесть граней куба и нажмите Reload Right. Для удобства обзора
снимите в меню Left Display и Right Display галки Show Non-Keyable.
Выберите слева атрибут gap, а справа выбирайте у всех объектов атрибуты ScaleX, ScaleY,
ScaleZ.
264
Книга Сергея Цыпцына
Закройте Connection Editor.
Выберите nurbsCubel, и меняйте значение атрибута gap в диапазоне от нуля до единицы.
Теперь нет необходимости в разыскивании, выборе и масштабировании граней куба. Все
необходимые параметры куба управляются атрибутами группы nurbsCubel.
Сохраняем файл (roundedCube4.ma).
Чудо инженерной мысли готово, можно возвращаться к давно заброшенному построению
паровоза. «Минуточку!» - воскликнут немногочисленные измученные кубиком пытливые умы. В
самом деле, ведь когда мы сымпортируем наш куб в другую сцену, настроим его и удалим историю,
передвигать его будет, потом уже, нельзя, так как подгруппа Corners не наследует трансформации
и придется обязательно помнить об этом и вручную включать. Да это так. И хорошо бы помнить об
этом всегда.
Однако MAYA потакает человеческим слабостям и людям с короткой памятью.
Попробуйте временно удалить историю прямо для выбранной группы nurbsCubel (Edit=>Delete by
Туре=> History).
Вы увидите в Script Editor следующее сообщение:
Warning: Turning on inheritTransform for 'Corners'.
To есть MAYA сама включила галку Inherit Transform у группы Corners. Масштабирование и
перемещение группы работает корректно. Можно возвращаться к паровозу.
Честно говоря, если вы смогли выполнить упражнение с гладким кубиком, то вам больше не
нужны никакие паровозы. Похоже, что вы полностью готовы к самостоятельной работе с NURBS-
поверхностями.
Сплайновое моделирование
265
Кабина и окна
Откройте сцену trainNew2noHistory.ma.
Импортируйте (File=>lmport) в нее файл roundedCube4.ma.
Выберите группу nurbsCubel и поставьте ее на место.
translateY=1.5; translateZ=-6; scaleX=5; scaleY=8; scaleZ=2
Задайте значение атрибута gap равным 0.98.
История похоже нам больше не нужна, поэтому удалим ее для всего куба.
Также удалим верхнюю плоскость куба, она нам больше не пригодится.
Крыша
Разберемся с крышей.
Как и раньше, это полигональный куб. Создаем его и ставим на место.
(translateY=6; translateZ=-6; scaleX=6; scaleY=1; scaleZ=3)
А теперь быстро разберем способ сгладить края кубика. Заодно сравним количество
затраченных усилий с предыдущим сплайновым случаем.
Удалим историю с кубика. Это важно.
Выбираем кубик и выполняем Edit Polygons=>Bevel.
Эта операция «снимает фаску» с выбранных ребер, а так как мы выбрали весь куб, то
сглаживаются все ребра куба.
В Attribute Editor или Channel Box надо настроить значение атрибута offset, чтобы
подрегулировать ширину фаски. Установите его равным 0.1.
266
Книга Сергея Цыпцына
Задайте значение Segments=3, чтобы сгладить фаску.
Практически все! В ходе применения операции Bevel, могли возникнуть (а могли и не
возникнуть) множественные вершины, находящиеся в одном и том же месте.
На всякий случай выбираем куб и выполняем Edit Polygons=>Merge Vertices.
Теперь осталось подрулить жесткую границу перехода между соседними гранями. В
отличие от NURBS-поверхностей, сгладить полигональную сетку можно, не добавляя вершин, а
«смягчив» нормали на границах граней, то есть даже не редактируя геометрию.
Выбираем куб.
Открываем Option Box операции Edit Polygons=>Normals=>Soften/Harden.
Задаем значение параметра Angle=80.
То есть если угол между гранями меньше 80 градусов, то ребро визуализируется как
«мягкое», иначе - как «жесткое».
Нажимаем Soft/Hard.
Можно поэкспериментировать со значением угла в Attribute Editor, это поможет понять
механизм смягчения нормалей.
Сплайновое моделирование
267
Мы так увлеклись, что забыли про козырек. Поэтому встает вопрос, а нельзя ли как-нибудь
потянуть за вертексы «старого», не сглаженного куба. Ведь где-то в истории хранится информация
о прежней форме куба.
Открываем Hypergraph и выбираем Graph=>lnput And Output Connections.
Видим, что история берет свое начало у невидимой ноды polySurfaceShapel. Выбираем ее
в Hypergraph. В Attribute Editor в разделе Object Display эта нода имеет включенный статус
Intermediate Object. Если временно выключить его, то можно увидеть на экране прежний куб и даже
добраться до его вершин.
268
Книга Сергея Цыпцына
Осталось вытянуть козырек и обязательно не забыть включить атрибут Intermediate
Object. Можно переходить к иллюминаторам.
Выберите nurbsCubel и polyCubel и сгруппируйте их (Ctrl-g).
Назовите группу Cabin.
Также сгруппируйте оставшиеся четыре поверхности в группу Base.
Удалите историю во всей сцене.
Edit=>Delete All by Туре=>History.
Сохраните файл (trainNew3.ma).
SoftWindows, мягкие окна
Предыдущий вариант окон нуждается в закруглении краев. Заготовка находится в файле
trainNew4.ma. Это можно сделать множеством способов.
Можно сделать Offset Surface для внутренней поверхности (distance=-0.1), сжать ее вдоль
(Modify=>Center Pivot),
а затем выбрать крайнюю изопарму и Trim Edge
Сплайновое моделирование
269
и построить Freeform Fillet.
При таком способе могут, однако, возникнуть проблемы с точностью на швах, и, кроме
того, стыкующие поверхности будут иметь разное количество сегментов, что есть «некрасиво».
270
Книга Сергея Цыпцына
Второй способ состоит в том, чтобы сделать все вручную. Пользуясь тем, что передняя и
задняя стенки параллельны, можно нарисовать профиль внутренней поверхности и сделать
Extrude вдоль границы окна.
Переходим в камеру side.
Рисовать профиль можно в любом месте, лишь бы его ширина равнялась глубине кабины.
Используя CV Curve Tool, привязку к сетке и клавишу shift, рисуем кривую так, чтобы
первые и последние точки располагались вертикально, а остальные на горизонтальной прямой.
Далее, для построенной кривой выполняем Modify=>Center Pivot, а затем смещаем pivot в
начало кривой.
Если построенный профиль выбран, выберите дополнительно край окна (Trim Edge) на
передней стенке кабины.
Выполните операцию Surface=>Extrude (Tube, At Path, Component, Profile Normal).
Сплайновоемоделирование
271
Толщину скругления можно отрегулировать, масштабируя кривую по вертикали
Постройте такой же Extrude для другого иллюминатора, используя имеющийся профиль.
Если профиль выворачивается внутрь кабины при экструдировании, достаточно развернуть
направление кривой профиля на противоположное (Edit Curves=>Reverse Curve Direction).
Теперь можно убить всю историю и удалить все кривые. А также две loft-поверхности, оставшиеся
от предыдущих построений. И не забыть «забросить» две новых поверхности в группу Cabin.
Сохраняем сцену (trainNew5.ma).
Остальные детали сцены нуждаются в косметических улучшениях, с точки зрения острых
ребер, и могут быть быстро отредактированы при помощи уже использовавшихся инструментов. Нет
смысла подробно излагать набор инструкций для этого незатейливого процесса. Прокомментирую
лишь основные детали.
С помощью FilletCurve удобно сгладить углы на профилях, которые изготавливались для
колеса и рельс.
272
Книга Сергея Цыпцына
Зоркие умы, пардон, глаза, у которых включено постоянное отображение Edit Points
д,ля кривых, заметили, что при включенных опциях Trim и Join, сегменты возникают точно в тех
местах, где были отмечены Curve Point. Это наводит на мысль, что в этих местах появляются
множественные точки.
Так и есть, если потаскать за контрольные точки в районе углов, можно увидеть характерные
«клювы».
В данном случае это не представляет опасности, но следует иметь в виду на будущее, что
эта операция «молча» добавляет множественные точки.
При попытке закруглить угол, там, где кривая начинается и заканчивается, возникает
«перехлест» или «петля», когда кривая два раза пробегает свой путь.
Сплайновое моделирование
273
В этом случае, кривую надо предварительно замкнуть с помощью Open/Close Curves с
опцией Shape=Preserve.
С технологией сглаживания полигональных кубиков мы уже разобрались, так что проблем
со шпалами быть не должно.
Детали колес, конечно, могут быть доработаны, но если паровоз жив и намерен вертеть
колесами, то заниматься этими деталями нет смысла, так как никто их не заметит.
О том, что не влезает в эту главу. Патчевое моделирование
Некоторые из вас наверняка слышали про патчевое моделирование, суть которого сводится
к построению каркаса из кривых и последовательному обтягиванию этого каркаса поверхностями
с помощью операций Boundary/Square или с использованием инструментов Birail. Суть методов
патчевого моделирования и особенности инструментария Birail сводятся к тому, что через каркас
из четырех (или трех) кривых можно провести поверхность, причем границами поверхности (то
есть кривыми из каркаса) могут выступать края других поверхностей. При этом создаваемая
поверхность гладко стыкуется на краях с соседними поверхностями. Можно назвать такой способ
«заплаточным моделированием».
Основная задача такого метода (да и сплайнового моделирования вообще) - обеспечивать
гладкую стыковку поверхностей в местах примыкания друг к другу. Для таких целей обычно
применяют операцию Stitch. Она не только подтягивает края поверхностей друг к другу, но и
«остается» на границе объектов, продолжая удерживать эти края вместе до тех пор, пока вы не
удалите историю. В некотором смысле эту операцию можно рассматривать как деформер - при
редактировании края одной поверхности деформируется другая поверхность. Еще раз уточню,
что хотя для перевода названия операции Stitch чаще всего используется термин «сшить»,
реально несколько поверхностей никоим образом не сшиваются в единый объект, просто их края
подтягиваются друг к другу, а количество поверхностей остается прежним.
Не приводя конкретных упражнений, приведу общие рекомендации по использованию
сшивания поверхностей. Если вы жаждете практики, то на сайте www.alias.com, есть прекрасное
(и очень длинное) упражнение по изготовлению типа человеческого лица с помощью патчей.
Выполнив эти инструкции, вы сможете вволю натешить себя применением операций Square, Birail
и Stitch, а заодно ощутить всю прелесть такого подхода. Подумайте заодно, как анимировать такие
маски.
Тем, кто хочет попрактиковаться в автомобильном дизайне и прочем использовании
сплайновых поверхностей по назначению, я могу порекомендовать разыскать в Интернете
274
Книга Сергея Цыпцына
ш
упражнение-описание того, как смоделировать автомобиль Subaru. Текст этого упражнения
с иллюстрациями занимает двести сорок три страницы, а инструкции дают исчерпывающее
представление о моделировании твердотельных конструкций. В момент написания книги я видел
это гениальное описание на сайте www.learning-maya.com.
Особенности использования операции Global Stitch
Чаще края объектов подгоняются друг к другу с помощью операции Global Stitch,
позволяющей закрыть зазоры между всеми выбранными поверхностями и модифицировать их
контрольные точки на границах, так, чтобы стык был «гладким» не только по позиции, но и по
тангенсу и кривизне.
Для применения этой операции все поверхности должны быть обязательно подготовлены:
параметризация должна быть типа Uniform и желательно по количеству сегментов (0 to #Spans).
Крайне желательно также удалить Construction History.
В параметрах самой операции необходимо установить Stitch Corners=Closest Knot; Stitch
Edges=Equal Params; Stitch Smoothness=Normals или Tangents. Это обеспечит плавное «втекание»
поверхностей друг в друга.
Опция Stitch Comers=Closest Knot определяет, что углы поверхностей притягиваются к
ближайшему углу или к ближайшей границе между сегментами на соседней поверхности. Если
визуально, то к ближайшему месту пересечения изопарм.
Опция Stitch Edges=Equal Params обеспечивает то, что при стягивании краев изопармы
соседних поверхностей стремятся «состыковаться» друг с другом. Это очень удобно для борьбы с
дырками на швах.
Stitch Smoothness=Normals/Tangents, задает, как будет модифицироваться второй (и
даже третий, в случае Normal) от края ряд контрольных вершин, для того, чтобы поверхности
стыковались друг с другом не только без зазора, но и гладко.
Сплайновое моделирование
275
Для бесшовного рендеринга опция Stitch Edges=Equal Params просто бесценна. Как вы
помните, сплайновые поверхности, как правило, разбиваются на полигоны перед визуализацией.
Чтобы на швах между объектами, сшитыми с помощью Global Stitch, гарантированно не появлялось
дырок, следует для всех этих поверхностей включить в Attribute Editor опцию Enable Advanced
Tessellation в разделе Tessellation. После этого для всех поверхностей следует определить, на
сколько полигонов разбивается каждый сегмент между изопармами. А так как изопармы сшитых
поверхностей как бы «втекают» друг в друга, то с каждой стороны от края будет одинаковое
количество полигонов между изпармами и, соответственно, ребра полигонов будут совпадать.
Если вы захотите отредактировать одну из поверхностей, сшитых с помощью Global Stitch,
то, боюсь, вам будет проще удалить Construction History, изменить поверхность и сшить все заново.
Так, по крайней мере, будет быстрее.
Чуть не забыл: в Option Box операции Global Stitch есть параметр Max Separation, задающий,
насколько близко должны располагаться края поверхностей, чтобы они начали сшиваться. Его
зачастую проще оставить по умолчанию, то есть достаточно маленьким, и настроить потом, после
выполнения операции сшивания, в атрибутах ноды globalStitch.
Совет. Поэкспериментируйте с атрибутами ноды globalStitch после выполнения
операции сшивания.
Пока вы не удалите Construction History, края поверхностей будут притягиваться друг к
другу. Поэтому изменение формы одной поверхности будет влиять на соседние объекты.
Для тех, кто по прежнему страстно желает попрактиковаться с использованием сшивания и
276
Книга Сергея Цыпцына
№
применением сплайнов для органического моделирования, я могу порекомендовать переведенную
на русский язык книжку Mastering MAYA Complete. Там есть пример прилежного моделирования
собаки, кромсания ее на заплатки и пришивания конечностей с помощью операции Stitch.
Практические советы
На этом я бы хотел закончить разговор о сплайновом моделировании и дать еще немного
практических рекомендаций.
• Избегайте острых углов между поверхностями. Для реалистичной визуализации.
• Старайтесь не применять Trim и Planar, в основном из-за потенциальных дырок на швах
(Trim Edges).
• Не оставляйте видимыми открытые края поверхностей. Они выглядят как острые грани
и режут глаз. Загните или закамуфлируйте их чем-нибудь.
• Не используйте Round Tool и Circular Filet. Они работают медленно, создают тяжелую
геометрию, результат не всегда предсказуем.
• Если не удается построить геометрию при помощи стандартных инструментов, пытайтесь
сделать необходимые участки вручную, используя различные привязки, вспомогательные объекты
для «приснапливания»; «отдирайте» изопармы там, где надо, и проводите по ним заново Loft или
Birail; не забывайте про Rebuild и т.д.
• Если это не противоречит художественному замыслу, почаще привязывайтесь к сетке
при расстановке и редактировании контрольных вершин.
• Используйте Hull для выбора целых рядов контрольных точек.
• Следите, чтобы сетка соединяющая контрольные вершины, не «запутывалась» и не
перекручивалась. «Хорошая сетка» из контрольных вершин - равномерная и гладкая.
• Экономьте контрольные вершины. Добавляйте новые, когда уже из носа идет кровь от
напряжения.
• Помните про параметризацию. Старайтесь контролировать количество сегментов и тип
параметризации на выбранных поверхностях и кривых перед применением очередной операции
сплайнового моделирования. Почаще перестраивайте поверхности с помощью Rebuild Surfaces,
сохраняя форму (Keep=CV) и перераспределяя параметр (Parameter Range=0 to #Spans).
• Имейте в виду, что некоторые операции (например, Freeform Fillet) создают поверхности
с параметризацией Chord Length. Это может быть источником неприятностей.
• Помните, что в процессе рендеринга сплайновые поверхности преобразуются в полигоны.
Держите в уме, как они будут превращаться в полигоны и как вследствие этого будет выглядеть
ваша модель. Результат тесселяции - на вашей ответственности.
Главная практическая рекомендация
Основной практический совет относится не только к работе с NURBS, но и к моделированию
вообще.
Не моделируйте лишнего!
Во-первых. Половина того, что собирается построить начинающий моделлер, визуально
воспроизводится с помощью текстур. Постоянно имейте это в виду и экономьте время. Примером
может служить желание тщательно промоделировать протектор покрышки быстро едущего
автомобиля на среднем плане. Текстуры - инструмент моделирования!
Во-вторых. Все советы относительно острых углов, открытых краев, дырок на швах и
других неприятностей касаются очень крупных и малоподвижных планов. Помните, что во время
Онлайновое моделирование
277
НИША
движения изображение размывается и ваш «брак» мало кто увидит. Глубина резкости также
размывает очертания объектов, так что всегда держите под рукой (или в голове, если вы сам
себе режиссер) раскадровку и описание планов. Кроме того, если внимание в кадре направлено
на один основной объект, то остальные могут быть смоделированы прямо-таки с отвратительным
качеством, особенно если план достаточно короткий.
В-третьих. Если ваш персонаж достаточноодет,никогонеинтересуеткачествомоделирования
плечевого стыка или гладкости подмышечной впадины. Контролируйте принципиальную видимость
поверхности в сцене. Часть объектов нужна лишь для расчета динамики или визуального контроля
пропорций. Такие объекты должны быть максимально примитивны.
Не знаю, кто как, а я попал в компьютерную графику благодаря горным лыжам. В конце
1996 года мне окончательно надоело продавать компьютеры для нефтегазовой отрасли народного
хозяйства, в результате чего я уволился, откуда только мог, и уехал в горы. Естественно, на
Чегет. Собираясь в дорогу, я встретил людей, которые довели до моего сведения, что российская
компьютерная графика нуждается в относительно молодых и пытливых умах. В отличной компании
и прекрасном настроении, предвкушая смену профессиональной деятельности, я погрузился в
самолет и отправился навстречу заснеженным вершинам.
Снега не было вообще...
Я и раньше слышал, что ездить на Чегет встречать новый год - не очень хорошая идея, но
любой горнолыжник всегда думает, что ему-то как раз со снегом повезет и в ночь перед прилетом
обязательно навалит пару метров. Я тоже не мог поверить, что это случилось со мной, однако в
хлам убитые на камнях новые лыжи Volkl и чудовищные очереди на верхних очередях вернули меня
из мира иллюзий. Оставалось кататься только на Эльбрусе, причем на самом верху. Лучше всего
было, забравшись на верхнюю станцию Мир, дать денег местным, скажем так, спасателям, после
чего можно было погрузиться в ратрак, который отвозил сильно желающих на Приют Одиннадцати,
на высоту 4200 метров.
Я до сих пор испытываю чувство некоторого обескураженного удивления по поводу самого
существования такого мероприятия, хотя и признаю, что это были мои лучшие горнолыжные
приключения. Дело в том, что перекатавшись на десятке различных горнолыжных точек, я
несколько привык, что опасные места обычно обозначены как на карте, так и на местности и что
в Австрии, например, можно вообще загреметь в полицию за катание вне обозначенных трасс.
Каково же было мое удивление, когда я обнаружил себя на броне ползущего почти отвесно
ратрака, отчаянно цеплялющимся за любые неровности кузова. Вокруг меня самоотверженно
пузырилась масса из людей вперемешку с лыжами, весьма условно закрепленная на поверхности
стального зверя. Все при этом были чрезвычайно довольны и сноровисто ловили норовивших
выпасть за борт девушек и лыжи. Но самое интересное было впереди. Поднявшись на высоту
четыре тысячи двести, эти, типа, спасатели быстро стряхнули остатки людей и лыж с бортов
ратрака и мгновенно растворились в разгулявшейся метели. Я ожидал увидеть трассу или хотя бы
флажки, но ни увидел вообще ничего, и не потому что они отсутствовали, а потому что ничего не
было видно из-за пурги и тумана.
Но вокруг находился бывалый народ, все уже агрессивно щелкали креплениями и
готовились к спуску в никуда. В никуда уходил след от ратрака, видимый не более чем на три
метра, и веселая толпа лыжников, подбадривая друг друга громкими криками, начала ссыпаться
вниз. Кричать было необходимо, просто чтобы не потеряться, хотя мне казалось, что шансы
потеряться в этой пурге на незнакомом склоне равняются девяносто девяти процентам. Однако все
до единого вписались в один счастливый процент, и когда в тумане проступили бочки Карбаши, я
очень был... пожалуй, больше удивлен, чем напуган. Ноги сильно дрожали от напряженной езды
по узкому следу, а мозг сверлила одна мысль: «Почему русские люди всегда развлекаются столь
специфическими способами?».
Через пару дней погода наладилась, и я, завидев синее небо над Эльбрусом, предпринял
еще одну попытку специфических развлечений. Проделав знакомый путь на ратраке до Приюта, я
278
Книга Сергея Цыпцына
№
вместо того, чтобы шумно нестись вниз, взвалил лыжи на плечо и двинулся вверх по тропе. Эти,
типа, спасатели, сказали мне, что тропа ведет на Эльбрус и что заблудиться невозможно (я еще не
привык тогда, что «заблудиться невозможно» в местных высокогорных условиях означает «один
шанс из ста, чтобы не заблудиться»). Я, конечно, не предполагал подняться на самую высокую
вершину Европы, однако просто хотел проверить, до каких высот сможет подняться организм,
измученный работой за компьютером.
Первый час я шел довольно бодро, делая стометровые переходы и с восторгом взирая на
кавказские горы в ярком солнечном свете. Однако чем дальше, тем короче становились переходы и
длиннее перекуры. Дело в том, что на высоте 4200 метров человеку, пять дней назад приехавшему
из Москвы, дышится не очень легко. Точнее, если стоять, сидеть и не делать резких движений, то
ничего не чувствуешь. Однако при попытке пробежаться или присесть и встать пару раз, ощущаешь
себя пробежавшим стометровку. Если же идти вверх по узкой тропе в горнолыжных ботинках
и тащить на себе двухметровые лыжи, то ощущаешь себя только что пробежавшим марафон с
мировым рекордом. Последние два часа я помню довольно плохо. Помню, что считал шаги и после
каждой десятки делал перекур, причем во время ходьбы отдышавшийся организм по инерции
делает бодрые шаги, но через десять-двенадцать снежных ступенек сердце почему-то неожиданно
перемещается в голову и начинает стучать в мозгу с криками: «Землетрясение! Держите крышу».
Идти становится невозможно, в силу отсутствия зрения и сил, и приходится просто наблюдать,
когда сердце уберется восвояси из головы и даст возможность сделать еще десять шагов.
Самое интересное началось дальше, когда стоять между переходами стало уже невозможно:
я плюхался на снег, даже не дожидаясь головокружения, а просто отсчитав норму шагов. Я читал
в детстве у Джека Лондона, что замерзшие в пурге старатели не сильно мучились, а скорее,
наоборот, имели весьма довольный вид. Я, конечно, не замерзал, но сев на снег, я запасался
всей имеющейся силой воли, чтобы через минуту встать. Как только я закрывал глаза, чего делать
было, оказывается, нельзя, перед моим взором возникали такие красочные картины и нереальные
объекты, что я начинал просто глупо улыбаться. Никакие процедурные текстуры не могут сравниться
с красотой психоделических калейдоскопов появлявшихся на моем внутреннем горизонте. При
этом тело стремительно теряло вес, и я чувствовал, что с неторопливым блаженством взлетаю в
голубое небо. Тут раздавался душераздирающий скрежет, и великолепные картины стремительно
съезжали в бок. Оказывается, я просто начинал заваливаться набок в сладком сне, и горнолыжный
комбинезон принимался беспокойно шуршать. Это шуршание и приводило меня в чувство, хотя по
правде сказать, возвращаться совершенно не хотелось. Открыв глаза, я долго удивлялся, где
это я, так как великолепные виды сверкающих снежных пиков казались детскими рисунками по
сравнению с только что увиденными пейзажами. В конце концов я понял, что прохожу не более трех
метров за раз и что такими темпами не дойду даже до скал Пастухова. Через четыре часа после
начала подъема я усилием воли поставил себя на лыжи и потихоньку стал спускаться к Приюту
Одиннадцати, стараясь не делать резких движений, чтобы снова не провалиться в мир иллюзий.
Внизу меня ждала компьютерная графика, а за спиной остались самые красивые процедурные
текстуры в мире. Впрочем, тогда я еще не знал, что такое текстуры, и уж тем более процедурные,
поэтому просто запомнил все эти нереальные картины, как самое впечатляющее и красивое
расширение сознания за всю свою жизнь. Тем, кто не знает, что такое процедурные текстуры,
советую заглянуть в соответствующую главу этой книги. Про расширение сознания легальными (и
негорнолыжными) методами можно почитать в трудах Станислава Грофа.
Сплайновое моделирование
279
Полигональное моделирование
Про полигоны без прогона, или полигоны Про
Приступая к написанию этой главы, я, признаться, испытывал некоторую растерянность.
На первый взгляд, после материала про сплайны полигоны кажутся вызывающе простыми:
никаких параметризаций, тангенсов или радиусов кривизны. Просто набор вершин, с которыми
можно делать все, что угодно. Однако именно эта «все-что-угодность» сильно затрудняет
последовательное изложение материала.
С одной стороны, мне бы не хотелось заниматься простым перечислением инструментов и
заниматься переводом прилагаемой к MAYA документации (хотя именно для полигонов это могло
бы быть неплохой идеей).
С другой стороны, полигоны не накладывают таких жестких ограничений на методы работы,
как те же сплайны. Поэтому вопрос, «как надо работать с полигонами» (или «как правильно»),
становится бессмысленным. Опросив некоторое количество мастеров Полидзен, я убедился
в том, что каждый из них творит в своей манере и имеет свой любимый набор инструментов.
В результате этого опроса мне удалось составить хит-парад инструментов и выведать секреты
мастеров различных школ, способные сэкономить некоторое количество времени начинающим
вертексоводам.
С третьей стороны, благодаря определенной «вседозволенности» при работе с полигонами
(опять же, по сравнению со сплайнами) в процессе работы могут возникать многочисленные
«косяки» - одиночные ребра, перевернутые нормали и прочий «мусор», остающийся как результат
некоторых операций и просто невнимательности гениального пользователя.
Поэтому в этой главе вы найдете описание технического устройства полигональных
поверхностей, чтобы уметь контролировать качество и следить за чистотой создаваемых моделей.
Также я постараюсь отметить наиболее частые причины возникновения «косяков» и дать способы
борьбы с ними.
От описания инструментов мне, похоже, полностью отвертеться не удастся, но я, по
крайней мере, постараюсь объединить их в логические группы и расскажу, в каких случаях лучше
применять те или иные средства.
Также эта глава будет напичкана разными советами и подсказками практического свойства.
Полигональные инструменты - это настолько хлопотный и многочисленный набор, что без трюков
и ухваток просто не обойтись.
Не ждите сквозного проекта по созданию супермодели с нуля и до конца. На одной модели
невозможно продемонстрировать даже четверть доступных инструментов, ибо для каждого
класса моделей используются разные инструменты. Для персонажного моделирования одни, для
архитектуры другие, для дизайна - третьи. Так как я по жизни больше общался с «персонажниками»,
то возможно дальнейшее изложение будет иметь соответствующий уклон. Однако сразу сделаю
безответственное заявление: я не собираюсь учить вас моделировать человеческую голову, а
также туловище и другие части тела. Во-первых, потому что сам не умею, а во-вторых, не очень
представляю, как можно написать такие инструкции: ведь основная часть этого процесса состоит
«просто» в таскании вершин. В-третьих, специально для этого написаны (и даже переведены)
очень неплохие книги, посвященные именно персонажному моделированию (например, Питер
Ратнер. «Трехмерное моделирование и анимация человека»). Распределение вершин на голове
персонажа на вписывается в концепцию «Понимая Майя».
280
Книга Сергея Цыпцына
Начинка и устройство майских полигонов
Начну материал о том, как устроены полигоны, с рассказа про трехмерные сканеры.
Некоторые эрудированные умы наверняка слышали про такое чудо техники. Такие сканеры бывают
разных типов и размеров, однако на выходе у них всегда один и тот же результат - облако точек (есть
специальные трехмерные форматы, описывающие такой тип данных), то есть набор трехмерных
координат. Причем набор немаленький - в среднем миллион точек. Если повезет, то в придачу к
такому набору выдается текстура цвета. Если совсем повезет, то программное обеспечение, идущее
вместе со сканером выдаст вам вместе с облаком точек и полигональную сетку, обтягивающую
это облако. А дальше начнется веселый процесс называемый «реконструкцией поверхности»,
ибо анимировать или текстурировать такую плотную сетку невозможно. Два основных (но не
единственных) пути реконструкции таких поверхностей заключаются в следующем.
В первом случае берется толковый начинающий моделлер , который «обтягивает» такую
поверхность полигональной сеткой нужной топологии, просто используя привязку к точкам
отсканированной поверхности. Это наиболее быстрый способ.
Во втором случае используется программное обеспечение типа Paraform (http://www.
paraform.com/paraform.html) или Cyslice (http://www.headus.com/au/home.html), которое
автоматизирует процесс «обтяжки» облака точек и может выдать наружу набор сплайновых патчей
или даже сабдив-поверхность, притом вместе с картой дисплейсмента, учитывающей разницу
между оригинальной и отредактированной поверхностями. Рисовать границы патчей, однако, вам
придется вручную, иначе топология будет непригодна для анимации.
Мораль этого технологического отступления следующая: полигональная поверхность
определяется не только набором вершин, но и набором ребер, соединяющих эти вершины.
Корректнее сказать: «но и порядком нумерации этих вершин». Одни и те же точки можно ведь
соединить по-разному. Поэтому порядок вершин полигональной поверхности имеет важное
значение.
Таким образом, кроме вершин, существуют еще ребра (edges), соединяющие вершины.
Грани (faces) являются производными компонентами и однозначно: определяются как
заполненная область между вершинами и ребрами.
MAYA не накладывает ограничений на количество вершин для одной грани, соответственно
одна грань может быть образована десятью вершинами.
Полигональное моделирование
281
Как следует из давно забытой школьной программы, три точки всегда лежат в одной
плоскости, а четыре или пять далеко не всегда. Если вершины грани лежат в одной плоскости,
такая грань называется планарной (planar), в противном случае, как это ни странно звучит -
непланарной (non-planar).
Несмотря на то, что одна грань может содержать произвольное количество вершин,
выделяют два основных типа граней: треугольники (triangles) и четырехугольники (quadrangles).
О преимуществах четырехугольников и недостатках треугольников речь пойдет позже. А пока я
могу добавить, что каждая четырехугольная грань всегда может быть разбита на две треугольных
и что в процессе рендеринга такое разбиение обычно и происходит (если речь идет о рендерерах
традиционной архитектуры). Вы можете посмотреть, как АДАУА делает это, выбрав поверхность
и включив в Attribute Editor галку Display Triangles в разделе Mesh Component Display. Забегая
вперед, могу лишь дать первый практический совет.
Совет. Держитесь четырехугольников. Планарных, притом.
Кстати, в MAYA вообще нет такой компоненты, как треугольники. Только грани (faces).
Если вы возьмете кубик и оставите у него две противоположные грани, удалив остальные,
MAYA все равно будет рассматривать эти две отдельно стоящие грани как одну полигональную
поверхность (mesh). Для обозначения неразрывных областей иногда используется понятие Shell
(оболочка), хотя принципиального значения этот термин не несет.
Ребра, имеющие примыкающую грань только с одной стороны, называются граничными
ребрами (border edges) и часто выделяются жирной линией.
После того, как вы смоделируете свой шедевр, у вас может появиться странное
желание - назначить материалы и, более того, положить на объект текстуры. В случае со
сплайновой геометрией все понятно. Она сама содержит параметрические координаты и никакие
дополнительные усилия для накладывания текстуры на поверхность не нужны. С полигонами все
несколько сложнее. Для того, чтобы спроектировать текстуру, нам необходимо знать, где каждая
грань располагается на двухмерной плоскости, совпадающей по размерам с нашей текстурой.
Поэтому в каждой вершине может содержаться дополнительная информация о текстурных
координатах, необходимая для накладывания текстур на поверхность. Эти две координаты
обозначаются как UV и рассматриваются как компоненты поверхности. Следует оговориться, что
текстурных координат на поверхности может и не быть.
Для совсем пытливых умов могу добавить, что в вершинах можно хранить не только
текстурные координаты, но и другие произвольные данные, которые не будут использованы самой
MAYA, но будут полезны при передаче модели в игровой движок. Эти данные называются Blind Data
и никак не используются при моделировании внутри самой MAYA.
282
Книга Сергея Цыпцына
Терминология
Помучившись с терминами в предыдущем отрывке, я понимаю, что и здесь нужны
традиционные терминологические комментарии. Полигональное моделирование произвело на
свет самое большое количество майского жаргона. Бывалого майщика не удивит фраза типа: «эти
фейсы надо проэкструдить, потом эйджи забивелить и не забыть смерджить вертексы, после чего
можно смусить». Чтобы перевести это на книжный язык потребуется в три раза больше слов,
поэтому я был бы рад остаться в рамках устной традиции, но боюсь, что начинающие трехмерщики,
еще недостаточно овладевшие искусством майского Полидзен , могут просто испугаться, открыв
книжку на каком-нибудь «просплитованном фейсе». Поэтому я буду вынужденно сохранять баланс
между краткостью и доступностью.
«Фейсы» будут гранями. «Эйджи» - ребрами. «Вертексы», по мере возможности, будут
вершинами, но иногда сила привычки будет брать верх и пара вертексов все же проскользнет на
страницы. С нормалями проблем нет. Слово «планарный», оказывается, совершенно легально.
Со всякими «смусами» (smooth), «клинапами» (clean-up), «сплитами» (split) и «экструдами»
(extrude) я буду выкручиваться по контексту, по крайней мере слово «экструдированный», похоже,
прозвучит не раз, тем более, что словарь Lingvo-Science уже дает на это добро. К сожалению,
термин «меш» (или «мешь» - mesh), удобный своей краткостью и «интернациональностью»,
придется игнорировать хотя бы потому, что неизвестен его род и поэтому непонятно, надо ли
ставить мягкий знак в конце слова. Придется писать ... эх... «полигональная поверхность»...
Восьмая версия - внимание, диверсия!
Как я уже писал в главе про интерфейс, в команде разработчиков AAAYA сидит специально
обученный человек, который занимается тем, что слегка меняет структуру меню MAYA от версии к
версии, чтобы пользователь не утрачивал чувства новизны и находился в священном напряжении,
разбираясь со очередной версией. Однако в восьмой версии этот диверсант похоже вышел из
под контроля и покромсал в клочья меню для работы с полигонами, полностью переделав его
структуру. Более того, набор меню для работы с полигонами теперь представляет собой отдельный
Menu Set (раньше полигональные инструменты были объединены со средствами моделирования
сплайновых поверхностей и сабдивов). Как следствие изменилась последовательность горячих
клавиш (F2, F3, F4, ...) для выбора нужных наборов меню. В общем произошла санкционированная
диверсия, ибо разыскать привычные полигональные инструменты теперь стоит большого труда.
К сожалению, материал данной главы был написан для седьмой версии, и задача розыска
упомянутых ниже операций и инструментов ложится на плечи читателя. Хорошо хоть названия
самих операций остались прежними, поэтому методом пристального взгляда их можно отыскать в
новом наборе меню, который представляет собой восемь новых названий: Select, Mesh, Edit Mesh,
Proxy, Normals, Color, Create UVs, Edit UVs. Кроме того, в главном меню Help есть пункт Find Menu,
позволяющий найти в безумном майском меню нужную операцию по ее названию.
Нормальные нормали
Интуиция подсказывает, что у каждой грани есть нормаль, направленная перпендикулярно
плоскости грани. Но та же интуиция подсказывает, что если создать полигональную сферу, то в
таком случае она должна выглядеть «фасеточным» образом, то есть каждая грань должна быть
четко видна.
Полигональное моделирование
283
Однако создав сферу, вы видите довольно гладкую и упитанную поверхность, где не
заметно границ между гранями.
Дело в том, что в MAYA используются два вида нормалей: нормали граней и нормали
вершин. Нормаль грани, как был сказано выше, всегда перпендикулярна грани и - условно говоря
- «торчит» из центра грани. Она определяет, где у грани передняя сторона, а где задняя. По
умолчанию в MAYA видны обе стороны граней, однако вы можете изменить это, установив для
выбранной поверхности в Attribute Editor параметр Backface Culling=full.
284
Книга Сергея Цыпцына
Нормали граней (face normals) используются для моделирования и определения видимости
граней.Однако для освещения используются нормали, находящиеся в вершинах (vertex normals).
Эти нормали как раз и отвечают за сглаженность поверхности. Освещение (или затенение) точки
на поверхности определяется в результате использования угла между лучом света, падающим на
эту точку, и нормалью из нее исходящей. Соответственно, если вдоль каждой грани все нормали
направлены одинаково, то мы получим фасеточный вариант затенения. Однако, внимательно
рассмотрев любую полигональную поверхность (для этого включим в Attribute Editor галку
Display Normal и установим Normal Type=vtxface), мы обнаружим необыкновенную вещь: из каждой
вершины исходит несколько нормалей. Их количество в каждой вершине соответствует количеству
граней, которые примыкают к этой вершине. Что вполне логично.
Эти вершинные нормали могут совпадать между собой (и тогда поверхность выглядит
гладкой), но могут и отличаться, совпадая с направлениями нормалей на примыкающих гранях:
вот тогда поверхность выглядит рубленной.
Дело в том, что для каждой точки на поверхности одной грани направление нормали
вычисляется как усредненное направление между нормалями в вершинах данной грани. Поэтому
если в данной вершине (или на ребре) направления всех нормалей для примыкающих граней
совпадают, затенение вокруг этой вершины вычисляется с похожими значениями, и этот участок
поверхности выглядит как сглаженный.
Можно сказать, что есть еще и третий тип нормалей - нормали освещения, вычисляемые
вдоль поверхности грани. Однако их нельзя увидеть, они вычисляются только в процессе
освещения.
Таким образом, вершинные нормали используются только для освещения поверхности и
управления внешней сглаженностью в процессе визуализации.
Следует понимать, что нормаль для грани вычисляется однозначно на основе формы
грани, а вот вершинные нормали могут принимать любые значения: чтобы вы могли управлять
степенью визуальной сглаженности поверхности, как вам угодно. Вы сами можете редактировать
вершинные нормали с помощью инструмента Edit Polygons=>Normals=>Vertex Normal Edit Tool и Set
Vertex Normal. Также следует понимать, что такая сглаженность не добавляет новых компонент и
не имеет ничего общего с операции Smooth: это всего лишь трюк с освещением.
Примечание. В восьмой версии меню Normals выделилось в отдельный пункт
главного меню. Ищите упомянутые операции там.
С вершинными нормалями связано понятие жестких и мягких ребер (hard edges и soft
edges). Для жестких ребер направление нормалей освещения по разные стороны ребра на соседних
гранях разное. Для мягких ребер нормали освещения на соседних гранях совпадают около ребра,
поэтому переход освещения с грани на грань происходит плавно.
По умолчанию, когда MAYA создает примитив, кубик или сферу, она проверяет углы между
соседними гранями вдоль всей поверхности. Если угол небольшой (как у граней сферы), вершинные
нормали устанавливаются так, чтобы ребра были мягкие с точки зрения освещения. Если угол
между гранями большой (как у кубика), вершинные нормали задаются равными нормалям граней,
и ребра становятся жесткими.
Вы можете изменять жесткость/мягкость ребер с помощью операции Edit Polygons=>Norm
als=>Soften/Harden, задавая пороговое значение угла, меньше которого все ребра буду считаться
мягкими.
Операция Edit Polygons=>Normals=>Set to Face позволяет сделать все ребра жесткими,
установив вершинные нормали равными нормалям для граней.
Заканчивая разговор про нормали, хочется добавить, что в меню Normals только две
операции работают с нормалями для граней: это Reverse (она разворачивает нормаль в другую
сторону) и Conform (эта разворачивает все нормали для выбранных граней так, чтобы они - все!
- смотрели в одну сторону).
Полигональное моделирование
285
Работа с компонентами
Итак, основными компонентами полигональных поверхностей являются вершины, ребра,
грани, UV-координаты. Периодически их придется выбирать и что-то с ними делать. Существует
два основных способа выбора компонент и соответственно два сообщества, исповедующих тот или
иной способ.
Первый путь состоит в использовании компонентного режима выбора и использования
масок выбора компонент (Selection Masks), доступных на Status Line.
В дополнение к традиционной горячей клавише F8, переключающей объектный и
компонентный режимы выбора, специально для полигонов существуют еще набор клавиш для
выбора конкретных компонент.
F9 - vertex (вершины)
F10 - edge (ребра)
F11 - face (грани)
F12- UV
Преимущество компонентного режима в том, что вы гарантированно выбираете заданный
тип компонент и что никакие объекты с более высоким приоритетом выбора (например, кости) не
будут путаться у вас под курсором и мешать выбирать компоненты.
Второй способ более быстрый, однако и более «рискованный». Нажав над поверхностью
правую кнопку мыши, вы получите доступ в контекстное меню, позволяющее выбирать компоненты,
не выходя их объектного режима. Этот способ удобен для совместного выбора компонент разных
типов или компонент и объектов вместе.
286
Книга Сергея Цыпцына
Специально для ускорения работы с полигонами существует еще несколько трюков. Если
нажать Ctrl вместе с правой кнопкой мыши, то в появившемся Marking Menu будут содержаться
основные операции для работы с компонентами: например, это конвертирование выбранных
компонент в другой тип.
Если нажать Shift вместе с правой кнопкой мыши, вид появившегося меню будет зависеть
о того, что в данный момент выбрано.
Полигональное моделирование
287
1АМША
Примечание. Компоненты типа VertexFace используются только для присвоения
цветов вершинам поверхности и никак не используются при работе с формой
поверхности. Как для каждой вершины существует несколько вершинных нормалей,
хранящих направления для всех примыкающих к вершине граней, так же для каждой
вершины существует столько же компонент типа VertexFace, соответствующих
индивидуальным угловым точкам примыкающих граней. Про технику присвоения
цветов вершинам будет рассказано позже.
Эффективный выбор компонент
Приведу несколько практических приемов для быстрого и эффективного выбора.
Довольно часто начинающие пользователи спрашивают о том, как избежать выбора
компонент с обратной стороны поверхности, например, сферы. Можно, конечно, включить
отсечение невидимых граней (Backface Culling), однако я настоятельно рекомендую поиграть с
Edit=>Paint Selection Tool. Трюк состоит в том, что сначала надо выбрать нужный тип компонент
через Marking Menu, а затем вызвать этот инструмент, с помощью которого вы сможете выбирать
нужные компоненты с помощью кисти, раскрашивая области выбора.
Примечание. В восьмой версии инструмент Paint Selection Tool переехал на панель
Toolbox, где располагается третьим сверху.
В параметрах этого инструмента можно выключить опцию Add to Current Selection и
использовать клавишу Shift для выбора нескольких областей. Попробуйте, это жутко удобно.
Если у вас довольно свежая версия MAYA, то выбрав вершину (или несколько) вы можете
«побегать» по вершинам с помощью стрелок (вниз-вверх-вправо-влево). Имейте в виду, что такой
выбор соседних точек радикально отличается от выбора контрольных вершин на сплайновых
поверхностях, где они выбираются по порядку. В случае с полигональной поверхностью соседние
вершины выбираются не по номеру, а по степени близости к данной вершине в плоскости экрана.
Поэтому такой выбор зависит от ракурса и не зависит от нумерации вершин. Дойдя до граничной
точки в плоскости экрана, вы не перейдете на невидимую сторону. Имейте также в виду,
путешествуя по точкам, например, вправо, вы можете не вернуться обратно в исходную вершину,
нажимая стрелку влево.
Одним из плюсов при работе с полигонами является возможность выбрать часть компонент
объекта, а всю остальную сцену мгновенно спрятать и работать только с выделенной частью
поверхности. Это осуществляется с помощью операции Isolate Select, которая находится в меню
панели камеры: Show=>lsolate Select=>View Selected. Чтобы вернуться к обычному режиму, надо
вызвать этот пункт меню еще раз.
288
Книга Сергея Цыпцына
Последние версии MAYA также порадовали любителей моделирования большим количеством
мелких «примочек», автоматизирующих рутинные процессы выбора соседних компонент,
объединенных в цепочки. Наподобие выбора изопарм или целых рядов контрольных точек для
сплайновых поверхностей. Это прежде всего Edit=>Select Edge Loop Tool, позволяющий выбрать
цепочку из ребер, образующих линию типа изопармы. Достаточно сделать двойной щелчок на
нужном ребре, и все соседние ребра, образующие линию будут автоматически выбраны. Можно
также выбирать первое и последнее ребро, для того, чтобы выбрать также все промежуточные
ребра. Можно выбирать несколько таких линий, щелкая в начале и в конце отрезка из ребер.
Аналогичный инструмент называется Edit=>Select Edge Ring Tool и позволяет выбирать не
линии из ребер, а как бы «полоски» из параллельных. Эти «полоски» могут быть преобразованы в
грани, образующие длинные «ленты».
Кстати, вместе с этими инструментами появились и новые Edit Polygons=>Split Edge Ring
Tool и Edit Polygons=>Duplicate Edge Loop Tool, позволяющие вставлять полигональные «изопармы»
одним щелчком мыши.
Выбрав одни компоненты, вы можете быстро сконвертировать их в другие. Это бывает
очень полезно. Например, выделив ребро, вы хотите двигать его по нормали к поверхности,
однако включив в установках Move Tool опцию Move=Normal, вы получите сообщение о том, что по
нормали можно двигать только вершины. Ничего страшного. Нажмите Ctrl и правую кнопку мыши,
затем выберите То Vertices. Другие полезные операции по работе с селекциями находятся в Edit
Polygons=>Selection. И там же обратите внимание на горячие клавиши.
Полигональное моделирование
289
Примечание.В восьмой версии инструменты выбора компонент выделены в
отдельное меню Select, где их и следует разыскивать.
Кстати, очень часто MAYA автоматически конвертирует выбранные компоненты из одного
типа в другой. Например, если выбрав ребро, вы выполните операцию Extrude Vertex, MAYA
автоматически выберет вершины на концах ребра и сделает для них указанную операцию. Кроме
того, если вы выберете объект целиком и сделаете какую-нибудь «компонентную» операцию
(типа Extrude Face), MAYA по умолчанию сконвертирует выбранный объект во все его компоненты
соответствующего типа, выполнит для них операцию, да при этом еще и перейдет в компонентный
режим.
Для тех, кто занимается промышленным дизайном или архитектурой, полезно будет изучить
окно Edit Polygons=>Selection=>Selection Constrants... (в восьмой версии Select=>Select Using
Constraints). Оно позволяет задать всевозможные фильтры на выбираемые компонены: например,
выбирать только грани, находящиеся под определенным углом к линии взгляда. Таких фильтров
- десятки, и нет смысла разбирать каждый из них.
Немного о перетаскивании вершин
Экстремально говоря, полигональное моделирование можно свести к перетаскиванию
вершин определенным образом, а также к возможности добавлять и удалять вершины в
нужных местах. Все остальные операции являются вспомогательными и автоматизирующими
290
Книга Сергея Цыпцына
три упомянутых процесса. Немного поговорим о перетаскивании вершин и других компонент
различными способами и разных хитрых трюках.
Прежде всего, не забывайте, что в установке Move Tool есть опция Move=Normal,
позволяющая перетаскивать вершины по нормали к поверхности.
Вы можете также вращать и масштабировать выбранные вершины, грани или ребра. Пивот
выделения по умолчанию располагается в центре выделения и каждый раз при новом выборе
обновляется. Вы можете его изменять при помощи стандартной клавиши Insert и даже фиксировать
в определенном месте, независимо от выделения, нажав голубой кружок на вертикально оси
манипулятора пивота. Не только потом забудьте его разблокировать.
Совет. Можно моментально перенести пивот в нужное место, щелкнув в этом
месте средней кнопкой мыши. Для этого, однако, надо предварительно включить
в общих установках следующую опцию: Windows=>Settings/Preferences=>Preferences
= >Manipulators=>Reposition Using Middle Mouse Button.
Советую не пройти мимо такой операции как Edit Polygons=>Move Component. (В восьмой
версии Edit Mesh->Transform Component). Мало того, что она умеет двигать по нормали (и не
только) любые выбранные компоненты, она еще имеет историю! То есть вы можете корректировать
сделанные трансформации после выполнения операции перемещения или вращения. Для этого в
истории объекта появляется нода polyMove..., редактируя атрибуты которой, вы можете исправлять
или даже анимировать сделанные изменения. Очень полезным атрибутом этой ноды является
Random, позволяющий добавить хаоса в перемещения компонент и сделать из ноды polyMove
полноценный Noise Deformer.
Полигональное моделирование
291
Для архитектурных дизайнеров открытием года, возможно, станет хитроумнейший
инструмент под названием Modify=>Snap Align Objects=>Snap Together Tool. Про выравнивание
объектов я немного рассказал в главе про интерфейс, поэтому этого зверя вам придется приручать
самостоятельно. Как намек добавлю, что он работает с полигональным компонентами, такими,
как грани и ребра.
Отображение полигональных компонентов
Иногда необходимо во время работы постоянно видеть какие-то компоненты. Например,
посмотреть, куда направлены нормали, или где находятся «висящие» вершины. Конечно, можно
перейти в компонентый режим и увидеть эти компоненты, но при выходе из него или при смене
маски селекции они пропадут.
В меню Display=>Polygon Components можно увидеть команды позволяющие включить
постоянное отображение некоторых видов компонент для выбранных объектов, независимо от
режима селекции.
Включение опции Vertices, как и следует ожидать, покажет на выбранном объекте вершины.
Вершины отображаются желтым цветом. Аналогично, команда UVs покажет UV-координаты, но
зеленым цветом.
Команда Border Edges визуализирует ребра на краю поверхности или несшитые друг с
другом ребра более толстой линией. Эта опция весьма полезна. Например, когда мы моделируем
одну половину геометрии, зеркалим ее, а потом сшиваем объект из двух половин, включение
такой визуализации позволит увидеть нам, где еще находятся несшитые ребра.
Команда Soft/All Edges переключает два режима отображения ребер. По умолчанию в MAYA
используется режим, когда все ребра выглядят как сплошные линии. Использование этой команды
покажет «мягкие» ребра пунктирной линией.
292
Книга Сергея Цыпцына
Команда Normals переключает видимость нормалей, а последующие команды изменяют
длину отображаемых нормалей.
Необходимо понимать, что команды из меню Display не производят никакой магии, а всего
лишь изменяют соответствующие атрибуты полигональной поверхности. Эти атрибуты можно
разыскать в Attribute Editor в закладке для ноды типа mesh, в разделе Mesh Component Display.
Поэкспериментировав с атрибутами этого раздела, вы легко поймете, за что они отвечают,
так как их действие мгновенно отображается на экране. Напомню, что Backface Culling - это
процесс отсечения (скрывания) граней, нормали которых направлены в противоположную сторону
от камеры.
Если вы хотите изменить способ отображения компонент не только для выбранного
объекта, а для всех полигональных поверхностей в сцене, вам следует обратить внимание на окно
Display=>Custom Polygon Display. Там находятся практически все те же параметры, что и в разделе
Mesh Component Display, однако применить их можно сразу ко всем объектам.
Если вы хотите сохранить параметры отображения «на всю жизнь», зайдите
Windows=>Settings/Preferences=>Preferences=>Polygons и установите там нужные опции, раз и
навсегда.
Примечание. В восьмой версии отображение компонент было реорганизовано в
новый пункт меню Display=>Polygons.
Полигональное моделирование
293
Создание полигональной геометрии
Существует два радикально отличающихся подхода к созданию полигональной геометрии,
послуживших причиной возникновения двух конкурирующих школ Полидзен.
Первый состоит в том, что берется примитив, наиболее подходящий к будущей модели, и
из него «лепится» нужная форма, путем операций типа Split и Extrude. «Подходящий» не следует
воспринимать буквально. Один из моих студентов после окончания курсов с восторгом воскликнул:
«Я-то думал, что голова делается из шарика, а оказывается из кубика». Это верно, сфера конечно
напоминает голову по форме, но по топологии является наиболее зловредным примитивом. В этом
смысле кубик является абсолютным чемпионом, из него вытягиваются большинство моделей.
Конечно, если вы видите, что ваша модель топологически близка к цилиндру, можно начинать и
с него, но соперничать с кубиком не может никто. Когда я говорю «топологически», это означает,
что я имею в виду расположение вершин и направления ребер. Большинство моделей можно
мысленно заключить в невидимый куб (точнее, параллелепипед), а потом деформировать этот
куб в сторону своей модели, добавляя при этом недостающие детали. Этот подход хорош тем, что
изначально предполагает наличие некоторого объема, с которым предстоит работать. «Чувство
объема» должно стать вашим постоянным спутником.
Второй подход, состоит в использования Create Polygon Tool для создании первой,
«трафаретной» грани с нуля. Эта грань, как правило, плоская и повторяет контур будущей модели,
например головы. Далее, к этой грани добавляются вершины с помощью операции Split и объем
задается «наращиванием» геометрии.
Какой подход использовать - дело вкуса и конкретной ситуации. Как сказал один мой
знакомый мастер Полидзен во время очередной медитации: «Начинаю моделировать с одной
грани, но постоянно думаю о кубике».
Создание кубиков мы рассматривать не будем, а вот на инструменте Create Polygon Tool
стоит остановиться подробнее.
Create Polygon Tool
Механизм действия инструмента напоминает создание ломаных кривых с помощью CV
Curve Tool. Надо ставить точки на экране и в конце нажать Enter.
Откройте новую сцену. Выберите в меню Polygons интересующий нас инструмент. Курсор
обретет крестовидную форму.
Примечание. В восьмой версии инструменты, работающие с полигональной
294
Книга Сергея Цыпцына
поверхностью целиком, выделены в меню Mesh.
В окне front щелкните в произвольном месте один раз. Появится созданная вершина, по
умолчанию отображаемая зеленым цветом.
Щелкните на некотором расстоянии второй раз. Появится вторая точка, соединенная с
первой сплошной линией. Это ребро, соединяющее вершины будущей грани. Если сейчас выйти
из инструмента, нажав Enter, или просто сменив активный инструмент, MAYA ругнется следующим
образом:
Error: Last operation is cancelled : face must be at least a triangle.
И весьма справедливо. Если кто-то еще случайно помнит школьную программу, то для
того, чтобы определить плоскость, необходимо минимум 3 точки, и соответственно, любая грань
должна быть, как минимум, треугольной.
Щелкните в третий раз где-нибудь в стороне. Образуется третья точка, соединенная с
самой первой точкой пунктирной линией. Это говорит о том, что в MAYA, поддерживает грани с
неограниченным количеством вершин, и можно продолжить создание грани. Чтобы завершить
создание объекта, следует просто нажать Enter.
Что особенно приятно, MAYA не ограничивает возможность создания одним окном. Вы
можете спокойно перейти в другое окно, например side, и продолжить ставить вершины там, то
есть работать сразу в трехмерном пространстве. Это дает массу возможностей ускорить работу.
Дополнительные возможности, предоставляемые этим инструментом таковы:
Чтобы отменить создание по очереди последних точек, можно воспользоваться клавишей
Backspace. Не надо жать Undo, в данном случае это бесполезно.
После создания новой точки можно так же отредактировать ее положение в пространстве.
Для этого можно нажать среднюю кнопку мыши или клавишу Insert. После этого появится
манипулятор, позволяющий точно спозиционировать вершину.
Можно, конечно, создать полигон с дыркой (Hole) - но не нужно (по причинам, объясненным в
разделе о плохой геометрии). Для этого после создания базовой формы, не выходя из инструмента,
Полигональное моделирование
295
нужно кликнуть внутри грани, удерживая клавишу Ctrl. Не отпуская клавиши, можно щелкать
мышью, пока не сформируется необходимая дыра.
Для полноты картины остается только посмотреть, какие настройки есть у Create Polygon Tool.
Параметр Subdivisions позволяет автоматически делить ребра при создании на указанное
количество частей. То есть если опция установлена в значение 2, ребро будет поделено на две
части и посередине появится одна дополнительная точка. Не сильно популярный параметр среди
художников.
Limit Points to. Также не сильно популярная настройка. Как и следует из названия,
ограничивает количество точек в создаваемой грани. Если нужно создавать только треугольники,
следует установить её в значение 3. Но кто же будет строить свою модель как набор треугольников?
Загадочное значение «-1» обозначает неограниченное количество вершин.
Параметр Texture предназначен для работы с текстурными координатами. По умолчанию
стоит Normalize, что означает приведение в диапазон от нуля до единицы. Форма текстурных
координат будет соответствовать форме грани. Вторая возможность - Unitize - задает распределение
текстурных координат по углам и сторонам квадрата и также не является сильно популярной.
В том случае, когда все полигоны должны быть планарными, нужно включить эту опцию
Ensure Planarity. Можно эту проблему решить и по-другому. В меню Polygons=>Tool Options можно
включить опцию Keep New Faces Planar.
Встает законный вопрос. Что делать, если мы создали первую грань и хотим добавить к
ней еще одну? Опция Operation дает возможность на него ответить. Переключив опцию в Append
мы сотворим немного магии, Create Polygon Tool превратится в Append to Polygon Tool, и мы плавно
перейдем к следующему инструменту с этим названием.
296
Книга Сергея Цыпцына
Append to Polygon Tool
Append to Polygon Tool отличается от предыдущего Create Polygon Tool только тем, что
требует наличия уже созданной поверхности, к которой можно добавлять вершины. В процессе его
использования нужно выбрать уже готовый объект и щелкнуть по граничному ребру, к которому
будут добавляться вершины. Далее, можно ставить точки, где угодно.
Примечание. В восьмой версии этот инструмент переехал в меню Edit Mesh.
Примечание. Может быть, это не очевидно, поэтому я дополнительно отмечу:
Create Polygon Tool и Append Polygon Tool создают или добавляют ТОЛЬКО ОДНУ ГРАНЬ
(FACE). Не пытайтесь создавать всю поверхность, неистово щелкая мышкой.
Кроме того, Append to Polygon Tool позволяет не только «пришивать» новые грани, но и
«зашивать дырки» (соединять ребра) внутри одной поверхности.
Поупражняемся немного.
Создайте полигональный куб.
Задайте для него subdivisionsWidth= subdivisionsHeight= subdivisionsDetpth=2.
Выделите четыре грани на одной из сторон кубы и удалите их.
Выберите Polygon=>Append to Polygon Tool и щелкните по одному из верхних ребер (правому).
Полигональное моделирование
297
Обратите внимание на маленькую зеленую точку, обозначающую конец выбранного ребра.
К этому концу будут достраиваться новые вершины. Появившиеся стрелки обозначают направление
граничных ребер.
Щелкните по нижнему левому ребру. Появится грань в виде параллелограмма, соединяющая
выбранные ребра. Вы можете щелкать не только по граничным ребрам, но и в произвольных
местах пространства, однако помните, что вы создаете одну грань.
He надо жать Undo, оно бесполезно, пока вы находитесь в контексте инструмента.
Нажмите Backspace или Delete, чтобы вернуться к ситуации, когда выбрано только первое
ребро. Щелкните по верхнему левому ребру и далее по всем ребрам до правого нижнего против
часовой стрелки.
Нажмите Enter.
Вы получите новую грань.
Хорошая привычка - проверять поверхности на «правильность» после каждой операции
моделирования.
298 Книга Сергея Цыпцына
О «правильности» мы еще поговорим, а сейчас откройте Attribute Editor и откройте закладку
pCubeShapel, после чего в разделе Mesh Component Display включите галку Display Borders.
Обратите внимание на то, что правое вертикальное ребро стало толще.
Это означает, что в этом месте находятся два ребра. Действительно, немного перетащив
вершину в середине ребра, можно обнаружить дырку.
Конечно, если ваш кубик немедленно отправляется на финальный просчет, можно с ним
ничего не делать. Но взрослые мальчики, делающие модели для персонажной анимации, никогда
не позволят себе оставить модель в таком виде, ибо знают, что при первой же деформации дырка
вылезет наружу.
Переделаем все «по-взрослому».
Нажимайте Undo, пока добавленная грань не исчезнет.
Снова возьмитесь за Append to Polygon Tool и прощелкайте все ребра против часовой
Полигональное моделирование
299
стрелки. Причем последний «щёлк» надо сделать над правым верхним вертикальным ребром,
чтобы зеленая точка появилась в начале первого выбранного горизонтального ребра.
Нажмите Enter и убедитесь, включив Display Borders, что на сей раз грань «пришилась» к
поверхности без дырок.
Примечание. Еще раз напомню, что за один раз вы добавляете только одну грань,
поэтому не пытайтесь зашивать большие отверстия с рваными краями за один
раз. Даже если вам это удастся, грань наверняка будет «плохая»: неплоская, с
большим количеством вершин и с неправильным разбиением на треугольники.
Проще будет зашить ее последовательно за несколько шагов.
300
Книга Сергея Цыпцына
Редактирование полигональной геометрии.
Хит-парад методов и инструментов
Разобравшись с созданием поверхностей, поговорим о способах их редактирования. В этот
момент хочется сразу вывалить на читателя все операции и инструменты, доступные в меню
Polygons и Edit Polygons:
Create Polygon Tool
Append to Polygon Tool
Combine
Separate
Transfer
Booleans
Mirror Geometry
Mirror Cut
Smooth
Smooth Proxy
Unmirror Smooth Proxy
Poly Crease Tool
Poly Crease Tool Options
Average Vertices
Average Vertices Option Box
Triangulate
Quadrangulate
Cleanup
Reduce
Paint Reduce Weights Tool
Subdivide
Split Polygon Tool
Duplicate Edge Loop Tool
Split Edge Ring Tool
Extrude Face
Extrude Edge
Extrude Vertex
Chamfer Vertex
Bevel
Cut Faces Tool
Poke Faces
Wedge Faces
Merge Vertices
Merge Multiple Edges
Merge Edge Tool
Merge To Center
Split Vertex
Flip Triangle Edge
Collapse
Delete Vertex
Delete Edge
Duplicate Face
Extract
Make Hole Tool
Fill Hole
Sculpt Geometry Tool
Clipboard Actions
Selection
Colors
Normals
Move Component
Полигональное моделирование
301
Сразу хочу успокоить возбужденные умы. Из этого набора активно используются, наверное,
10 процентов инструментов, еще процентов 30 используются время от времени, а остальные
пункты меню подлежат использованию только в том случае, когда нужна специфическая операция,
которую вам лень делать руками много раз подряд. Например, такая экзотика как Merge to
Center.
Примечание, Список приведен для седьмой версии. В восьмой инструментов еще
больше.
Как я уже вполне цинично говорил, всё полигональное моделирование можно свести к
разрезанию (split) граней, добавлению новых вершин и перетаскиванию этих вершин в нужные
места (удаление не в счет). Все остальные операции просто автоматизируют этот процесс,
уменьшая количество щелчков мышью...
Например, для того, чтобы «снять фаску» с угла, вы можете использовать Split Polygon
Tool. Затем удалить новые грани. А потом зашить дыру с помощью Append to Polygon Tool.
Это дает вам полный контроль над процессом. Однако если таких фасок пара дюжин,
вам, возможно, захочется иметь кнопку «снять фаску». Немного поискав, вы ее найдете в виде
операции Chamfer Vertex, снимающей фаску со всех выделенных вершин.
В процессе поиска вы наверняка найдете еще пару полезных автоматизирующих операций:
например, вместо выделения и удаления граней и латания дыры, можно использовать сразу
Delete Vertex.
А зашивание дыры одним махом можно произвести с помощью Fill Hole.
302
Книга Сергея Цыпцына
№
Однако вы должны понимать: любая автоматизация процесса вносит элемент «риска»,
поскольку MAYA выполняет некоторые действия так, как ей хочется, а не так как ожидаете вы.
Например, сняв фаску со всех угловых вершин куба с помощью Chamfer Vertex, вы с
удивлением обнаружите, что новые ребра стали «мягкими», хотя вы об этом никого не просили и
даже в Option Box этой операции ничего по этому поводу нет. Просто MAYA »решила», что так будет
лучше!..
Чтобы вернуть ребрам жесткость, надо выполнить Edit Polygons=>Normals=>Set toFace, то
есть потратить время на контроль и исправления последствий автоматизации.
Я вовсе не отговариваю вас аскетично отказаться от всех инструментов кроме Split
Polygon Tool. Я предлагаю вам изучить базовый набор операций из нижеследующего хит-парада, а
остальные инструменты разыскивать по мере необходимости, когда уже нет сил снимать вручную
сотую фаску подряд.
Примечание. Так как в восьмой версии полигональные операции «разбежались»
по новым многочисленным меню, используйте операцию Help=>Find Menu, чтобы
найти нужный пункт по его точному названию.
Я опросил некоторое количество мастеров Полидзен, имеющих большой опыт
полимедитации, на предмет того, какие инструменты они используют чаще всего. Конечно,
это список субъективный да еще и усредненный, а кроме того, он имеет уклон в персонажное
моделирование. Поэтому заранее прошу прощения у игровых дизайнеров и архитекторов.
Хит-парад инструментов и операций моделирования
1. Абсолютное первенство в хит-параде инструментов принадлежит Split Polygon Tool. Это рабочий
мерин и «работник ножа и топора». С его помощью геометрия обогащается новыми вершинами в
нужных местах. Начиная с седьмой версии MAYA, этот инструмент дополнился «автоматическими»
версиями типа Duplicate Edge Loop Tool и Split Edge Ring Tool.
2. Далее идет уже описанный Create Polygon Tool, для тех кто моделирует «с нуля», а не из
кубика.
3. Следующее место однозначно у Extrude Face. Для моделирования неорганических конструкций
это - основной инструмент. Выдавливает новые грани в нужном месте, причем умеет выдавливать
их вдоль кривой. Многие мастера указали рядом и Extrude Edge, хотя эта операция порождает
иногда «нехорошую» геометрию (более двух граней из одного ребра).
4. Далее следует уже упомянутый Append to Polygon Tool.
5. Операция Merge Vertices условно удерживает пятое место и обязательно должна использоваться
всеми, кто следит на «чистотой» своей геометрии. Предназначена для слияния близкостоящих
или совпадающих вершин в одну вершину.
6. Delete Vertex и Delete Edge завершают хит-парад. Однако остается еще набор инструментов,
которые используются реже, или же это - субъективные фавориты у разных пользователей.
Перечислю их независимо от их положения в хит-параде.
Fill Hole - используется для лечения моделей с небольшими «ранениями». Обычно его
применяют те, кто ленится использовать Append to Polygon Tool. Автоматически заполняет дыры
одной гранью.
Cut Faces Tool - еще одна автоматизация Split Polygon Tool: режет выбранные участки с
помощью заданной плоскости, создавая новые ребра с местах разрезов.
Операция Bevel была отмечена большинством мастеров как часто используемая, но
однозначно ненадежная и требующая вмешательства. Однако хотя майские пользователи колются
и плачут, они продолжают использовать Bevel. Ведь необходимо избавляться от острых углов
на геометрии и снимать фаски вдоль ребер, чтобы придать поверхности реалистичный вид.
Полигональное моделирование
303
HMMi
Справедливости ради следует признать, что эта операция от версии к версии становится все же,
лучше.
Sculp Geometry Tool часто используется некоторыми школами Полидзен, но с негодованием
отвергается другими, более ортодоксальными. Возможность красить поверхность может
восприниматься как «хаотический» инструмент, особенно в низкополигональном моделировании,
где каждая вершина на счету. Однако он незаменим при разглаживании и распутывании плотных
сеток, а также для изготовления рельефов, ландшафтов и других «неточных» поверхностей.
Я поражен, что никто из просветленных полимастеров не упомянул такую удобную операцию,
как Move Component. Она спрятана в самом низу меню Edit Polygons и до нее, очевидно, просто не
доходят руки и глаза. Пример того, как неудачное место под солнцем влияет на популярность. В
восьмой версии ее переименовали в Transform Component и спрятали в середину меню Edit Mesh
Заметьте, что я намеренно не поместил в хит-парад такие операции, как Smooth или Combine. Они
не являются средствами редактирования геометрии, а представляют собой сугубо технические
операции. Так же, как и операции для работы с нормалями.
Про «технические» операции типа Combine, Separate, Smooth, Subdivide, Triangulate,
Cleanup речь пойдет ниже в соответствующих разделах.
А сейчас разберем участников хит-парада более подробно.
Примечание. Никто не упомянул в качестве рабочего инструмента Booleans.
Этот инструмент признан мировой общественностью идеологически вредным и
порождающим огромное количество «грязи» и «косяков». Полученная в результате
его использования геометрия нуждается в тщательном анализе нормалей и чистке
вершин. В настоящее время этот инструмент занесен в международный черный
список, запрещен к применению в цивилизованных странах, а потому в этой книге
обсуждаться не будет.
Split Polygon Tool
Коль скоро в названии инструмента есть слово Tool, следует быть готовым неистово
щелкать мышкой и в конце нажимать Enter. Главное условие при использовании Split Polygon Tool:
первый и последний «клик» должен быть на ребре, иначе MAYA не сможет завершить разрезание.
За время своего существования инструмент оброс всякими полезностями.
Чтобы не выбирать инструмент заново, после завершения очередного «сплита» не надо
нажимать Enter. Щелкните правой кнопкой мыши в любом месте, это начнет новый Сплит, и вы
останетесь в контексте инструмента.
Во время прокладывания новых ребер вдоль грани направление последнего ребра
отображается пунктирной серой линией, чтобы было легче ставить очередную точку.
304
Книга Сергея Цыпцына
Если вы привыкли, что курсор прилипает к ребрам, для вас, возможно, будет открытием,
что это можно отключить: достаточно зайти в настройки инструмента и выключить галку Snap to
Edge.
А вот галку Snap to Marnets снимать не стоит, она задает прилипание к невидимым
магнитикам, расставленным вдоль ребер.
Magnet Tolerance отвечает за силу «прилипания» инструмента к этим магнитикам. Попробуйте
сами: выставьте значение Magnet Tolerance=100, возьмите инструмент, подведите курсор к ребру,
которое хотите разрезать и нажмите левую кнопку мыши, но не торопитесь отпускать. Подвигайте
мышь вдоль ребра и почувствуйте, как курсор инструмента будет проскакивать промежутки между
невидимыми магнитами. Размеры промежутков на ребре будут одинаковыми. Возникает вопрос: на
сколько частей будет размечено ребро, если значение Number Of Magnets будет равно, например,
4? Верно, 5 частей. Это как в загадке про бревно и 10 распилов. По умолчанию курсор прилипает
только к середине ребра, так как Number Of Magnets=1.
Subdivision - число участков (дополнительных вершин) на появившемся ребре в результате
работы инструмента.
Вы также можете заранее настроить «мягкость» вставляемого ребра, задав значение
Smoothing Angle. По умолчанию ребро жесткое, то есть вершинные нормали совпадают с нормалями
для граней. Заметить это вы сможете, только если будете сечь неплоскую грань.
Вы должны также понимать, что инструмент не сможет проложить путь, «перепрыгнув»
через соседнюю грань, то есть вы должны щелкать по ребру только той грани, на которой
поставлена предыдущая точка.
Примечание. В восьмой версии Split Polygon Tool может проложить кратчайший
путь, «перепрыгнув» через соседнюю грань
Полигональное моделирование
305
Все стандартные клавиши работают в этом инструменте: Backspace и Delete для удаления
последней точки, Insert для редактирования позиции последней точки. Undo как положено, не
работает, пока вы не выйдете из инструмента.
Удивительно, но у Split Polygon Tool есть история моделирования. В Attribute Editor вы
можете разыскать ноду polySplit и скорректировать параметры уже сделанного сплита. Для точек
на ребрах можно поменять их положение на этих ребрах, для точек внутри граней можно поменять
их мировые координаты. И даже их анимировать.
В дополнение к этому инструменту - королю моделирования, в седьмой версии MAYA
появились еще два царских инструмента - словно в ответ на молитвы майских пользователей, у
которых идет носом кровь от остервенелого кликания по ребрам...
Один - это Split Edge Ring Tool, который позволяет вставить «изопарму» между параллельными
линиями из ребер. Достаточно щелкнуть над нужным ребром и потащить мышь вдоль ребра
А второй - Duplicate Edge Loop Tool - позволяет скопировать «изопарму» из ребер. Достаточно
306
Книга Сергея Цыпцына
щелкнуть над нужным ребром и потащить мышь вдоль ребра.
Extrude Face - мечта космических авиаконструкторов.
Эта операция позволяет «выдавить» выделенную грань (или грани) в нужном направлении.
Большинство интернет-уроков по изготовлению космических кораблей основано на применении
этой операции, которая является действительно незаменимой. У нее есть только один недостаток:
она портит текстурные координаты. В результате ее работы появляются новые грани, на которых
текстурные координаты «сплющены» в отрезки, вместо прямоугольников.
В результате применения этой операции в выбранным граням появляется универсальный
манипулятор, позволяющий не только «выдвигать» грани, но также вращать или масштабировать
их. Голубой переключатель на манипуляторе позволяет передвигать грань не только в локальных
координатах, но и в мировых, что бывает очень удобно при симметричном экструдировании двух
граней.
Полигональное моделирование
307
Если экструдировать несколько соседних граней, можно увидеть, что они «разъезжаются».
Самый быстрый способ исправить это «на ходу» - ринуться в Channel Box или Attribute Editor и
включить там в атрибутах ноды polyExtrudeFace галку Keep Face Together=On, после чего можно
продолжать редактирование.
Однако если вам надоест каждый раз включать эту галку вручную, вы как опытный
пользователь наверняка залезете в Option Box операции Extrude Face и не обнаружите там ничего,
относящегося к удержанию граней вместе!
Оказывается это не локальная, а глобальная галка, распространяющаяся не только на
экструдирование, но и на все остальные операции, работающие с гранями. Чтобы ее включить,
надо выполнить Polygon=>Tool Options=>Keep Faces Together.
У ноды polyExtrudeFace есть масса полезных атрибутов, в частности Divisions, позволяющий
задать число разбиений вдоль направления «выдвигания», а также Random, добавляющий
случайные смещения в процесс экструдирования.
308
Книга Сергея Цыпцына
Также можно заметить, что в Attribute Editor есть раздел Poly Extrude Curve Attributes.
Пытливых умов это может навести на мысль, что можно экструдировать грани не только в
фиксированном направлении, но и вдоль кривой.
Действительно, если, выбрав грань, выбрать дополнительно еще и кривую, то эта грань
выдавится вдоль кривой.
Проделайте микро-упражнение.
Создайте поликуб.
Возьмите в руки инструмент рисования кривых Create=>CV Curve Tool.
Прежде, чем ставить первую точку, нажмите правую кнопку мыши над кубом и выберите
компоненты Faces.
Затем нажмите и держите клавишу «v», чтобы включить привязку к точкам.
Щелкните по центру грани, чтобы первая точка кривой «приснапилась» к этому центру.
Достройте кривую до любой формы.
Теперь выберите грань, из которой начинается кривая, а затем дополнительно выберите
кривую (возможно, вам поможет Outliner).
Полигональное моделирование
309
Ш.ШШ
Выполните операцию Extrude Face с параметрами по умолчанию. Вы увидите, что грань
«уехала» в направлении конца кривой.
| View Shading Lighting Show Panels I
Примечание. После операции Extrude Face MAYA ненавязчиво переключается в
компонентный режим. Помните об этом, когда у вас возникнут проблемы с
выбором объектов. Не забывайте про F8.
Разыщите в Attribute Editor ноду polyExtrudeFace и установите тем Divisions=5, чтобы
увеличить «гибкость» экструда.
Откройте раздел Poly Extrude Curve Attributes и поиграйте с атрибутами Taper и Taper Curve.
Сделайте сужение выдавливания к концу кривой.
310
Книга Сергея Цыпцына
Несколько технических замечаний по поводу экструдирования вдоль кривой.
Очевидно, что неравномерность поперечных сечений вдоль кривой определяется
топологией самой кривой. Вы можете либо использовать этот факт, либо, если хотите добиться
равномерности, можете перестроить кривую уже после экструдирования с помощью операции
Rebuild Curve и включения опции Keep=NumSpans. Иначе говоря, вы можете делать с кривой, что
хотите, уже после построения экструда.
Как вы понимаете, MAYA расставляет поперечные сечения вдоль кривой автоматически,
поэтому не советую увлекаться выдавливанием вдоль кривой в случае органического моделирования
всяких конечностей. Для хвостов и рогов это, конечно, удобно, однако если вы делаете лапу
Джульбарса, то должны думать об анатомии этой лапы и располагать вершины там, где того
требует анатомия, а не там, где MAYA автоматически их расставит.
Extrude Edge - операция для ленивых
Если выбрать не грань, а ребро, его точно так же можно выдавить в нужном направлении,
пользуясь операцией Extrude Edge. Все манипуляторы и даже экструдирование вдоль кривой
полностью аналогичны «старшему брату», описанному выше. Необходимо, однако, помнить про
технику безопасности.
Дело в том, что операция Extrude Edge часто используется ленивыми мастерами Полидзен
на граничных ребрах, чтобы наращивать края поверхности в нужном направлении. Инструмент
Append to Polygon Tool позволяет делать тоже самое, однако требует большего количества щелчков
и не имеет таких удобных манипуляторов.
Однако если вы будете экструдировать ребро, не находящееся на краю поверхности, то
получите «плохую» геометрию, то есть три грани, торчащие из одного ребра.
О плохой геометрии, я еще выскажусь, а сейчас можете взять любое ребро куба,
экструдировать его с помощью Extrude Edge и потом выполнить конвертацию полученной геометрии
в сабдивы: Modify=>Convert=>Polygons to Subdiv.
Полигональное моделирование
311
ниш.
MAYA немедленно многоэтажно выругается в несколько строк:
// Error: line 2: polyToSubdivl (Poly То Subdiv Node): One or more edges is nonmanifold.
// Nonmanifold geometry cannot be converted to a subdivision surface.
//To clean up nonmanifold edges, use Polygons->Cleanup with the nonmanifold option. //
// Error: line 2: Command polyToSubdiv failed. Open Script Editor for details. //
Nonmanifold проще всего перевести как «необтягивающая» поверхность. В самом деле,
полученная поверхность «ветвится» в районе выдавленного ребра и перестает быть тонкой
«мембраной».
Возможно, для архитектурной визуализации такая «нехорошая» геометрия не доставит
хлопот, однако для персонажной анимации, живущей на сглаживании поверхностей, она будет
источником проблем. Поэтому я советую использовать эту операцию только на граничных
ребрах.
Обдуманное убийство: Delete Vertex и Delete Edge
Выбранные грани можно без проблем удалять клавишей Delete. А вот с ребрами и
вершинами такой трюк проходит далеко не всегда.
Если из вершины торчат не два ребра, а больше, такую вершину нельзя удалить клавишей
Delete. А два ребра торчат, как правило, из вершин, в которых сходятся два края поверхности,
такие вершины называеются «winged» (и, соответственно, все остальные вершины являются «non-
winged»).
Чтобы гарантированно удалить любую вершину, нужно использовать операцию Delete
Vertex. При этом MAYA удалит и вершину и все прилегающие к ней ребра. Соответственно, все грани,
прилегавшие к вершине будут заменены на одну «большую» грань. Будьте внимательны, эта
грань в большинстве случаев будет неплоской, а количество ее вершин будет наверняка больше
четырех. Никакого разбиения этой грани MAYA не производит.
312
Книга Сергея Цыпцына
С ребрами все немного сложнее. Вы в принципе не можете удалить ребро на границе
поверхности. Ни клавишей Delete, ни операцией Delete Edge. В этом случае вы можете только
удалить вершины на границе поверхности.
Внутри поверхности можно удалять ребра двумя способами.
Клавиша Delete просто удалит ребро и оставит на месте вершины на концах ребра. Все
грани, прилегавшие к ребру будут заменены на одну «большую» грань
Операция Delete Edge удалит ребро и вместе с ним вершины на его концах.
Имейте в виду, что удаление ребер клавишей Delete порождает «висячие» вершины и
неплоские грани.
Латание дыр: Fill Hole
Как я уже говорил, наиболее ленивые мастера Полидзен при зашивании дыр в геометрии
избегают использования Appent to Polygon Tool, поскольку ищут себе всякие удовольствия, типа
операции Fill Hole.
Полигональное моделирование 313
Эта операция работает только с замкнутыми граничными ребрами. Достаточно выбрать
всего одно граничное ребро и выполнить операцию, MAYA натянет на зияющую дыру одну грань.
Помните про ее топологию и количество вершин.
Если вы выберете объект целиком, MAYA попытается залатать все дыры (замкнутые границы)
на объекте.
Совет. Перед выполнением операции удобно включить отображение граничных
ребер более жирными линиями (Display=>Polygon Components=>Border Edges).
Чаще всего дыры в геометрии появляются при импорте моделей из других трехмерных
пакетов или систем проектирования. Отсканированная трехмерным сканером геометрия тоже
содержит, как правило, много мелких дырок.
Разрезание плоскостью: Cut Faces Tool
Этот инструмент появился в MAYA благодаря многочисленным просьбам трудящихся. Его
можно назвать хорошо работающей булевской операцией с участием одной плоскости.
Идея проста: задается плоскость (либо интерактивно, либо с помощью координат), и там,
где эта плоскость пересекается с объектом, либо возникают новые ребра, либо объект режется на
несколько частей.
Сделайте микро-упражнение.
Создайте политор.
Возьмите в руки Edit Polygons=>Cut Faces=>Tool. По умолчанию, он работает в интерактивном
режиме, поэтому если нажать на левую кнопку мыши, появится интерактивный манипулятор,
представляющий собой «рассекающую» плоскость.
314
Книга Сергея Цыпцына
Наведя курсов в нужное место, отпустите мышь. На торе появятся новые ребра в местах
пересечения плоскости и поверхности.
Хочу заметить, что никакого «разрезания» не произошло, просто появились новые ребра.
В этом смысле, можно рассматривать Cut Faces Tool как удобную вариацию Split Polygon Tool.
Если же вы хотите действительно разрезать поверхность на две (или более) части, надо
включить галку Extract Faces. Это можно сделать либо в Option Box инструмента, либо, что проще,
в истории объекта в Attribute Editor, в атрибутах ноды polyCut. Атрибуты Extract Offset задают, на
сколько «отрезанная» часть отодвигается от исходной геометрии.
Полигональное моделирование
315
Одну из половин можно удалить, включив галку Delete Faces.
Очевидно, что положение плоскости можно менять, изменяя атрибуты Cut Plane Center/
Rotate. Однако вы можете делать это интерактивно и после завершения работы с инструментом.
Для этого выделите в Channel Box ноду polyCut, а затем выберите в панели инструментов
Show Manipulator Tool. Появится манипулятор плоскости, с которым вы можете делать все, что
хотите.
Несколько практических замечаний по поводу этого инструмента. Конечно, наиболее
адекватно использовать интерактивный режим Cut Faces Tool в камерах ортогональных
проекций, а не в перспективе.
Во время интерактивного выбора плоскости можно нажать Shift. Тогда секущая плоскость
будет располагаться либо вертикально, либо горизонтально, либо под углом 45 градусов.
Разрезанные половины принадлежат по-прежнему одной геометрии, и, чтобы их превратить
в разные объекты, надо воспользоваться операцией Polygons=>Separate.
Одно из применений Cut Faces Tool состоит в подготовке модели к «отзеркаливанию». Если
вы вдруг решили, что все-таки проще будет смоделировать одну половину поверхности, а потом
ее склеить, то уже имеющуюся «целую» поверхность можно разрезать именно с помощью Cut
Faces Tool. В Option Box этого инструмента имеется заготовленный набор координатных плоскостей,
для облегчения этого процесса.
Фаски-шоу: Bevel и Chamfer
Как уже неоднократно указывалось, в этой и в других книгах, природа не терпит острых
углов. Если оглядеться вокруг, можно заметить, что углы практически всех поверхностей немного
(или изрядно) «притуплены»: иначе мы бы все ходили в порезах. Однако модели начинающих
трехмерных пользователей, как правило, кишат острыми, как бритва, углами. При освещении и
просчете таких моделей получаются резкие, без всяких переходов, границы цвета и света, что
воспринимается глазом как крайне некомфортное явление.
Соответственно, одно из правил моделирования состоит в том, что необходимо сглаживать
острые углы и снимать фаски.
Иногда это можно сделать с помощью вершинных нормалей, задав нужную «мягкость»
ребер. Однако часто нужно сделать реальное сглаживание углов - добавляя дополнительные
ребра.
Вот тут на помощь приходит «хищная» операция Bevel. Сразу оговорюсь, что некоторые
школы Полидзен, сетуя на, мягко говоря, «неидеальность» этой операции, запрещают своим
адептам ее использовать... Это, правда, лишь подтверждает тезис о том, что в принципе можно
применять только Split Polygon Tool и перетаскивать вершины. Однако в случае большого количества
316
Книга Сергея Цыпцына
острых сопряжений быстрее будет применить эту операцию, чтобы вычистить полученные косяки.
Тем более, что в седьмой версии Bevel был в очередной раз хорошенько переработан.
Потрогаем курсором этого монстра.
Создайте поликуб. Наедьте на него.
Выделите все вертикальные ребра.
Выполните Edit Polygons=>Bevel с параметрами по умолчанию. Очевидно, что параметры
этой операции будет проще настроить потом, в истории объекта. Куб превратится практически в
цилиндр.
Откройте Attribute Editor (или Channel Box) и разыщите ноду polyBevel. Задайте для нее
Offset=0.2 (Пока включена галка Offset as Fraction, атрибут Offset будет изменяться от нуля до
единицы, как часть длины ребра).
Задайте Segments=3, это добавит дополнительные ребра для закругления угла.
В принципе, MAYA сама вычисляет радиус и форму скругления, однако если вы хотите задавать эту
форму сами, надо выключить галку Autofit и покрутить атрибут Roundness. Оказывается, можно
задавать не только выпуклые скругления, но и вогнутые «бороздки», а диапазон атрибута
Roundness не ограничен значениями 0.5.
Обратите внимание на лишнее ребро на верхней грани куба (особенно «лишнее»
отрицательных Roundness). Это пример излишней интеллектуальности операции Bevel.
при
Полигональное моделирование
317
Возможно, вам захочется его удалить, но вы можете сделать это позже.
Поэкпериментируем еще.
Возможно, вы захотите снять фаску с верхних ребер, но уже с меньшим радиусом.
Выберите пять верхних горизонтальных ребер, примыкающих к ближайшему сглаженному
углу (если не лень, выберите все верхние горизонтальные ребра).
Снова выполните операцию Bevel.
Задайте для новой ноды polyBevel2 значение Segments=3. Обратите внимание, что «лишняя»
грань от первой фаски стала совсем бесполезной. Особенно при значениях Offset, больших 0.5.
Отключите Auto Fit и верните Offset в 0.5.
Две «хищные» особенности Bevel заключаются в следующем.
Во-первых, он довольно своеобразно работает с историей. Это, в принципе, понятно: ведь
в ходе сглаживания появляются новые ребра, а старые исчезают. Нумерация вершин меняется
и т.д. Попробуйте, например, выбрать верхнюю грань и приподнять ее. Если вы избалованы
318
Книга Сергея Цыпцына
сплайновым моделированием, вы будете ожидать перестройки всех скруглений, однако ваши
ожидания будут жестоко обмануты. (Хотя после некоторых усилий можно разыскать в Hypergraph
оригинальную поверхность до скругления, но об этом позже, в разделе про историю полигонального
моделирования).
Или попробуйте для ноды polyBevell изменить атрибут Segments, отвечающий за первый
вертикальный Bevel. Очевидно, что если вы меняете атрибуты первого Bevel, нумерация пяти
ребер, выбранных для второго скругления, полностью изменится, и вы получите не очень
предсказуемый результат.
Во-вторых, операция Bevel превращает в руины ваш трогательно настроенный UV-маппинг.
Причем не только на новых гранях, но и на старых.
Полигональное моделирование
319
Поэтому отложите настройку текстурных координат до того момента, как разделаетесь с
последним Bevel'oM.
И еще один практический момент по поводу сглаживания углов.
Создайте платоническое тело: Create=>Polygon Primitives=>Platonic Solids.
В истории, в атрибутах ноды polyPlatonicSolid, задайте Solid Type=lcosahedron.
Выберите любые три ребра, примыкающие к одной вершине, и выполните Bevel.
Задайте Offset=0.2.
Теперь пошевелите атрибут Segments. Задайте его равным трем. Полюбуйтесь на уголок.
320
Книга Сергея Цыпцына
Отключите Auto Fit. Это поможет, но форма торца, точнее его разбиение на грани, будет
совершенно непредсказуеммым, особенно не в таких симметричных случаях, как этот.
Выключите галку Subdivide Ngons, чтобы MAYA перестала разбивать торцевую грань на
более мелкие грани.
Теперь вы можете разрезать торец на грани так, как вам захочется, с помощью Split Polygon
Tool. Конечно, вся эта возня с разбиением и лишними ребрами имеет смысл, когда у вас каждая
низкополигональная грань на счету или вы имеете дело с крупными планами. На это также стоит
обращать внимание, если поверхность будет в дальнейшем анимироваться и деформироваться: в
этом случае плохо разбитые углы могут неожиданно «вылезти». В остальных случаях можете не
обращать внимание на все эти глюки - экономьте свое время.
Примечание. Атрибут Smoothing Angle влияет только на вершинные нормали
создаваемых ребер, делая их жесткими или мягкими, в зависимости от угла
между новыми гранями. А вот атрибут Angle Tolerance трогать вообще не надо,
по крайней мере пользователям седьмой версии. Если не верите, загляните в
документацию к ноде polyBevel.
Я не советую использовать опцию Merge Vertices, встроенную в Bevel. /1учше потом
спокойно применить операцию слияния вершин Edit Polygons=>Merge Vertices, в тех местах, где
это необходимо. Об этой операции речь пойдет немного ниже.
Для того, чтобы снять фаску не с ребра, а с вершины, используйте операцию Chamfer Vertex.
Полигональное моделирование
321
Обратите внимание, что Chamfer Vertex - это «ненастоящая» операция!
Если вы откроете Attribute Editor после выполнения Chamfer Vertex, то обнаружите там
две ноды вместо одной: Delete Components и Extrude Vertex. Несмотря на то, что одна из закладок
называется polyChamferl, тип ноды, в ней отображаемой, это Extrude Vertex!
Поиграв с атрибутом nodeState для ноды Delete Components, можно выяснить, что MAYA
сначала экструдирует вершину, а потом удаляет ненужные грани.
Примечание. Более пытливые умы могут сложить операцию Chamfer Vertex на
полку у затем перетащить ее с полки в Script Editor и увидеть, что команда poly-
ChamferVtx является простым скриптом, который можно почитать на досуге. Для
этого достаточно выполнить команду whatls polyChamferVtx.
Sculp Geometry Tool
Если вы не занимаетесь экстремально низкополигональным моделирование, советую
обратить внимание на этот инструмент. Его техническое описание дано в главе про сплайны,
сейчас я ограничусь лишь некоторыми замечаниями.
Если вам не очень важна анатомичность модели, можете набросать низгополигональную
болванку, сгладить ее при помощи операции Polygons=>Smooth и дальнейшую доводку сделать с
помощью Sculp Geometry Tool.
322
Книга Сергея Цыпцына
№
Примечание. В восьмой версии эти инструменты расположены в меню Mesh.
Не забывайте пользоваться параметром Opacity для того, чтобы ваши штрихи не были
слишком грубыми.
Этот инструмент незаменим при изготовлении рельефов. Тут может оказаться полезной
возможность импортирования карт изображений в качестве дисплеисмента, использующего
текущую операцию (Push или Pull).
Для удобства работы отключайте отображение сетки на поверхности. Для этого в настройках
инструмента в разделе Display выключите галку Show Wireframe
Операция Smooth в параметрах самого инструмента, кроме «усреднения» поверхности,
позволяет «распутывать» и «разглаживать» плохие сетки, не изменяя топологии поверхности.
Чтобы выбрать другой объект, не выходя из этого инструмента, пользуйтесь правой кнопкой
мыши и пунктом Select.
Если на поверхности есть история моделирования, этот инструмент может изрядно
подтормаживать. Не забывайте удалять историю, когда она вам больше не нужна.
Сам инструмент никакой истории не порождает.
Если предварительно выбрать вершины поверхности, воздействие кисточкой будет
производиться только на них.
И последнее: помните, что, раскрашивая поверхность, вы воздействуете только на
вершины, а не на саму поверхность.
Темная лошадка: Move Component
Очень часто пользователь, выбравший несколько граней, мечтает от таком же
манипуляторе, как и у Extrude Face. Оказывается есть такой манипулятор! Операция называется Edit
Polygons=>Move Components и, кроме манипулятора, обладает полной историей моделирования.
Попробуйте - классная вещь!
Примечание. В восьмой версии: Edit Mesh=>Transform Component.
Немного об экзотике
Далее я кратко опишу некоторые операции, чтобы удовлетворить ваше любопытство.
Возможно, вы найдете что-то интересное в этом списке, однако наверняка это будет очень
экзотический инструмент для очень специфического случая.
Полигональное моделирование
323
шл_у
Poke Face
Разбивает выбранную грани (или грани) так, чтобы в центре грани появилась новая
вершина, соединенная ребрами со старыми вершинами. Появляющийся манипулятор позволяет за
эту вершину дергать в нужном направлении.
Wedge Face
Если выбрать грань и ребро, ей принадлежащее, можно экструдировать эту грань,
одновременно вращая ее вокруг этого ребра. Угол вращения и количество сегментов задается в
истории. Довольно полезная для архитекторов мелочь.
Flip Triangle Edge
Если вам по долгу службы пришлось моделировать в треугольниках, вам может пригодиться
возможность повернуть общее ребро у двух граней так, чтобы оно соединило противолежащие
324
Книга Сергея Цыпцына
вершины. Для этого надо это ребро выбрать и применить операцию Flip Triangle Edge.
Collapse
Эта довольно опасная операция «схлопывает» выбранное ребро или грань в одну точку,
то есть вершину. Именно в одну, а не в набор вершин в одной точке. Наблюдается некоторая
«кривость» в ее работе. Ее можно заменить на ручное приснапливание вершин в нужное место и
на операцию Merge Vertices.
Технические операции
Пройдясь по «креативным» операциям, перейдем к чисто техническим инструментам.
Они носят сервисный характер и, как правило, производят какие-либо действия с поверхностью
целиком, например, сглаживание или чистку. С их помощью вы не добавляете детали и не
занимаетесь «художественным творчеством», а скорее следите за качеством модели или готовите
ее к анимации и просчету.
Combine и Separate. Разукрупнение
В отличие от сплайнов, полигональные поверхности могут состоять из несвязанных между
собой островов в пространстве, которые называются Shells (оболочки). В самом делеу коль скоро
Полигональное моделирование
325
полигональная геометрия - это набор пронумерованных вершин, то располагаться в пространстве
они могут, как угодно, а соединяющие их ребра вовсе не обязаны образовывать единую сетку.
Поэтому всегда можно взять две полигональные поверхности и объединить их в одну
сетку операцией Combine. Эта операция объединяет все вершины этих поверхностей в новую
поверхность, перенумеровывает их, не меняя формы, и даже создает ноду в истории. И больше
ничего.
Вы можете создать десять сфер, расставить их в пространстве, а потом «скомбайнить»
их операцией Combine, после чего все они превратятся в одну поверхность, то есть в единый
набор вершин, граней и ребер. Таскать эти сферы по отдельности вы сможете только выбрав их
вершины и передвигая эти вершины.
Технически говоря, у «скомбайненой» поверхности всегда будет одна нода типа mesh.
Будьте внимательны: операция Combine сохраняет историю, а следовательно, все исходные
поверхности внутри сцены. Если вы их не видите, это не значит, что их нет.
Скомбайнив две сферы, вы можете увидеть, что в Outliner появилась новая поверхность
polySurfacel, а старые «трансформы» pSpherel и pSphere2 остались на месте и вроде даже не
содержат ничего, кроме пустой группы transform.
Однако спрятанные группы transforml и transform2 на самом деле содержат в себе исходные
полигональные поверхности.
В этом можно убедиться выбрав их и открыв Attribute Editor.
Для оригинальных поверхностей установлен атрибут Intermediate Object (в разделе
Display для ноды mesh), это прячет их не только с экрана, но даже из Outliner'a.
326
Книга Сергея Цыпцына
Пытливые умы могут выключить эти галки, а заодно включить видимость групп transforml
и transform2 и увидеть на экране исходные поверхности.
Менее пытливые умы, напуганные таким углубленным изучением Combine, должны просто
запомнить две вещи:
1. Исходные поверхности никуда не исчезают и увеличивают объем сцены.
2. Необходимо удалять историю после операции Combine.
Примечание. Для сплайновых поверхностей тоже можно осуществить своеобразный
«комбайн», выбрав shape одного объекта, затем transform другого и выполнив MEL-
команду «parent -add -s». Однако надо понимать, что контрольные вершины будут
находиться в разных нодах nurbsSurface и что единой будет только нода
transform.
Операция Separate делает обратную операцию. Она проверяет, а не является ли выбранная
поверхность состоящей их нескольких несвязанных кусков (оболочек), и если состоит, то
превращает каждый кусок в отдельную поверхность. Если поверхность является одним связным
куском, то при попытке выполнить операцию выдается совершенно закономерное сообщение
именно об этом:
Error: line 1: polySurface2 has only one piece. Ignored.
Исходная поверхность не удаляется, а глубоко прячется для сохранения истории, как и в
случае с Combine. Так что будьте внимательны: не забывайте удалять историю.
Еще раз повторю: эта операция работает только объектами целиком. Если же вы хотите выбрать
только часть граней и превратить их в новую поверхность, то для этого существуют нижеописанные
операции.
Extract и Duplicate Faces
Выбрав часть поверхности в виде граней, можно «отодрать» их от исходной геометрии и
превратить в новую поверхность. Достаточно выбрать грани и выполнить операцию Extract.
Возникнет манипулятор, позволяющий эти «выдранные» грани сразу куда-нибудь передвинуть.
Причем если вы будете передвигать эти грани в локальном режиме, они будут увеличиваться
в размерах, пропорционально расстоянию от исходной поверхности. Если вы хотите просто их
«отодвинуть», переключитесь в глобальные координаты, нажав голубой переключатель на
манипуляторе.
Полигональное моделирование
327
Заглянув в историю, можно увидеть ноду polyChipOff и атрибуты, напоминающие ноду Ех-
tude Face.
Если у вас выключена опция Keep Face Together в меню Polygons=>Tool Settings, отодранные
грани не будут соединены между собой.
Примечание, В восьмой версии опция Keep Face Together располагается первым
пунктом в меню Edit Mesh.
Очевидно, что галка Keep Face Together в атрибутах ноды PolyChipOff будет удерживать
«отодранные» грани вместе, однако это требует дополнительных комментариев.
Заглянув в Outliner, вы сможете увидеть, что количество объектов в исходной группе резко
увеличилось, как раз на количество «отодранных» граней. Однако, пощелкав по ним мышкой вы
можете убедиться, что большинство из них - пустые.
Отключив галку Keep Face Together, вы можете увидеть, что каждая грань превращается
в отдельный объект. Таким образом, эта галка не только удерживает все грани вместе, но и
«комбайнит» их в одну геометрию.
Откуда же тогда взялось это разбиение на объекты в Outliner'e? Ведь логично было бы
иметь две результирующих поверхности и делать с ними все, что хочется.
Ответ кроется в двух местах: в установках Polygons=>Tool Settings (Edit Mesh=> Keep Face
Together для восьмой версии) и в Option Box операции Extract.
Там есть, наверху, включенная по умолчанию галка Separate Extracted Faces, определяющая,
что если опция Polygons=>Tool Settings=>Keep Face Together (Edit Mesh=> Keep Face Together для
восьмой версии) выключена, каждая отодранная грань, будет превращаться в отдельный объект.
Отсюда и размножение объектов в Outliner'e.
Если же опция Polygons=>Tool Settings=>Keep Face Together (Edit Mesh=> Keep Face
Together для восьмой версии) глобально включена, действие галки Separate Extracted Faces просто
игнорируется, и в Outliner появляются только два объекта. Даже если после этого вы выключите
328
Книга Сергея Цыпцына
галку Keep Face Together в атрибутах ноды polyChipOff, несоединенные грани все равно будут
принадлежать одной поверхности.
Итак, если вы, например, хотите, превратить каждую грань поверхности в отдельный объект
(готовитесь, к примеру, разорвать его динамикой на осколки), надо прежде всего выключить
глобальную опцию Polygons=>Tool Settings=>Keep Face Together и в Option Box операции Extract
включить галку Separate Extracted Faces.
Если же вы хотите просто отодрать выделенные грани в виде одной новой поверхности,
включите глобально опцию Polygons=>Tool Settings=>Keep Face Together и в Option Box операции
Extract выключите галку Separate Extracted Faces.
Примечание. Если будете пилить поверхность на куски или осколки вручную,
очень удобно делать это с помощью Paint Selection Tool, раскрашивая участки как
выделенные грани и применяя к ним операцию Extract с выключенной галкой
Separate Extracted Faces. Не забывая, при этом, удалять историю.
В атрибутах ноды PolyChipOff можно также заметить галку Duplicate. Если ее включить,
дырка на месте «выдранных» граней тут же исчезает, то есть операция Extract просто превращается
в операцию Duplicate Face. Действительно, Option Box у этих операций идентичный и возникающая
нода в истории моделирования одна и та же: polyChipOff.
Полигональное моделирование
329
Таким образом, с помощью Duplicate Face вы можете дублировать часть поверхности.
Слияние вершин и ребер: Merge Vertices
Проделайте мысленно такой эксперимент.
Допустим, у вас есть две зеркальные половинки сферы (лица, морды). Вы приставляете
их вплотную друг к другу и выполняете операцию Combine. АЛАУА делает одну поверхность из
двух половинок. При этом непонятно, а что происходит с теми вершинами на границе половинок,
которые в момент «сшивания» находятся в одном месте? Ответ: ничего. На «скомбаиненои» сфере
вы получите несколько «слипшихся» двойных вершин.
«Ну и что?», могут спросить неопытные умы. «Ведь поверхность выглядит отлично».
Да, это так, но до тех пор, пока вы, например, не начнете ее деформировать или гнуть
с помощью того же Sculp Geometry Tool. Более того, схватившись за слипнувшиеся вершины, вы
наверняка потянете только одну из них и быстро сделаете дыру.
Поэтому нужно постоянно отслеживать наличие «слипшихся» вершин и всячески с ними
бороться.
Визуально такие вершин никак не видны, пока вы не включите отображение граничных
ребер, ведь две пары слипшихся вершин соединяются двумя ребрами.
Совет. Включите отображение граничных ребер (Hi2hlight=Border Edges) постоянно
в Windows=>Settings/Preferences=>Preferences=>Polygons. Это позволит постоянно
отслеживать плохую геометрию.
Основной инструмент в борьбе с двойными вершинами - это операция Merge Vertices.
Проделайте микро-эксперимент.
Создайте политор.
Перейдите в вид сверху. Выделите на торе левую половину граней и удалите их.
Оставшуюся половину сдублируйте как объект. Разверните вокруг вертикали (rotateY=180)
и сдвиньте (translateZ=2).
330
Книга Сергея Цыпцына
Выберите обе половины и выполните Polygons=>Combine.
Удалите историю.
Включите отображение граничных ребер, если не сделали этого до сих пор. Отметьте, что
в области сшивания присутствует некий «шов».
Выделите щелчком и потащите на какую-нибудь вершину. Пронаблюдайте дыру и нажмите Undo.
Полигональное моделирование 331
Теперь выделите либо все слипшиеся вершины, либо, лучше даже, весь объект целиком.
Выполните Edit Polygons=>Merge Vertices.
Шов исчезнет. Двойные вершины «слились» в «обычные одинарные». Надо понимать при
этом, что количество вершин и их нумерация на поверхности изменилась.
Откройте Attribute Editor и найдите закладку polyMergeVert. Там находится единственный
значимый атрибут Distance, который вроде как равен нулю. Однако это профанация: на самом
деле, значение этого атрибута равно 0.0001. Если не верите, выполните команду
getAttr polyMergeVertl.d
Ведь если открыть Option Box операции Merge Vertices, там можно увидеть параметр
Distance, равный 0.0001. Этот параметр (равно как и атрибут Distance ноды polyMergeVert) задает, что
если расстояние между вершинами меньше этого значения, вершины надо «слить» в одну.
Поле атрибута Distanse в Attribute Editor не в состоянии отображать такие маленькие числа,
поэтому мы видим нулевое значение.
Будьте внимательны! Если вы случайно введете Distance=0.000, то MAYA не будет сливать
вершины, даже если они располагаются точно в одних и тех же местах!
Имейте также в виду: у этой операции есть также «защита от дурака». Если вы выбрали
весь объект и выполнив операцию Merge Vertices, задали значение Distance довольно большим,
MAYA не будет проводить слияние вершин, ругаясь при этом, что ей придется слить все вершины
в одну и геометрия будет разрушена:
// Warning: polyMergeVert 1 (Poly Merge Vert Node): No vertices were merged. Tolerance too large - no
geometry left after merge //
Однако, если перед выполнением операции вы будет выбирать не объект, а только
вершины, такой проверки не будет, и при больших значениях Distance начнут сливаться не только
слипшиеся, но и вполне нормальные соседние вершины.
332
Книга Сергея Цыпцына
Операция Merge Vertices - основной борец за чистоту геометрии. Не забывайте проверять
свои поверхности перед тем, как отдать их в анимацию или на текстурирование.
Операция Split Vertex производит прямо противоположное действие. Она «раскалывает»
выбранную вершину на несколько вершин. Точнее говоря, для каждого примыкаюшего к выбранной
вершине ребра создается своя вершина, и эти ребра становятся граничными ребрами.
Слияние ребер: Merge Multiple Edges и Merge Edge Tool.
В дополнение к слиянию вершин существуют еще два способа сшивать вершины, и они
предназначены специально для граничных ребер.
Вместо вершин, на границе поверхности можно выбрать ребра и применить к ним операцию
Merge Multiple Edges.
После этого в Attribute Editor можно настроить дистанцию между ребрами, внутри которой
они будут сшиваться. За это отвечает атрибут Threshold ноды polySewEdge.
Полигональное моделирование
333
Для более интерактивного сшивания предназначен инструмент Merge Edge Tool. С его
помощью надо сначала кликнуть по одному граничному ребру, после чего все доступные для
сшивания ребра будут подсвечены малиновым цветом.
Затем можно щелкнуть по нужному второму ребру. Для окончательного сшивания можно
традиционно нажать Enter, а можно использовать клавишу «у», чтобы сшить ребра, но остаться в
контексте инструмента и продолжить процесс попарного сшивания.
334
Книга Сергея Цыпцына
В настройках инструмента Merge Edge Tool можно задать, к какому из двух выбранных ребер
будут притягиваться шов, так как по умолчанию он располагается посередине между ними.
Операции с ребрами чем-то напоминают операцию Stitch для сплайновых поверхностей, однако
следует помнить, что они работают с ребрами одной поверхности. Для того, чтобы сшивать края
двух объектов, их надо предварительно «скомбайнить».
Как показал социологический опрос мастеров Полидзен, те, кто привык сшивать вершины,
редко сшивают ребра.
Зеркальные отражения и симметричное моделирование: Mirror Geometry и Mirror Cut
Окружающая природа буквально кишит симметрией, поэтому для некоторой экономии
времени было бы неплохо смоделировать только половину персонажа (автомобиля, окна и пр.), а
потом зеркально отобразить его.
Если для «отзеркаливания» применить обычный трюк с отрицательным масштабом (scale=-
1), возникнет некоторое количество проблем.
Например, когда вы сделаете операцию Freeze Transform, у вас вывернутся нормали. При
сшивании половинок вам придется отслеживать направление нормалей. Кроме того, АЛАУА начнет
грязно играть с атрибутом opposite для ноды mesh, и т.д.
Для упрощения процесса отзеркаливания предназначена операция Mirror Geometry.
Она предоставляет полный сервис. Достаточно выделить объект, открыть Option Box и
выбрать направление, в котором нужно произвести симметричное копирование.
В отличие от обычного масштабирования операция Mirror Geometry работает вне
зависимости от положения пивота поверхности. Кроме того, она может работать в локальном
пространстве объекта и не требует его присутствия в начале координат. Она сама вычисляет центр
симметричного копирования и даже позволяет редактировать его позже с помощью истории.
Полигональное моделирование
335
Дополнительный сервис состоит в том, что операция автоматически комбайнит две
половины и может сшить вершины на граничных ребрах.
После «отзеркаливания» вы можете поменять направление и пивот симметрии и указать,
в каком диапазоне сшивать вершины или ребра.
Совсем продвинутое симметричное отражение можно сделать с помощью операции Mirror
Cut. Она представляет собой целый конструктор из промежуточных операций.
Сначала поверхность режется заданной плоскостью (mirrorCutPlane) в любом месте под
любым углом, и отрезанная часть отбрасывается. Затем остаток симметрично зеркалируется
относительно секущей плоскости. Две половины комбайнятся, а вершины сшиваются.
С точки зрения персонажной анимации эта операция представляется слишком уж
изощренной, если не сказать пугающей. Того же результата можно добиться вручную. Однако
в архитектуре или дизайне этот конструктор может быть полезен для быстрой работы с углами,
симметричными арками, рамками и пр.
Загляните в историю объекта после выполнения операции, и вы найдете там целый ворох
нод и сборище атрибутов на все случаи жизни.
Симметричное моделирование
Как вы могли заметить, операция отзеркаливания геометрии вроде как не сохраняет
историю. То есть получившуюся форму можно редактировать целиком, а оригинальную половину
уже нигде не видно.
336
Книга Сергея Цыпцына
Однако было бы беспредельно удобно таскать вершины на одной половине модели и видеть
симметричные изменения на другой.
Для этого есть несколько способов. Разберем сначала не лучшие. Для понимания.
Прежде всего, почти все операции полигонального моделирования сохраняют историю и
оригинальные поверхности, только глубоко их прячут.
Если вернуться к Mirror Geometry, можно проделать следующий трюк.
Возьмите половину модели, например, сделайте половину тора или, если вам лень,
откройте файл 0.5.та.
Убейте историю на поверхности.
Примените к ней операцию Mirror Geometry. Если MAYA неправильно определяет пивот
симметрии, выставьте его вручную в Attribute Editor в атрибутах ноды polyMirror.
Выберите полученный симметричный объект и откройте Hypergraph.
Нажмите исследовательскую кнопку (Graph=>lnput and Output Connections).
В истории поверхности обнаружится «серая» нода polySurfaceShapel.
Именно она идет на вход операции polyMirrorl и должна содержать в себе исходную
поверхность.
Так и есть. Выберите эту ноду в Hypergraph.
Откройте Attribute Editor.
В закладке polySurfaceShapel откройте раздел Object Display и снимите галку Intermediate
Полигональное моделирование
337
Object, чтобы эта нода появилась не только на экране, но и в Outliner'e.
Действительно, на экране появится исходная половина.
Откройте Outliner, включите отображение Display=>Shapes.
Откройте объект pCube и найдите там две ноды типа mesh, включенные в один transform.
Теперь вам останется выбрать в Outliner «целую» симметричную поверхность
(pCubeShapel) и превратить ее в Template, выполнив Display=>Object Display=>Template.
Теперь, когда вы будете выбирать на экране и таскать вершины исходной половины,
симметричная модель будет также перестраиваться. История работает безупречно!
Есть, правда, некоторое количество неудобств.
Во-первых, у исходной половины почему-то нет материала, но это можно поправить, просто
выбрав ее в Outliner'e и назначив на нее уже имеющийся или новый материал Lambert.
338
Книга Сергея Цыпцына
Однако сделать закрашенной вторую половину модели вам вряд ли удастся без того, чтобы
не путаться при выборе вершин на обеих моделях.
Можно, конечно, повозившись с группами, растащить исходную и полученную поверхности
в пространстве, однако это будет совсем неудобно и ненаглядно.
Во-вторых, вы можете таскать вершины только на одной половине, однако хотелось бы не
зависеть от стороны и в любой момент таскать вершины на любой половине поверхности.
Поэтому, проверив, что история операции Mirror Geometry работает, как положено,
перейдем к другому способу.
Этот традиционный способ основан на инстансировании объектов, то есть дублирования их
с опцией Geometry Type=lnstance.
Откройте снова файл 0.5.та
Выберите половину и откройте Option Box операции Edit=>Duplicate.
Установите там Geometry Type=lnstance. А также scaleX=-1.
Нажмите Duplicate.
Напомню, что опция Geometry Type=lnstance, копирует только transform объекта (как бы
только его пивот), a shape объекта остается прежним, совпадающим с исходной поверхностью.
Полигональное моделирование
339
I1M.MA
Подробнее об этом написано в главе про изнанку MAYA.
Поэтому теперь, вы можете выбирать вершины с любой стороны модели. Это будут одни и
те же вершины, так как нода типа mesh (поверхность pCubeShapel) одна на два объекта. Просто
второй объект «показывает» эту ноду «вывернутой наизнанку», но от этого она не перестает быть
одной-единственной.
Вы можете усовершенствовать данный «сетап» для удобства работы.
Во-первых, можно объединить обе половины в группу, чтобы перемещать их одновременно,
а на исходных объектах заблокировать все атрибуты translate, rotate и scale.
Во-вторых, совсем взрослые мальчики могут сделать следующее, для того, чтобы избавиться
от шва посередине: скомбаинить обе половины и сшить вершины с помощью Merge Vertex. Потом
полученную поверхность засунуть в новый слой и сделать его как Reference,. Дальше в Outliner'e
и Attribute Editor'e разыскать исходную половину, скрытую после Combine, снять у нее галку
Intermediate Object и включить Visibility для transforml и transform2, назначив на них прозрачный
материал (Surface Shader) или отсоединив их вовсе от Shading Group. Можно также поколдовать с
группировками.
Результат такого колдовства можно увидеть в файле 0.5.mirror.та.
Однако, как быть остальным, не таким взрослым, мальчикам и девочкам? Кроме того,
каждый раз проделывать такие трюки может быть очень утомительно. Поэтому перейдем к
следующему «официальному» методу для симметричного моделирования.
Smooth Proxy как метод симметричного моделирования
Не касаясь до сих пор вопросов сглаживания поверхностей, я хотел бы остановиться на
применении операции Smooth Proxy, как метода для симметричного моделирования и автоматизации
колдовства, описанного двумя абзацами выше.
Примечание. В восьмой версии операции для работы с прокси-поверхностями
вынесены в отдельное меню Proxy, а операция Smooth Proxy переименована в сабди
eSubdiv Proxy)
Откройте снова файл 0.5.та.
340
Книга Сергея Цыпцына
Выберите половину и откройте Option Box операции Polygon=>Smooth Proxy (Proxy=>Subdiv
Proxy для восьмой версии).
Установите там значения по умолчанию и включите опцию симметричного копирования:
Mirror Behaviour=Full.
Выберите Mirror Direction=-X
Можете выбрать Smooth Proxy Shader = Keep, чтобы ничего не делать с материалами
поверхностей.
Нажмите кнопку Smooth.
Вы увидите симметричную форму, внутри которой находится какая-то новая поверхность,
что особенно хорошо видно в режиме Wireframe.
Эту поверхность для наших симметричных намерений совершенно не нужна, ее можно
выбрать и удалить или спрятать. А оставшуюся геометрию использовать, как было описано выше.
Она содержит две половины, одна из которых является инстансированной копией другой.
Полигональное моделирование
341
Ш_1!Ш
Отличие от ручного инстансирования состоит в том, что не нужно заботиться о том, где у
объекта находится пивот, относительно которого происходит отрицательное масштабирование и
совершенно не нужно располагать объект около начала координат.
Когда вы закончите симметричное редактирование, можете удалить одну половину, а
затем воспользоваться операцией Mirror Geometry.
Примечание. Можно не удалять сглаженную сетку, а просто спрятать ее. В этом
случае симметричного редактирования можно будет воспользоваться операцией
Unmirror Smooth Proxy, чтобы автоматически получить целую и сшитую модель.
После этого можно немного почистить Outliner, удалив там спрятанные исходные половины
удаленной сглаженной поверхности в виде объектов pCube2 и рСиЬеЗ.
Скользкие вопросы сглаживания
Одним из принципов моделирования является создание формы от простого к сложному.
Сначала делается некоторая болванка (в самом начале это может быть кубик), затем к ней
добавляются некоторые детали, там, где это необходимо - при этом пользователь, как правило,
экономит каждую вершину (если это достаточно искушенный пользователь).
Конечно, если модель сразу должна отправляться на просчет, минуя фазу анимации,
к ней предъявляются совершенно иные требования. В этом случае многие детали можно
просто проработать методом «грубой силы», не особенно заботясь о топологии. Преимущество
полигонов и сабдивов состоит в том, что детали можно добавлять локально, то есть только в те
места, где это необходимо. Новые алгоритмы и программы, использующие «кистевой» подход,
позволяют создавать удивительные высокодетальные модели даже на имеющемся, маломощном
оборудовании. К этим программам я еще вернусь, а если говорить о необходимости анимировать
и деформировать модель, то требования к топологии поверхности мгновенно становятся
жесткими, как уголовный кодекс. И наказания за ошибки, допущенные при моделировании, будут
беспощадными. Вот почему аниматоры и сетапщики, как правило - крайне нервные люди.
Поэтому в рамках традиционного подхода один из критериев качества модели - ее легкость.
А основная квалификация пользователя - способность, работая с грубой болванкой, распознавать
в ней конечную форму.
Кроме того, чем меньше количество вершин, тем легче контролировать пространственный
объем. Попробуйте что-нибудь сделать со сферой, состоящей из двадцати тысяч вершин. К вашим
услугам останутся только деформеры да кисточки, а все традиционные инструменты станут
«профнепригодными».
Итак, чтобы не только распознавать конечную форму в грубой болванке, но и создавать эту
конечную форму, существует операция Smooth. Она предназначена для сглаживания поверхности,
и ее можно представить, как напильник или грубую наждачную бумагу, которой вы проходитесь по
детали, чтобы придать ей более гладкую форму.
На пальцах можно описать процесс следующим образом: MAYA делит каждое ребро пополам,
а потом укорачивает полученные ребра, так чтобы сетка из ребер оставалась целой и «садилась»,
как после стирки. Впрочем, лучше один раз потрогать, чем десять раз прочитать...
Откройте универсальный файл 0.5.та.
Выберите объект и примените к нему операцию Smooth.
Поверхность сгладится один раз. Если вы хотите сгладить ее еще раз, для этого не надо
наваливать на нее повторно еще одну операцию Smooth: достаточно зайти в Attribute Editor и
там пошевелить атрибут Subdivision Levels, отвечающий за то, сколько раз последовательно
применяется операция сглаживания.
342
Книга Сергея Цыпцына
Атрибут Continuity отвечает за «усадку», то есть сглаживание поверхности. Вернув его в
ноль, вы получите просто исходную поверхность с разбитыми напополам ребрами.
Очевидно, что по умолчанию граничные ребра разбиваются, но не сглаживаются. Сняв галку Keep
Geometry Borders, можно сгладить и границы поверхности.
Если выбрать не всю поверхность, а только часть граней, MAYA по умолчанию рассматривает
границы выделения как границы поверхности и не сглаживает их, так как галка Keep Selection
Borders включена по умолчанию.
Полигональное моделирование
343
Галку Keep Tesselation следует оставить включенной, если вы собираетесь деформировать
и анимировать модель. Она гарантирует, что ребра будут разбиваться одинаковым образом в
каждом кадре анимации и топология модели не будет меняться, что очень важно для успешного
скининга.
На самом верху вы можете обнаружить атрибут Method, установленный по умолчанию в
современный экспоненциальный алгоритм Exponential. Его основным преимуществом является то,
что он разбивает поверхность на четырехугольники и дает предсказуемый результат.
Существует и более старый линейный алгоритм, разбивающий ребра без учета топологии
соседних граней. Его главный недостаток - невозможность защитить границы поверхности от
сглаживания. Кроме того, он некорректно работает с гранями, имеющими более четырех вершин,
разбивая эти грани в непредсказуемом порядке.
Однако метод Linear нравится некоторым просветленным мастерам Полидзен за то, что
вместо одного атрибута Continuity, он предоставляет сразу три параметра для тонкой настройки
сглаженной формы. Это позволяет более точно контролировать процесс сглаживания и вмешиваться
в автоматический майский «интеллект».
Если вы приглядитесь повнимательнее, то увидите, что в Attribute Editor присутствуют ДВЕ
ноды типа mesh. Одна из них соответствует оригинальной, несглаженной поверхности.
Разыщите закладку polySurfaceShapel и в разделе Object Display снимите галку
Intermediate Object, чтобы показать исходную поверхность.
Теперь вы можете редактировать исходную несглаженную сетку, и все изменения будут
отражаться на финальной поверхности.
Беда в том, что обе поверхности путаются по ногами мыши, и исходная поверхность видна
344
Книга Сергея Цыпцына
только как каркас, что затрудняет контролирование ее объема. Для решения этих проблем в MAYA
был создан следующий инструмент, проходивший мучительную отладку от версии к версии. В
результате часть мастеров Полидзен так и не приняла его, хотя к седьмой версии он стал работать
вполне пристойно. Речь, конечно, идет о Smooth Proxy.
Smooth Proxy как метод контроля формы поверхности
Сразу скажу: в некоторых школах Полидзен вместо Smooth Proxy предпочитают временно
применять операцию Smooth к рабочей поверхности, оценивать результат, а затем нажимать Undo
и работать дальше. Это дело привычки, притом экономит память.
Действительно, «тормознутость» первых инкарнаций Smooth Proxy отвадила от этой
операции немало народу. Тем более, что у нее всегда была отличная альтернатива, скрипт
Connect Poly Shape, о котором речь пойдет ниже.
Итак, пощупаем этого вепря.
Откройте реликтовый файл 0.5.та.
Выберите поверхность и откройте Option Box операции Smooth Proxy (Proxy=>Subdiv Proxy
для восьмой версии)..
Задайте значения по умолчанию, а в разделе Display Settings включите галки Proxy Mesh
in Layer и Smooth Mesh in Layer, чтобы создать слои для исходной (Proxy Mesh) и результирующей
(Smooth) поверхностей.
В этом же разделе настраивается прозрачность исходной модели.
Нажмите кнопку Smooth и откройте Channel Box.
В Layer Editor вы можете прятать/показывать исходную и сглаженную поверхности
индивидуально. Обратите внимание, что по умолчанию сглаженная модель представлена как
Reference, то есть выбрать на экране ее нельзя, для того, чтобы редактировать можно было только
исходную сетку.
Полигональное моделирование
345
По умолчанию на исходную поверхность назначается новый полупрозрачный материал, и
он виден при финальном просчете. Вы можете избежать этого, отключив у поверхности атрибут
Primary Visibility.
Дальше все должно быть понятно. Отмечу несколько технических моментов.
Для удобства работы по умолчанию есть несколько горячих клавиш.
Это прежде всего «MEL-овская» кавычка «х», находящаяся под Escape'oM, она переключает
отображение со сглаженной (Smooth Mesh) поверхности на исходную(Ргоху Mesh) и обратно.
«Shift-х» - включает обе поверхности.
А вот с клавишей «Ctrl-'» будьте поосторожнее. Некоторые используют ее для включения
и выключения сглаживания, однако она назначена на саму операцию Smooth Proxy , поэтому если
в Option Box операции установлено создание слоев, то эти слои будут плодиться, как кролики,
после каждого второго нажатия.
Довольно разумно прискинивать к костям оригинальную поверхность. Сглаженная сетка
будет при этом автоматически деформироваться. Гораздо легче настраивать скининг на меньшем
количестве вершин. В этом случае не включайте опцию Share Transform Node в Option Box для
Smooth Proxy.
Важное замечание. При идентичных настройках разбиения операции Smooth и Smooth
Proxy создают сетки с абсолютно разной нумерацией вершин и ребер, но визуально
не отличимые друг от друга. Пользуйтесь либо одной, либо другой операцией для
сглаживания, чтобы потом не напороться на проблемы, например с Blend Shapes.
Как уже было указано выше, Smooth Proxy может работать в симметричном режиме. Для
этого достаточно выбрать в Option Box опцию Mirror Behaviour и нужное направление.
346 Книга Сергея Цыпцына
«*»
Надо понимать, что при этом происходить некоторое количество ритуальных действий:
исходная поверхность инстансируется и выворачивается, затем обе половины комбаинятся,
вершины сшиваются, прячется скомбаиненныи результат, который после этого сглаживается и
результат сглаживания можно увидеть внутри симметричной оригинальной поверхности.
Я привожу этот список действий не для того, чтобы вас напугать, а для того, чтобы
сказать: вы все это можете сделать сами, аккуратно проделав нужные операции, спрятав объекты
и поднастроив историю.
И последнее замечание. В общем случае вы будете модифицировать только
исходную несглаженную сетку, но в принципе вам никто не мешает таскать
за вершины и сглаженную поверхность. Однако имейте в виду: если вы будете
потом анимировать исходную геометрию, сглаженная сетка может повести себя
непредсказуем о.
Полигональное моделирование
347
Удаление симметрии: Unmirror Smooth Proxy
В какой-то момент вам, конечно же, понадобится удалить симметрию с поверхности,
имеющей Smooth Proxy, например, когда вы захотите анимировать модель, вставить кости или
просто получить единую поверхность для дальнейшего несимметричного редактирования.
Тут можно вооружиться бензопилой, залезть в Outliner и устроить там техасскую резню,
в результате которой останется в живых только исходная половина несглаженнои сетки. Дальше
можно применить Mirror Geometry и удалить историю.
Однако для экономии времени и бензина можно просто выбрать поверхность и выполнить
операцию Unmirror Smooth Proxy, в Option Box которой надо указать нужное направление этого
«раззеркаливания» (Proxy=>Remove Subdiv Proxy Mirror для восьмой версии).
Эта операция полностью удаляет сглаженную поверхность, сшивает обе половины исходной
поверхности, сливает вершины и до блеска чистит историю.
View Shading Ligl;1. i .
Вы получаете единую несглаженную сетку, которую можно несимметрично редактировать,
анимировать, деформировать и т.д.
У операция «раззеркаливания» есть, правда, два «глюка».
Во-первых, она не удаляет созданные слои, поэтому вам лучше сделать это вручную.
Во-вторых, она иногда издевается над нормалями и оставляет на объекте полупрозрачный
материал. Нормали можно пролечить операцией Edit Polygons=>Normals=>Set То Face.
Если вы хотите получить сглаженную поверхность этой «целой» модели, можете
348
Книга Сергея Цыпцына
воспользоваться операцией Smooth или снова применить Smooth Proxy, но при этом установить
в Option Box параметр Mirror Behavior=None. Второй способ позволит вам анимировать исходную
грубую модель, которая будет автоматически деформировать сглаженную.
Connect Poly Shape и другие альтернативные инструменты
В те давние времена, когда пункта меню Smooth Proxy еще не было еще в проекте,
мастера Полидзен успешно конструировали свои, альтернативные, методы сглаживания с
помощью уже имеющихся операций, благо дерево истории всегда открыто для редактирования.
Для автоматизации этого процесса использовался, естественно, язык MEL, что в конечном итоге
привело к появлению некоторого количества скриптов, заменяющих операцию Smooth Proxy.
Самый известный из них - Connect Poly Shape. Этот скрипт имеет невероятную
функциональность, с лихвой перекрывающую возможности Smooth Proxy. Только будьте осторожны:
он вызывает сильное привыкание. Кто немного поработал с ним, уже не может от него отвыкнуть
и в работе используют только его.
Его автор Dirk Bialluch, его сайт - http://www.lightstorm3d.com. Там можно найти еще
много разных полезных инструментов: и для моделирования и помимо него.
Полигональное моделирование
349
Здесь же хотелось бы напомнить о том, что функциональность MAYA может быть расширена
в нужном направлении благодаря открытой архитектуре. Результаты этого расширения вы можете
найти на сайте www.highend3d.com, где, в частности, есть огромный набор скриптов, улучшающих
качество жизни полигональных моделеров.
Также хочу упомянуть, что с каждой новой версией MAYA выходит набор скриптов и
плагинов, так называемый Bonus Tools, расширяющий стандартные возможности MAYA. Львиную
долю расширений в этом наборе составляют инструменты полигонального моделирования. Bonus
Tools доступен для скачивания на сайте www.alias.com (теперь уже www.autodesk.com),
Также нельзя пройти мимо свободно распространяемого пакета Open Maya Toolbox,
содержащего набор инструментов на все случаи жизни именно для полигонального моделирования.
Скачать его можно с сайта:
http://sourceforge.net/projects/omtoolbox/
Плохая и хорошая геометрия. Проблемы и лекарства. Cleanup
Как я уже упоминал, некоторые операции оставляют после себя некоторую грязь, которую
необходимо уметь отслеживать и вычищать. Чемпионом по этой части являются операции Boolean,
запрещенные к использованию комитетом по правам человека.
Можно выделить два вида «косяков». Первые отражаются на внешнем виде поверхности и,
как правило, видны прямо на экране. Это, в основном, проблемы с нормалями.
Вторые более зловредны и обычно невидимы. Вылезают они гораздо позже, при деформациях
поверхности, сглаживании или конвертации в сабдивы. И, конечно, при рендеринге.
Источником заразы могут быть не только кривые операции, но и немытые руки пользователя,
забывающего о мерах предосторожности. Далее я перечислю примеры проблем, основные причины
их возникновения и способы обнаружения и лечения.
Проблемой номер один являются несшитые вершины. Их источником в основном является
операция Combine. Обнаруживаются они отображением граничных граней (Display Borders),
а лечатся операцией Merge Vertices. Есть, однако, и другой источник возникновения двойных
вершин.
Создайте плоскость, выберите любую грань в центре и переверните нормаль операцией
Reverse с параметрами по умолчанию. Если отображение граничных ребер включено, вы сразу
увидите, что вершины перевернутой грани стали двойными, в чем нетрудно убедиться, потаскав
их вверх-вниз.
Если вы перевернете нормаль еще раз, вершины не «сольются» обратно и вы получите
«непришитую грань». Лечится это операцией Merge Vertices.
350
Книга Сергея Цыпцына
Пытливые умы, конечно, обнаружат в Option Box операции Reverse и в атрибутах ноды poly-
Normal параметр Normal Mode. Если изменить его с Reverse and Extract на просто Reverse, вершины
не будут дублироваться при переворачивании нормали. Однако AAAYA все равно будет рисовать
граничные ребра, сигнализируя о проблеме.
Выберите другую грань и переверните нормаль с опцией Reverse.
В данном случае вы получите действительно плохую геометрию. Плохую с точки зрения
математики. Из одного ребра торчат две грани, нормали которых направлены в разные стороны.
Важное замечание. Самый главный детектор проблем и плохой геометрии - это конвертация
полигональной поверхности в сабдивы. Для быстрой проверки качества поверхности используйте
стандартную горячую клавишу «Alt-'» в сочетании с Undo. В случае ошибки читайте Script Editor,
там будет диагноз и даже рецепт лечения.
Если попытаться сконвертировать плоскость с плохой гранью в сабдив (Modify=>Conver
t=>Polygons to Subdiv), AAAYA будет «ругаться», указывая на то, что некоторые ребра являются
неманифолдными (nonmanifold), то есть они не связывают грани гладко:
// Error: line 2: polyToSubdivl (Poly To Subdiv Node): One or more edges is nonmanifold.
В данном случае, лекарство очевидно: надо просто развернуть нормаль обратно с той же
опцией Reverse. Однако, чтобы найти все такие неманифолдные ребра на поверхности, проще
воспользоваться универсальным чистящим средством - операцией Cleanup.
Выберите саму поверхность и откройте Option Box операции Cleanup.
С Geometry Only
Remove Geometry:
Включите галку Nonmanifold Geometry. По умолчанию выбран метод лечения Normals and
Полигональное моделирование
351
ijItlJJl
Geometry, пользуясь которым MAYA сначала пытается развернуть нормали, чтобы избавиться от
плохих ребер, а если это не помогает, то дублирует эти ребра, делая их граничными и разрезая
соседние грани. Если выбрана опция Geometry Only, она не трогает нормали , а сразу дублирует
плохие ребра .
Поэкспериментируйте с обеими опциями, нажимая Apply и Undo. Посмотрите, как MAYA
после этого конвертирует поверхность в сабдив.
Понятие «неманифолдная геометрия» можно перевести так: сетка, которая не может быть
развернута в один плоский неперекрывающийся лоскут.
Приведу дополнительные примеры неманифолдной геометрии.
Если вы убили грани в «шахматном порядке», оставшиеся грани соединяются вершинами, а
не ребрами. Такая геометрия тоже не может быть сконвертирована в сабдив, и любое сглаживание
на ней не работает, хотя рендериться и анимироваться она будет без проблем. В этом случае
операция Cleanup просто дублирует угловые вершины.
Еще один пример неманифолдной сетки - это результат работы операции Extrude Edge на
внутренних ребрах, когда из одного ребра торчит более двух граней. Такая конструкция никак не
352
Книга Сергея Цыпцына
может быть развернута в плоский лоскут и сконвертирована в сабдивы.
В то же время, она может быть сглажена и не должна давать проблем при просчете.
Операция Cleanup в этом случае дублирует проблемное ребро, чтобы у каждой грани,
торчащей из него, было свое индивидуальное ребро.
Основные поставщики плохой геометрии - это немытые руки пользователя, хронический
недосып, операции Extrude Edge, Normals=>Reverse, Delete Face, Collapse, Reduce.
Приведу еще один пример, часто встречающийся по первым двум причинам.
Создайте плоскость.
Скопируйте ее, как бы случайно, не заметив копирования.
Выберите обе плоскости и сделайте Combine.
Как примерные мальчики, выполните после этого Merge Vertices.
Теперь вы имеете визуально пристойную поверхность, у которой двойные грани. Причем
Полигональное моделирование
353
обнаружить это довольно сложно. Таская за вершины, вы синхронно меняете эти двойные грани, у
которых все ребра - общие. Такие грани называются lamina faces. Выбрав любую грань и потащив
ее, вы одновременно потащите все ребра, и, как следствие, вторую грань. И только лишь выбрав
грань не щелчком, а обведя ее центр рамкой, вы можете заметить (что маловероятно) в заголовке
окна AAAYA, что выбрано две грани.
Совет. Включайте отображение полигональной статистики на экране:
Display=>Heads Up Display. Это позволит вам контролировать, сколько и каких
компонент выбрано в каждый момент времени.
Лечение такого «ламинарного» вируса довольно затейливо.
Попытайтесь сконвертировать полученную плоскость в сабдив. Вы получите стандартное
сообщение об ошибке (о том, что геометрия неманифолдная):
// Error: line 2: polyToSubdivl (Poly To Subdiv Node): One or more edges is nonmanifold.
// Nonmanifold geometry cannot be converted to a subdivision surface.
//To clean up nonmanifold edges, use Polygons->Cleanup with the nonmanifold option. //
Тут вы, конечно, позовете «антивирус», то есть в Option Box операции Cleanup включите
галку Nonmanifold Geometry.
Однако в данном случае это не та опция, которую следует использовать. Впрочем, вы этого
можете и не знать и поэтому, выбрав по умолчанию опцию Normal and Geometry и нажав кнопку
Apply, получите довольно странный набор выбранных граней. Если вам повезет и вы догадаетесь
показать нормали, вы увидите, что поверхность имеет нормали с обеих сторон!
354
Книга Сергея Цыпцына
Если не догадаетесь, то увидите: MAYA просто разрезала поверхность на отдельные грани.
Если вы не будете окончательно обескуражены результатом, то наверняка подвигаете вершины
или грани, чтобы узнать в чем дело, и наконец-то обнаружите, что поверхность - двойная!
Как только увидите двойную слоенную поверхность, жмите Undo нужное количество раз,
чтобы вернуться к «непролеченной» поверхности.
Откройте снова Option Box операции Cleanup, снимите галку Nonmanifold Geometry и в
самом низу включите галку Lamina Faces.
Теперь лечение будет более эффективным.
В разделе Remove Geometry также находятся опции, позволяющие удалять грани, которые
меньше определенного порога по площади, или ребра, которые меньше по длине, чем заданная
Полигональное моделирование
355
нмш
величина. Так как этот процесс будет полностью автоматическим, я бы советовал вам пользоваться
им с большой осторожностью, ибо такое удаление может послужить поводом для еще одной чистки
поверхности.
В разделе Tesselate Geometry находятся параметры, не относящиеся собственно к чистке
и лечению поверхности. Они позволяют разбивать сетку на треугольники, и задают критерии,
определяющие, какие грани нужно разбивать: четырехугольники, многоугольники, вогнутые
грани, грани с дырками или неплоские грани. Это может быть полезно при импорте в игровой
движок.
В принципе, если вы не собираетесь конвертировать модель в сабдивы, вопрос о том,
что считать плохой геометрией, становится довольно субъективным. Особенно, если вы не
предполагаете в дальнейшем интенсивно гнуть геометрию.
Конечно, двойные вершины или грани - это в любом случае брак. Но остальные типы
неманифолдной геометрии могут вызывать только частные проблемы при сглаживании поверхности.
Поэтому если эти проблемы вас не касаются, можете не тратить время на их решение.
Однако популярность Subdivision Surfaces в настоящее время такова, что отмахнуться от них
будет довольно легкомысленно (я говорю в основном от имени лагеря любителей органического
моделирования). Делайте выводы сами.
Примечание. Грани с дырками «официально» не считаются браком, и некоторые
операции поддерживают их. Однако операции сглаживания работают на них
некорректно, и при переводе в сабдивы дырки просто будут проигнорированы. Но
самое главное: на таких гранях не работает Split Polygon Tool. Поэтому грани с
дырками запрещены к использованию в большинстве школ Полидзен.
Совсем хорошая геометрия. О пользе прямоугольников и вреде треугольников. Откровения
мастеров Полидзен
Сразу предупрежу: все, кто занимается архитектурой, дизайном или игрушками, могут этот
раздел пропустить. В нем речь пойдет о качестве моделей, предназначенных для персонажной
анимации. Я не претендую на объективность, поэтому, возможно, кое-что может показаться вам
неочевидным или спорным.
Побеседовав с мастерами Полидзен, я обнаружил, что абсолютно все из них мистически
избегают треугольников. Не удовлетворившись ответом, что треугольники плохо влияют на
карму, а число «четыре» является символом устойчивости, я провел некоторые собственные
расследования, которые и обобщил в нижеследующем материале.
Есть три технических причины, по которым мастера избегают треугольников и стараются
работать только с четырехугольниками. А еще - несколько эзотерических причин, о которых чуть
позже. Первая причина основана на популярности сабдивов для органического моделирования.
Именно сабдивы сильно недолюбливают треугольные грани. Проделайте следующее упражнение.
Возьмите поликуб. Выделите одну из вершин и срежьте ее операцией Chamfer Vertex.
356
Книга Сергея Цыпцына
№
Удалите историю. Скопируйте куб и отодвиньте копию вправо.
Выберите срезанную грань и распилите ее на три четырехугольника операцией Subdivide.
Затем возьмите Split Polygon Tool, и три грани, примыкающие к срезанной, разрежьте пополам, от
середины срезанного ребра по диагонали. Удалите историю.
Теперь выберите оба куба и сконвертируйте их в сабдивы, нажав «Alt-4».
Поиграйте со сглаженностью отображения, нажимая «0,1,2,3».
Нажмите «0» и обратите внимание на то, что куб имевший больше граней, превратился
в более «легкий» сабдив. Это произошло именно из-за того, что он был грамотно разбит на
четырехугольники.
Кроме того, сетки содержащие треугольники, пятиугольники и другие многоугольники
плохо поддаются параметризации, да еще порождают на сабдивах «особые» точки («звездочки»),
где сходятся три, пять и более «изопарм». Эти точки являются потенциальным источником
проблем, так как при деформациях в их окрестности могут появляться всяческие «вспучивания».
Полигональное моделирование
357
Четырехугольники изначально склонны к хорошей параметризации - ведь это кусочки
прямоугольной сетки, поэтому сабдивы очень «любят» четырехугольники.
Чтобы окончательно убедиться в этом, проделайте завершающий эксперимент.
Выберите оба сабдива и сконвертируйте их в NURBS-поверхности: Modify=>Convert=>Subdiv
to NURBS.
Теперь посчитайте количество сплайновых лоскутов на каждом из бывших кубиков. На
первом кубике их будет 27, а на распиленном - всего 9.
Итак, четырехугольники - залог качества и легкости сконвертированной в сабдивы
поверхности.
Вторая техническая причина связана с тем, что мастера Полидзен, часто используют Ren-
derman для просчета персонажей. А он, ох, как не любит треугольники! Да и не только Render-
man: ведь до последнего времени и Mental Ray, встроенный в MAYA, не умел рендерить Subdivision
Surfaces, которые не состояли из одних четырехугольников, и любая треугольная грань в базовой
сетке вызывала у него аллергию. Конечно, сейчас появились эффективные методы просчета
треугольников в составе сабдивов (типа Loop Scheme), но осадок, как вы понимаете, остался, и
треугольники до сих пор имеют репутацию помехи для рендеринга сабдивов.
Третья причина не относится к сабдивам, а имеет отношение к анимации персонажей.
Очень часто нечетырехугольные грани, расположенные в местах сгибов поверхности вызывают
непредсказуемые деформации. Также в этих же местах нежелательно иметь точку схода
нескольких "патчей", то есть такую вершину, из который выходят больше четырех ребер. Все
это приводит к неприятным последствиям в виде "возмущений", стяжек, заломов и пр. Конечно,
если без треугольников совсем не обойтись, можно оставить их в некоторых местах, пользуясь
следующим правилом: главное чтобы данный не-четырехугольник (треугольник, пятиугольник и
т.д.) не вызывал возмущений на поверхности после сглаживания или при переводе в subdiv. И вел
себя прилично во время анимации. Практика показывает, что такие нечетырехугольные полигоны
нельзя оставлять в тех местах, которые активно растягиваются, сжимаются во время анимации.
Особенно, если кожа персонажа не прикрыта мехом. Грубо переформулировать это правило
можно так: хотите эффективно гнуть или как-то ещё деформировать поверхность - держите ее
грани четырехугольными. Пусть это понадобится лишняя цепочка рёбер.
Существуют также некоторые экзистенциальные предпосылки для избегания
нечетырехугольников. Если посмотреть вокруг, можно найти массу примеров того, что в природе
часто отдается предпочтение четырехугольным патчам, если говорить о поверхностях, а не об
объемах. Взять хотя бы ткани: их волокнистая структура представляет собой прямоугольную
сетку. В подтверждение этой, без сомнения, спорной гипотезы я бы хотел привести историю,
которую мне рассказал один из мастеров Полидзен Сергей /1уценко. История весьма поучительная
358
Книга Сергея Цыпцына
и одновременно непонятная для тех, кто еще не прочувствовал, что значит
Читайте и попробуйте почувствовать это.
<форма не живет»
«Своё личное открытие по поводу того, как должны распределяться ребра и грани модели
я сделал, когда однажды пришлось моделировать фуражку американского полицейского. Я
застрял на моделировании тульи (самой верхней части этого головного убора). Попытка просто
формально задрать вверх переднюю часть тульи ни к чему хорошему не привела. Фуражка все
равно не была фуражкой. На помощь пришла жена, занимавшаяся моделированием одежды. Она,
глядя со стороны, сразу указала на ошибку и предложила обратить внимание именно на то, как
располагается ткань на реальном объекте, из каких и скольких лоскутов ткани состоит фуражка?
Как и где она сшита. И когда я воспроизвел все эти фрагменты, точно по оригиналу, фуражка
«ожила». Конструкция заработала!»
Некоторые ортодоксальные мастера Полидзен старой индийской школы до сих пор делают
начальную болванку модели сплайновыми патчами, которые потом конвертируют в полигоны,
получая безукоризненные грани и идеальный текстурный маппинг впридачу.
На этом я бы хотел закончить оду четырехугольникам и кратко осветить три операции по
разбиению граней на нужное количество вершин.
Triangulate, Quadrangulate и Subdivide
Чтобы испортить модель и превратить в треугольники все ее грани (или не все, но
выбранные), существует специальная операция: Triangulate. (Это - шутка, и часто эта операция
бывает нужна, чтобы экспортировать модель в игровой движок или скормить ее на вход программе,
которая, кроме треугольников, ничего не понимает - есть ведь еще и такие).
Когда я начал изучать MAYA, то ожидал, что операция Quadrangulate выполняет аналогичные,
а не противоположные действия, то есть находит все нечетырехугольные грани и сечет их на
четыре вершины. Ан нет, эта операция служит противоположностью Triangulate: она ищет только
треугольные грани, и если угол между соседними треугольниками меньше заданного, эти два
треугольника превращаются в четырехугольник - удалением общего ребра. Процесс, как вы
понимаете, не очень предсказуемый.
А вот если вы хотите гарантированно превратить выбранные грани в четырехугольники,
вам следует использовать операцию Subdivide. Она разбивает грани нужным образом. Кроме того,
она работает и для выбранных ребер.
Выбрать только треугольные или только четырехугольные грани можно воспользовавшись
окном Edit Polygons=>Selection=>Selection Constraints. Имейте также в виду, что его содержимое
зависит от активных компонент.
Полигональное моделирование
359
Кроме того, не забывайте: один из дополнительных бонусов операции Smooth - то, что в
процессе сглаживания она создает только четырехугольные грани (для метода Exponent).
Еще немного о нормалях
Поговорим немного о вершинных нормалях. Напомню, что это нормали, торчащие из
вершин, число которых в каждой вершине равно числу примыкающих к ней граней. Эти нормали
носят декоративную функцию и влияют на то, насколько мягкие или жесткие переходы будут на
ребрах при освещении.
В принципе, если вы собираетесь конвертировать поверхность в сабдивы, вершинные
нормали не должны вас беспокоить вообще: в этом случае они игнорируются. Однако они часто
настолько обезображивают внешний вид поверхности на экране, что бывает полезно найти на них
какую-нибудь управу. Очень часто модель «приезжает» в сцену с плохими вершинными нормалями
при импорте из других пакетов. В этом случае полезно сделать следующую процедуру для лечения
испорченных вершинных нормалей.
Проще всего выбрать всю поверхность и выполнить операцию Edit Polygons=>Normals=>Set
Vertex Normal, причем в Option Box надо включить галку Unlock Normals.
Эта галка с нелогичным и непонятным названием, говорит о том, что нужно не только
разблокировать вершинные нормали, но и пересчитать их в значения по умолчанию (эти значения
определяются мягкостью/жесткостью ребер, установленной ранее).
После этого вы можете устанавливать жесткость/мягкость ребер операцией
Soften/Harden. Механизм блокировки вершинных нормалей не очевиден, так как на экране нигде явно не
отображено, заблокированы вершинные нормали или нет.
360
Книга Сергея Цыпцына
№
Блокировка, возможно, случилась при импорте модели или была сделана вручную
операцией Set Vertex Normal с включенной опцией Lock Normals.
Совет. Если вы не занимаетесь производством игр, вам вряд ли придется менять
вершинные нормали вручную. Поэтому советую вам разблокировать их (с помощью
Set Vertex Normal), а жесткостью ребер управлять с помощью Soften /Harden.
Проследите также, чтобы галка Set User Normal не была включена в Option Box операции Set
to Face. Эта, еще одна нелогично названная, галка блокирует вершинные нормали и устанавливает
их в весьма экзотическое направление.
Немного про историю и инстансирование
Практически все операции полигонального моделирования создают историю. Как правило,
исходные объекты основательно прячутся (превращаются в Intermediate Objects), однако остаются
в сцене. Поэтому если вы не планируете использовать историю некоторых операций, удаляйте
ее. В общем случае, история моделирования выглядит как цепочка нод, передающих друг другу
модифицированную поверхность в виде связки атрибутов .output=>.inputPolymesh.
Часто попытка модифицировать атрибуты ноды где-нибудь в начале дерева истории
оказывается весьма неудачной: ведь некоторые операции меняют количество и порядок вершин,
поэтому нижеследующие операции начинают действовать на уже совсем другие компоненты, и
результат становится, мягко говоря, забавным.
Полигональное моделирование
361
шшм
Поэтому общий совет может быть следующим: перед очередной операцией моделирования
убивайте историю. Если это слишком сильное требование и выработать такую привычку невозможно
в силу темперамента, могу смягчить свой совет: убивайте историю периодически.
Иногда возникает задача убить не всю историю, а только отрезать ее хвост, удалив, таким
образом, часть дерева истории. Можно, конечно, взять в руки грязный консервный нож, открыть
Hypergraph и «откусить» начало истории вручную, просто удалив нужные ноды. Для тех, кто не
переносит вида крови, есть специальные MEL-скрипты, делающий это автоматически.
Они здесь:
http://highend3d.com/maya/downloads/mel_scnpts/data_nrianagement/257.html
http://highend3d.com/maya/downloads/mel_scripts/1722.html
В главе про изнанку MAYA я привел довольно подробный пример, объясняющий работу с
полигональной историей и атрибутами inMesh и outMesh.
Здесь я лишь напомню про распространенный трюк, активно применявшийся и применяющийся
поныне, как альтернатива операции Smooth Proxy.
Возьмите полигональную поверхность, например, куб.
Удалите историю, скопируйте и отодвиньте его вправо.
Выберите обе копии, откройте Hypergraph и выполните там Graph=>lnput and Output Connections.
Нажмите Shift и перетащите средней кнопкой мыши ноду pCubeShapel на pCubeShape2.
Появится Connection Editor. В нем надо соединить атрибут pCubeShapel .outMesh с атрибутом
pCubeShape2. inMesh.
362
Книга Сергея Цыпцына
Теперь поверхность второго куба «синхронизирована» с поверхностью первого. При
изменении формы первого куба происходит немедленное обновление связи и форма второго куба
мгновенно перестраивается.
Внимание! В этом случае есть кардинальное отличие от простого инстансирования с
помощью операции Duplicate (Geometry Type=lnstance). Оно заключается в том, что поверхностей
две и одна повторяет форму другой. В случае инстансирования поверхность одна на два объекта
(трансформа).
Если потаскать точки первого куба, то форма второго изменится. Однако обратное
неверно, и редактирование точек второго куба будет лишь «наслаиваться» поверх имеющейся
формы первого куба, при этом первый куб никак не реагирует на изменение формы второго.
Полигональное моделирование
363
Это дает возможность, например, сгладить форму второго куба и наблюдать на ней
изменения, сделанные для первого, несглаженного куба.
Дерево истории выглядит при этом предельно просто.
Таким образом, вы может сконструировать свой вариант Smooth Proxy, комбинируя
инстансирование и синхронизацию inMesh/outMesh.
Текстовый графический режим. Работа с текстами
Вопрос создания объемного текста был исторически довольно слабым звеном в MAYA. С тех
пор как умер плагин Invigorator компании Zaxwerks, это свято место зияло пустотой, ибо стандартная
операция Create=>Text всегда поражала меня своим аскетизмом. Но на рубеже седьмой версии в
этом вопросе случился прорыв. Даже два прорыва!
364
Книга Сергея Цыпцына
Во-первых, в Option Box операции Text появилась опция Bevel, позволяющая автоматически
сглаживать объемный текст нужными фасками и создающая нормальную историю объекта с
возможностью изменения самого текста позже.
Во-вторых, наконец-то появился нормальный обмен с файлами пакета Illustrator с помощью
операции Create=>lllustrator Text. Создаваемый трехмерный текст отслеживает связи с исходным
файлом в формате .ai, и, в случае изменения последнего, вы можете обновить созданный текст
одним нажатием кнопки.
Вершинные цвета и симуляция освещения
Для каждой вершины поверхности можно редактировать не только нормали, но и создавать
и редактировать цвета или прозрачность. Такие вершинные цвета позволяют специальным
устройствам, типа игровых консолей, отображать окрашенные поверхности без вычисления
реального освещения, текстурирования, теней и других эффектов. Делается это, очевидно, для
увеличения производительности отображения и скорости прокрутки моделей.
Я не буду подробно останавливаться на работе с вершинными цветами (Vertex Colors), так
как эта технология используется в основном в игровом производстве. Скажу лишь, что в меню Edit
Polygons=>Colors содержится набор операций для работы с такими цветами. Вы можете назначать
Полигональное моделирование
365
цвета вручную, рисовать их прямо на поверхности или «запекать» текущие текстуры и освещение
в вершинные цвета. Последняя операция обычно называется «прелайтом» (Prelight) и состоит из
полноценного просчета с помощью выбранного рендерера и конвертации полученного изображения
в вершинные цвета.
Вершинные цвета хранятся в специальных наборах - Color Sets. Таких наборов может быть
несколько для вершин одной поверхности. В одном наборе вы может хранить только блики, в другом
диффузное освещение. Или вы можете хранить в разных наборах разные условия освещения, в
зависимости от времени дня или года. Эти наборы можно потом переключать или смешивать,
получая нужные эффекты без повторного просчета освещения.
Карты нормалей, ZBrush, Modo и другие
Когда-то полностью интегрированные ЗЭ-пакеты типа МАУАбыли чем-то вроде законодателей
мод во всей индустрии компьютерной графики, однако со временем выяснилось, что небольшие
компании могут делать гораздо более гибкие и функциональные программы, предназначенные
для решения узкого круга задач, например, только для моделирования или специально для
рендеринга. Шквально растущая игровая индустрия спровоцировала появление шустрых и
удобных программ специально для полигонального моделирования, отвечающих практически
всем требования трехмерных моделлеров. Производители «тяжелых» интегрированных программ
не могли столь же оперативно реагировать на стоны пользователей, и в результате на рынок
вышли новые игроки.
Основным недостатком традиционного подхода к полигональному моделированию
является «неестественность» инструментов и определенные трудности в обучении традиционных
художников и скульпторов применению всего этого инженерного подхода. Таскание за вершины
и разрезание ребер мало чем напоминают классическую лепку и скульптуру. Необходимость
соблюдать топологические ограничения, экономить вершины и думать о том, где провести
очередное ребро, накладывает довольно сильные рамки не только на образ действия, но и на
образ мысли.
Было бы гораздо удобнее взять болванку и начать ее мять, гнуть или отсекать все
лишнее, не заботясь о том, где и сколько вершин находится на поверхности. Развитие технологии
иерархических Subdivision Surfaces спровоцировало появление новых подходов и инструментов.
Мощный толчок получило развитие концепции кистей, с помощью которых пользователь может
редактировать поверхность с любой степенью детализации, «прокрашивая» морщины, впадины,
рельеф поверхности, используя текстуры в качестве выдавливающих кистей и пр. Появились новые
программные продукты, исповедующие новую, «художественную», парадигдму, в отличие от
старой, «инженерной» - я, конечно, сгущаю краски, но звучит, согласитесь, красиво... Перечислю
некоторые из них.
Компания Sensable Technologies (www.sensable.com) доводит концепцию трехмерной
скульптуры до реализации обратной связи модели с пользователем. Решение Clay Tools представляет
собой программно-аппаратный набор, и если программная часть чем-то напоминает рисование
майскими кистями в Sculp Geometry Tool, то аппаратная представляет собой перо (или стилус,
если угодно), конец которого закреплен в шарнирной «руке». Перо используется как трехмерная
мышь, а «рука» обеспечивает обратную связь, то есть если вы пытаетесь надавить курсором этой
мыши на поверхность модели на экране, устройство отвечает вам упругим сопротивлением. Это
дает совершенно неповторимое ощущение «реальности» и «твердости» модели, находящейся
перед вам на экране.
Компания Luxology (www.luxology.com) выпустила на рынок пакет Modo. Основной лозунг
программы «Model Like You Mean It» предполагает максимальную дружественность интерфейса и
в то же время множество мелких и приятных доработок, облегчающих и ускоряющих довольно
монотонный труд трехмерных моделлеров. Кошмар по созданию UV-карт превращается в Modo в
набор несложных действий, а система кистей обеспечивает интуитивно понятное взаимодействие
366
Книга Сергея Цыпцына
художника и модели.
Королем нового подхода к полигональному моделированию является компания Pixologic
(www.pixologic.com). Она создала и продолжает разрабатывать, я не подберу другого термина,
совершенно чумовой пакет ZBrush. Он использует крайне своеобразную концепцию (ZSpheres),
благодаря которой объем модели набирается из множества перекрывающихся сфер, и в то же
время пользователь может использовать уникальные возможности трехмерного рисования,
выдавливая или вытягивая объем подобно обычному процессу создания скульптуры. Вдобавок ко
всему программа использует иерархические полигональные сетки с любым количеством уровней
сложности (subdivision surfaces), позволяет гнуть модель с помощью подобия скелета и костей,
потрясающе работает с картами деформаций и нормалей (normal/displacement maps) и имеет
еще много разных уникальных особенностей. Программа позволяет ворочать модели весом в
миллионы полигонов в реальном времени. ZBrush явно изменяет представление о традиционном
полигональном моделировании. Зайдите на сайт, почувствуйте атмосферу и загляните также в
галерею на www.pixolator.com/zbc/featured2col.php
Еще один новичок в этой области - пакет MudBox, вышедший из недр студии Weta
Digital. Имеет самый дружественный из всех перечисленных программ интерфейс и бешеную
производительность. Также использует концепцию скульптуры и кистей.
Из-под пера (точнее, кисти) вышеперечисленных пакетов выходят потрясающие
высокодетальные модели, фантастические выглядящие на финальном просчете. У них, правда,
есть недостатки. Их всего два: они вызывающе тяжелые и совершенно не годятся для анимации.
Оба этих недостатка призваны скомпенсировать технологии Normal Maps и Displacement Maps.
Если вы сделаете модель из пятидесяти миллионов полигонов в ZBrush и попытаетесь втянуть ее в
MAYA, вас, очевидно, ожидают некоторые проблемы. Прежде всего с памятью. Выход может быть
такой:
Можно взять низкополигональную (или адекватнополигональную) версию
супермодели и создать карту-текстуру дисплейсмента (displacement map), которая будет
содержать пространственную разницу между двумя версиями модели. Грубо говоря, берется
низкополигональная поверхность и в каждой точке измеряется расстояние до ближайшей
точки (по нормали) на высокополигональной поверхности. Это расстояние затем записывается
в текстуру, которая называется картой дисплейсмента. Теперь в MAYA (или еще где-нибудь)
можно импортировать (обычно в формате OBJ) низкополигональную модель, а полученную карту
положить как дисплейсмент, после чего вы получите ту же самую высокополигональную модель,
только высокополигональное разбиение поверхности будет производиться на этапе рендеринга.
Если предполагается не финальный качественный просчет, а вывод изображения в реальном
времени на экран, например, игровых консолей, то вместо карт дисплейсмента обычно вычисляют
карты нормалей (Normal Maps). Они похожи на карты бампа (Bump Mapping), только используют не
один, а все три канала цвета. Они, в отличие от бампа, не «подворачивают» нормали освещенности,
с а полностью заменяют их.
Таким образом, появляется новый метод работы с полигональным моделями (или
«новый пайплайн», как сейчас модно говорить). Высокодетальная модель изготавливается в
специализированном пакете типа ZBrush и экспортируется в MAYA в виде низкополигональнй модели
и карты диспейсмента. В MAYA анимируется низкополигональная модель, а детальная проработка
поверхности вычисляется уже на этапе рендеринга.
Карты дисплейсмента и нормалей вычисляются обычно в тех программах, где эта модель
создается, однако в MAYA есть свой инструмент для вычисления разности между поверхностями и
для сохранения ее в карту-текстуру. Этот инструмент называется Surface Sampler, и находится он
в меню Modify.
Полигональное моделирование
367
В общих чертах принцип его использования следующий.
В раздел Target Surfaces надо загрузить низкополигональную модель, в раздел Source
Surface высокополигональную или даже сплайновую поверхность (их может быть несколько).
Желательно, чтобы поверхности располагались в одном месте пространства, максимально близко
друг к другу. Затем надо выбрать тип создаваемых карт (например, Displacement Map), задать
разрешение, формат и установить опцию Shading Network=Attach to Shading Network - чтобы
генерируемая карта сразу присоединилась в каналу дисплейсмента и можно было, просчитав
картинку, увидеть результат. После этого надо повозиться с настройками для эффективного
просчета дисплейсмента.
Имейте в виду две неочевидных вещи: первое, Mental Ray не понимает (пока!) формат dds,
и, второе, низкополигональная модель должна иметь хорошие неперекрывающиеся текстурные
координаты, расположенные в диапазоне от 0 до 1.
Если вы будет создавать карты нормалей (Normal Maps), то они автоматически цепляются к
каналу Bump Mapping. Чтобы увидеть их в окне камеры, надо включить режим Shading=>High
Quality Rendering.
Технология использования карт нормалей и дисплейсмента стремительно развилась
буквально в последние годы и продолжает совершенствоваться. Уже появились специальные
плагины для генерации и поддержки 64-битных карт, улучшены системы импорта-экспорта. Новая
технология становится стандартом.
368
Книга Сергея Цыпцына
Практические советы мастеров Полидзен
Как обычно, в конце главы приведу набор практических советов касательно полигонального
моделирования. Советы эти родились в результате бесед с практикующими мастерами Полидзен, а
потому не разбросаны по каким-то строгим категориям. Читайте их «как есть», и, уверен, каждый
из вас сможет найти именно совет для себя.
Здесь же я хочу поблагодарить всех мастеров, помогавших мне при подготовке этой главы.
Это Владимир «Piastro» Панкратов, Саша «Black» Коршунов, Стае «Stass3D» Глазов, Ниле «Dr.Snake»
Блумберг, Ян Зубарев, Сергей Луценко и Миша Бажуткин.
Перед началом моделирования надо хорошенько изучить «предмет», а не кидаться с ходу
кликать мышкой. Основной принцип - изучить внутреннюю структуру моделируемого объекта и
попытаться выразить её в модели. Особенно это критично для органических тел. Рёбра и грани
должны как бы воспроизводить собой внешнюю оболочку объекта - его волокна, мышцы, клетчатку
и все, что у него там есть. Иногда даже приходится делать намёк на внутренние органы или
даже скелет. Примером может служить какое-нибудь старое или дистрофичное животное. Во всех
случаях, когда глаз различает отдельно кости, отдельно массы тканей или подкожного жира.
Очень помогают вспомогательные рисунки, которые можно сделать перед началом работы.
Полезно нарисовать сечения объекта. Линии сечений помогут заранее определить, сколько точек
и где может понадобиться. Особенно это полезно, когда ваш объект имеет много складок. И не
просто складок, а перекрывающих друг друга складок.
По поводу экономии вершин. Конечно, всегда желательно иметь ненагруженную модель.
Но нужно также помнить о том, что если модель будет гнуться, в этих местах нужно иметь «запас
по изопармам». Часто бывало так, что моделлер без проблем сдает модель, а когда доходит до
сетапа, обнаруживается брак. Тогда в нужные места приходиться вставлять дополнительные ряды
ребер. Принцип экономии вершин следующий: добавлять вершины только туда и только тогда,
когда это действительно нужно.
По поводу симметрии. Часто имеет смысл оставлять несшитую симметричную модель (или
половинку до операции сшивания), особенно при моделировании лица. Это очень сильно поможет
при изготовлении Blend Shapes и прочих операциях для сетапа. При этом, по возможности, не надо
менять топологию на одной из сторон.
По поводу взаимодействия с командой. Еще до начала моделирования имеет смысл обсудить
всю работу с аниматором и сетапщиком. И постоянно советоваться с ними в ходе работы.
По поводу сохранения результатов. Следует начинать с базовой упрощенной модели,
и обязательно надо сохранять ее. Ведь она может пригодиться для аниматиков и упрощенных
привязок к скелету. И даже помочь сетапщику для создания Wrap-привязки, тестирования и др. И
вообще: сохранение всех промежуточных результатов моделирования - хороший тон.
По поводу обучения. Рассматривание и анализ чужих моделей - эффективный способ
понять основные принципы моделирования. Всегда следует критически анализировать, почему
вершины добавлены в конкретные места, какую нагрузку они несут.
По поводу пристального взгляда. Во время моделирования не следует торопиться (если вы
только не идете на рекорд или не пытаетесь выиграть пари). Имеет смысл крутить модель со всех
сторон, анализировать ее под разными углами, определяя, где еще нужно подтянуть пару вершин
перед добавлением новых ребер. Кроме того, заведите на рабочем столе небольшое зеркало
и почаще смотритесь в него - помогает! Давайте глазам отдыхать, ведь глаз имеет свойство
«замыливаться».
По поводу света. Имеет смысл поставить лампочки в сцене и освещать персонажа с разных
сторон. Полезно перемещать источники света и наблюдать, как модель «играет». Также имеет
смысл поназначать на модель пару разных материалов: бликующий, матовый, шершавый, а потом
попереключать их, наблюдая, как модель воспринимается с разным светом и материалами.
Полигональное моделирование
369
ШЖУ.
Если к началу моделирования у вас уже появились текстуры (что маловероятно), грех их не
использовать.
По поводу объема. Чувствуйте объем, поэтому не тяните слишком сильно в одном
месте - если потеряете текущий объем, придется «вдавливать» в других местах. Речь идет не
об экструдировании, а о доводке и разрезании поверхности в нужных местах. Любая сложная
форма может быть низведена до примитивной, и в большинстве случаев это - кубик. Мысленно
представляйте его себе, и следите, как он изменяется.
Держитесь четырехугольников. Еще раз. На всякий случай.
Изучайте анатомию. Особенно строение и расположение мышц. Начав моделировать, вы
обнаружите, что позиции ключевых вершин совпадает с положением «антропоморфных» точек,
привязанных к мышцам. Прокладывайте ребра вдоль мышц, думая одновременно о необходимом
количестве сечений поперек мышцы. Рисунки «с содранной кожей», изображающие расположение
мышц на скелете - отличное учебное пособие.
Не перемоделивайте. Значительную часть работы можно сделать текстурами. Бамп и
дисплейсмент могут творить чудеса и экономить уйму времени.
Избегайте острых ребер. Они портят внешний вид и убивают реалистичность.
Используйте Quick Selection Sets. В них можно загнать не только объекты, но и компоненты. Дают
чудовищную экономию времени.
Если графическая карта надрывается и начинает «коматозить», не забывайте, что существует
специальный режим отображения объектов на экране. Он включается выбором Display=>Fast
interaction. После этого большие сцены начинают отображаться с учетом удаленности объектов от
камеры (Level of Detail). Поработав с в этом режиме, не забудьте его выключить в следующей
сцене, он может быть источником проблем, например, при работе с Image Planes.
Хорошую альтернативу Image Planes составляют полигональные плашки, на которые
натянуты текстуры с прозрачностью. С помощью атрибутов Alpha Gain и Color Gain текстуры типа
File, можно настроить комфортное отображение скетчей. Дополнительное преимущество плашек
состоит в том, что их можно запихать в слои, быстро включать/выключать, сделать их как
Reference, чтобы предотвратить их выбор.
370
Книга Сергея Цыпцына
Шутка была в том, что я клятвенно обещал не моделировать человеческую голову.
Не получилось. Сдержать клятву не получилось. Превозмогая аллергию на моделирование
человеческих голов, я принял решение включить этот безумный процесс в книгу.
Во-первых, чтобы угодить радикальным фанатам антропоморфного моделирования и
хоть как-то их удовлетворить. Во-вторых, чтобы показать как полезность, так и бессмысленность
описания этого процесса. В-третьих, из приличия.
Для этих целей мною был разработан универсальный тренажер по моделированию всего на
свете. Он основан на существующих гениальных моделях и на выдающейся майской способности
хранить огромную историю моделирования.
Я призвал на помощь одного из великих мастеров Полидзен, Яна Зубарева, который легким
движением мыши превратил полигональный куб в полигональную голову. И не просто голову.
Ян сфотографировал своего коллегу Андрея и, немного помедитировав, сделал его трехмерную
копию по фотографии.
Я попросил Яна не удалять историю медитации, то есть моделирования. А затем написал
небольшой скрипт, который превращает историю моделирования в анимацию моделирования.
Скрипт находится на прилагаемом к этой книге CD-ROM'e, он сохранен в файле histUI.
mel. Перед тем, как его запустить, вам надо выбрать полигональную поверхность с историей и
обязательно щелкнуть в Channel Box на имени любой ноды в истории. В процессе работы скрипт
создает длинное окошко, в котором перечислена вся история моделирования. Включая галки на
определенных нодах, можно блокировать их выполнение и тем самым отрезать часть истории. Но
самое главное не это. Скрип делает анимацию со второго кадра, в которой он последовательно
разблокирует все ноды в истории моделирования, тем самым как бы воссоздавая объект с нуля, а
точнее с того места, где была в последний раз убита история. Вы можете использовать этот скрипт
на любых моделях, у которых сохранена история, превращая их в универсальные тренажеры.
Сразу скажу, что скрипт писался для конкретной задачи, то есть для этой главы, и поэтому не
тестировался на профпригодность.
Впрочем, в нашем случае вам не надо в панике пытаться запустить скрипт и разбираться с
его интерфейсом.
Тренажер по моделированию голов уже готов и ждет вас в файле polyHeadStart.ma.
Просто покадрово изучите анимацию, исследуя, что делал мастер на каждом шаге
моделирования. В принципе этого достаточно, чтобы приобщиться к великому искусству Полидзен,
однако мы с Яном добавили некоторые комментарии.
Сразу оговорюсь, что среди мастеров Полидзен существует множество школ по
моделированию человеческих голов. Есть радикальные секты, начинающие моделирование из
левого глаза, есть аскеты, выращивающие головы из губ и полости рта. Есть паталогоанатомические
школы, ведущие все ребра только вдоль лицевых мышц. Но нет самого «правильного и
единственного» способа делать самые лучшие головы. Описываемый далее метод - лишь один из
многих. Смотрите, пробуйте, может быть вам понравится.
Моделирование головы
371
Моделирование головы - не шутка
ШЖУ
В отличие от аккуратных и лаконичных интернет-упражнений, я привожу запись с «живого
концерта», то есть с рабочего процесса. Данный тренажер позволит вам подглядывать из-за плеча
мастера, причем не просто подглядывать, а повторять его шаги многократно.
Еще одно радикальное отличие в том, что здесь не описывается, как надо делать глаз, или
нос, или рот. Идет процесс создания головы в целом, а не «сначала делаем рот», «потом глаз», а
потом все остальное. Модель уточняется постепенно и равномерно на всех участках, изменяясь от
низкополигональной болванки до поверхности нужного разрешения.
Вы можете обращаться с файлом-тренажером как угодно. Можете открыть две копии MAYA
и повторять процесс параллельно. Можете загрузить в этот же файл собственные фотографии,
отодвинув имеющуюся голову в сторону. Можете просто медитировать, проигрывая анимацию.
Настройка Image Plane и искусство фотографии
Итак, открыв файл polyHeadStart.ma, вы должны увидеть готовую голову, а также
фотографии, расположенные в окнах front и side.
Небольшой комментарий про настройку Image Plane и фотографии.
Можно очень долго добиваться сходства модели с фотографиями, однако если изображения
в фас и в профиль не синхронизированы, но будет постоянное ощущение «недопохожести» и
«несовпадения». Когда в промежутке между снимками в фас и в профиль человек чуть наклоняет
голову, происходит такая рассинхронизация.
В идеале надо использовать два фотоаппарата или сажать человека на вращающийся стул
(можно также пойти в фотоателье, где есть такой, специально обученный стул). Сделав один
снимок, надо аккуратно, стараясь никого не насмешить, повернуть стул с фотомоделью на 90
градусов и сделать второй снимок.
Снимки желательно делать с большого расстояния, чтобы избегать искажений типа
рыбьего глаза, присущих снимкам на коротких фокусных расстояниях. Потом можно увеличить
изображения в Фотошопе, благо запас мегапикселей, как правило, позволяет это делать.
Если человек все же пошевелился и вы чувствуете, что фотографии «разошлись», поверните
один из снимков в Фотошопе. В нашем случае именно это и было сделано, что отчетливо видно на
Image Plane.
Вместе с файлом откроется небольшое окошко, которое имеет смысл растянуть и оттащить
в сторону, оно может пригодиться для блокировки нод в истории моделирования.
372
Книга Сергея Цыпцына
Можете проиграть анимацию и насладиться процессом сборки головы. Когда окончательно
насладитесь, перейдите во второй кадр и пронаблюдайте сакральный куб, из которого получилось
лицо.
Так как в дальнейшем будет использоваться Smooth Proxy, имеет смысл пока его отключить.
Будем следовать естественному ходу событий.
Для этого в Layer Editor снимите галки, определяющие видимость базовой и сглаженной сетки.
Примечание. Признаюсь, что оригинальная голова была сделана с помощью
скрипта Connect Poly Shapes, уже упомянутого выше. Дабы оставаться в рамках
стандартного набора инструментов, я поколдовал в Hypergraph и сделал мирроринг
с помощью Smooth Proxy. Впрочем, вы вольны делать с половиной головы, все что
угодно.
Обратите внимание, что в загадочном окошке, возникли все галки напротив названий
полигональных операций. Это значит, что все операции заблокированы и модель вернулась к
своему исходному состоянию первобытного кубика. Промотайте окошко вниз, чтобы наблюдать,
как какие ноды будут появляться (разблокироваться) по мере процесса моделирования.
Процесс моделирования
Итак, в начале был кубик...
Кубик был успешно сглажен операцией Smooth, чтобы не резать его вручную. Мы просто экономим
время.
Моделирование головы
373
Далее с помощью Split Edge Ring Tool проводится круговой сплит, чтобы получить новую
< изопарму».
Масштабируем-растягиваем только что вставленные вершины, подгоняя их под форму
черепа.
374
Книга Сергея Цыпцына
Еще один сплит и растяжение вершин. Возможно, этот сплит пока не нужен, но рано или
поздно мы его сделаем, а сейчас приятнее смотреть на модель , когда она «круглая» не только
спереди, но и на затылке: так лучше чувствуется объем.
Еще пара горизонтальных сплитов с растяжением.
Моделирование головы
375
ниш
То же самое для продольного направления около плоскости симметрии.
^i*IU: .: ....-,, ,...:,;„ ,, ,
Стоп-стоп. Мы начинаем делать лишнюю работу. Пора переходить к симметричному
моделированию.
Удаляем половину граней лица.
Теперь пора сделать Smooth Proxy. Это уже было сделано в этом файле-тренажере.
Поэтому включите в Layer Editor оба слоя для pCubelProxyMesh и pCubelSmoothMesh. Это
позволит работать с любой половиной лица.
Дальше вы можете работать, как вам удобнее, с точки зрения отображения базовой
и сглаженной сетки на экране. Помните, что прозрачность базовой сетки контролируется
соответствующим материалом (lambert3). Если вы любите несглаженную сетку, оставьте только
ее в Layer Editor и сделайте ее непрозрачной.
376
Книга Сергея Цыпцына
Неистово таскаем вершины, для того, чтобы подогнать полученное «яйцо» под форму черепа.
Совет. Следите за швом. Он должен оставаться в вертикально плоскости.
Теперь пора уточнять геометрию. Сначала займемся глазом и носом. Для них надо
приготовить грани, которые можно будет вдавить или экструдировать. Делаем пару сплитов, там,
где будет бровь.
Моделирование головы
377
Делаем сплит «под носом».
Орудуя вершинами- в side и front, задаем форму глаза и носа.
Совет. Таская вершины, не «сидите» долго в окнах side и front, почаще глядите в
перспективу. И вообще, крутите свою модель пояростнее, огяадывая ее со всех
сторон. В том числе включая окно top.
Добавьте сплит, чтобы очертить форму рта, заканчивая его у крыльев носа. Думайте о лицевых
мышцах. Отключите сглаженную сетку, сделайте базовую поверхность непрозрачной.
378
Книга Сергея Цыпцына
Еще один сплит для того, чтобы окончательно отделить глазную впадину и обозначить мышцу на
щеке.
Вспоминаем про то, что надо избегать треугольников, и с ненавистью удаляем горизонтальное
ребро на щеке.
Моделирование головы
379
Убирать лишние ребра надо всегда и сразу. Добавить компоненты и усложнить модель
всегда успеем, а вот основную массу желательно задавать именно наименьшим количеством
вершин.
Примечание, Имейте в виду, что голову делают «по правилам» примерно до кадра
50, а потом все становится более-менее понятно. Дальше уже видно, где нужно
добавить, а где можно убрать.
Теперь самое время потаскать вершины, чтобы задать форму глаз, подбородка и других только
что созданных деталей.
Зададим форму нижней губы, сделав еще один сплит.
Избавимся от треугольников, удалив два ребра с помощью Delete Edge. (Клавиша Delete дает
совсем другой результат!)
380
Книга Сергея Цыпцына
Опять потаскаем вершины, уточняя форму носа, бровей и пр. Обратите внимание, что нос не
обозначен полностью, а задан как бы «вполсилы». Это сделано потому что позже тут будет экструд
и именно им будет задан нос. В любом случае, в данный момент недостаточно вершин для более
детального обозначения носа.
«Вдавим» глаз. Выберите глазную грань и экструдируйте ее, сжав вовнутрь. Вдавите ее в голову,
таская точки.
Моделирование головы
381
Выберите три грани на носу и экструдируйте их вдоль мировой оси Z. Не забудьте про манипулятор,
переключающий мировые и локальные смещения.
Удалите грань на переносице.
Подтяните со снапингом вершины переносицы ко лбу, заклеив дыру. Не забудьте выполнить Merge
Vertices, чтобы склеить двойные вершины.
382
Книга Сергея Цыпцына
Придайте форму носу, ориентируясь на фото и таская вершины. Вершины на щеке должны
закрываться крыльями носа.
Делаем новый сплит от середины глаза до верхней губы. Затем таскаем точки, придавая форму
верхней губе и крыльям носа.
Моделирование головы
383
Мы немного «наваляли» в районе рта. Исправим ситуацию. Удалим три ребра на нижней губе с
помощью Delete Edge.
Сделаем два сплита, чтобы иметь нормальное четырехугольное пересечение.
Примечание. Если вас окончательно «достало» пересечение ребер передней и задней
части головы на экране в окне front, то надо просто придвинуть поближе Image
Plane. Для этого вызовите Attribute Editor с атрибутами Image Plane и задайте
там Center 1 = -1.
384
Книга Сергея Цыпцына
Придайте форму губам.
Далее пойдет процесс избавления от некоторых пережитков первоначальной формы
кубика. Если вы помните, мы сгладили кубик и вставили парочку «изопарм», чтобы сэкономить
время и сразу определить объем. Однако не все изначальные ребра располагаются в нужных
местах и имеют нужное направление. Поэтому придется потратить некоторое время на вставление
новых ребер и удаление ненужных.
При этом следует руководствоваться анатомическим строением головы, а точнее - ее
мышечным устройством. Если взглянуть на какую-нибудь картинку из анатомического атласа,
можно увидеть, что вокруг глаз и рта располагаются кольцевые мышцы. На других участках
преобладают продольные. Используйте эти направления для вставки и ориентации ребер на
модели.
Моделирование головы
385
Вставляем два сплита на щеке и удаляем ребро, избавляясь от треугольников.
Вставляем еще два сплита, обозначая челюсть, и опять удаляем ребро, избавляясь от
треугольников.
386
Книга Сергея Цыпцына
Делаем длинный сплит вдоль виска и немного тащим вершины на голове назад, чтобы разровнять
сетку и сделать течение ребер более «мышечным».
Делаем еще один сплит в районе челюсти и удаляем слева два ненужных ребра. И не забываем
удалить оставшуюся вершину между ними.
Моделирование головы
387
lyjjjj
Таскаем вершины, скашивая подбородок, так как собираемся вставить туда еще один ряд ребер
для более «острой» формы.
Вот тут магия заканчивается. Если вы колдовали и медитировали правильно, то на этом
этапе, вы должны уже видеть хотя бы отдаленное сходство с оригиналом.
Если нет, медитируйте дальше: таскайте вершины, смотрите, не торопитесь, крутите
модель в окне, снова двигайте вершины, пока не добьетесь хоть какого-то сходства.
Вы скажете, что вершин мало и что еще ничего не видно. Но в том-то и фокус! Чем меньше
вершин, тем меньше «пухнет мозг», пытаясь превратить облако точек в воображаемую форму.
Именно сейчас необходимо разглядеть и уловить конечный результат - все остальные действия
ведь будут украшательством и чисткой мусора. Если проскочить этот момент, вы потом просто
замучаетесь таскать вершины, пытаясь придать похожесть: вершин будет очень много, а еще
будет тьма деталей и ускользающий объем.
Все, что будет дальше - это трудовые будни. А магия закончена...
Делаем мощный круговой сплит от середины носа до середины подбородка, следуя кольцевой
структуре мышц.
388
Книга Сергея Цыпцына
В рамках мировой программы по борьбе с треугольниками яростно удаляем зловредную треугольную
грань на щеке.
Получившуюся дыру ловко зашиваем, просто стягивая и сшивая две вершины на границе в одну
точку, выбрав их и применив Merge Vertices.
Придаем форму подбородку, двигая точки. Заканчиваем прохождение вертикальной «изопармы>
в углу рта очередным сплитом.
Еще один круговой сплит для того, чтобы обозначить губы. Как видите, если придерживаться
четырехугольников, сплиты получаются в виде изопарм.
Моделирование головы
389
Разбираемся со сплитом в районе уха. Двигаем вершину и удаляем ребро с помощью Delete
Edge.
Еще сплит, выравнивание вершин на темечке и удаление ребра.
Наводим порядок в нижней части. Ровняем вершины челюсти.
390
Книга Сергея Цыпцына
Вставляем сплит и выравниваем линию ребер от брови до затылка.
Рассекаем длинным сплитом область от угла глаза до затылка. Вдавливаем уголок глаза за
вершины.
Рассекаем коротким сплитом середину брови, чтобы обеспечить ее изгиб. Выравниваем форму
глаза, таская вершины.
Моделирование головы
391
Орудуя сплитом, добавляем новые ребра во внутренний угол глазной впадины.
Таская точки, придаем глазной впадине форму ... правильно, впадины!
392
Книга Сергея Цыпцына
Экструдируем главную глазную грань вовнутрь. Немного тащим вершины внутри экструда.
Добавляем кольцевой сплит от кончика носа и куда положено. Придаем форму носу.
Как видите, в отличие от стройных интернетовских упражнений, мастера Полидзен не
добавляют сразу все кольцевые сплиты вокруг рта или вокруг глаза, а работают постепенно, уточняя
модель на разных участках, сохраняя общую грубость. Кроме того, надо же сходить покурить,
отвлечься, съездить в отпуск, сменить тему или работу, а вернувшись, так трудно вспомнить, на
каком безумном сплите остановился в последний раз.
Делаем длинный сплит от крыльев носа до области начала шеи. Еще одним коротким
сплитом готовимся к последующей работе с шеей.
Длинный слит заканчиваем просто там, где удобно. Не стоит вести его дальше, это только
наплодит вершин. Короткий сплит нужен лишь затем , чтобы сделать там четырехугольники.
Моделирование головы
393
Перекур. Или чашка чая... Вернувшись, выравниваем область шеи.
Специально отвлекаемся от рта, чтобы не
прорабатываем область глаза и носа.
<мылить» глаз. Делаем круговой сплит вокруг глаза и
394
Книга Сергея Цыпцына
Добавляем длинный сплит от ноздри до области шеи. Делаем короткий соединяющий сплит и
удаляем ненужное ребро.
Неистово крутим модель. Добавляем два сплита: по боковой стороне носа и в углу глазной
впадины.
Замечаем, что мы неловко сдвинули точку на кончике носа. Возвращаем ее на место, в плоскость
симметрии.
Моделирование головы
395
Критически и недовольно осматриваем модель. Залезаем внутрь глаза и, с помощью сплита и
удаления ребра, исправляем небольшой косячок, избавляясь от треугольника.
Немного раздвигаем полученную впадину.
Выбираем две грани на крыльях носа и экструдим их немного. Нам понадобится дополнительный
объем, чтобы сделать крылья носа. Можно обойтись и сплитом однако надо же вносить разнообразие
в работу, чтобы не сойти с ума.
396
Книга Сергея Цыпцына
Подгоняем вершины носа под фотографию.
Еще один продольный сплит вдоль носа с последующей коррекцией вершин,
деликатная деталь, требующая проработки и приличного количества вершин.
Все-таки нос -
Моделирование головы
397
Если сплит не был доведен до губы, это можно сделать сейчас и доправить форму носа.
Вставляем два сплита для ноздрей и задаем их форму.
398
Книга Сергея Цыпцына
Выбираем две грани для отверстия ноздри и экструдим их, сжимая при этом.
Еще раз экструдим грани и вдавливаем их внутрь носа.
Критически смотрим на голову. Недовольно щуримся.
Делаем тотальное редактирование формы носа и глаз.
Моделирование головы
399
Делаем еще один кольцевой сплит для губ.
Сдвигаем точки вниз, в соответствии с линией губ на фото.
Еще один кольцевой сплит и множественные коррекции вершин. Самая распространенная ошибка
и критическая область - это уголки губ. Их очень часто делают слишком острыми (а в лице нет
острых углов ) и забывают утапливать их внутрь по отношению к щекам. Утащите уголки губ внутрь
и сразу увидите более живой, чувственный рот.
400
Книга Сергея Цыпцына
Длинный продольный сплит для уравновешивания общего разрешения и, как обычно, последующие
небольшие правки. Кроме того, эта облать будет активно работать при анимации, поэтому здесь
необходимы дополнительные вершины.
:-|g|xl
Еще один уравновешивающий сплит и его правка на щеке.
Удаление треугольника на щеке путем проведения длинного сплита, удаления ребра с помощью
Delete Edge и последующей правкой области щеки.
Моделирование головы
401
Небольшой сплит в самом углу рта и приподнятие уголков рта в соответствии с фото.
Удаляем большую «изопарму» из ребер за ухом с помощью Delete Edge, так как она нам просто не
нравится. Она не несет полезной информации и отвлекает глаз.
Соседние ребра выравниваем для равномерного распределения.
Наливаем себе кофе. Звоним другу. Снова крутим модель. Обнаруживаем место для очередного
сплита от глаза до верхней губы. Вонзаем его и, по привычке, тут же правим вершины. Этот сплит
даст нам больше контроля над геометрией не только глаза, но и верхней губы, так что одним
выстрелом мы приканчиваем двух зайцев.
Всаживаем аж три сплита в район глаза и переносицы.
402
Книга Сергея Цыпцына
Тут же правим эту область и удаляем ненужное «треугольное» ребро.
Ведем небольшой сплит от переносицы кверху. Правим эту область.
Моделирование головы
403
Примечание. Обратите внимание, что, несмотря на соблазн вонзить сразу
длиннющий сплит через всю поверхность, чаще всего ребра добавляются довольно
экономно и только в той области, где в данный момент ведется правка. Всегда
можно продолжить «изопарму» позже. В этом преимущество полигонов.
Наводим порядок в углу глаза. Выбираем ненужные ребра и удаляем их с помощью Delete Edge.
Опять-таки обратите внимание: клавиша Delete дала бы совсем другой результат!
Делаем еще два сплита в районе брови и переносицы.
Выбираем три грани над переносицей и безжалостно их удаляем.
404
Книга Сергея Цыпцына
№
Почему? В жизни каждого художника бывают моменты, когда он понимает, что
нагородил лишнего и что распутать локальный участок становится все труднее.
Иногда бывает проще удалить часть граней, зашить дыру и быстро перекроить
проблемную область. Благо полигоны, в отличие от сплайнов, позволяют это
делать безболезненно. В нашем случае, на переносице, действительно, вышел
какой-то огород, слишком много граней (это только в книжках и web-упражнениях
все моделируется с первого раза и без ошибок). Поэтому мы удаляем пару граней,
чтобы было понятнее, как сделать их, с одной стороны, меньше по количеству,
а с другой стороны, чтобы сохранять приверженность четырехугольникам. И в
то же время, оставить возможность добавления деталей, если понадобится в
дальнейшем.
Выделяем попарно точки на краях дыры и сшиваем их с помощью Merge Vertices.
Удаляем соседнее «треугольное» ребро с помощью Delete Edge.
Проводим серию из четырех сплитов, чтобы обработать точку типа «звездочка».
Моделирование головы
405
Это - продолжение разгребания «огорода». Наша задача прежняя: меньше граней,
четырехугольники, все в нужном месте. Помните: чемменьше вершин, тем легче их контролировать.
Какой-то прожиточный минимум граней надо поддерживать для работы, но чем ниже удается его
сделать, тем лучше. Но без фанатизма, иначе можете упасть в голодный обморок от истощения.
Серией выстрелов из Delete Edge убиваем ненужные ребра, чтобы оставить любимые
четырехугольники.
Немного таскаем за точки и делаем еще один сплит.
С помощью Delete Edge удаляем поперечные ребра и серию ребер, идущих наверх. Не пригодились.
Понадобятся опять - нарежем, в лучшем виде!
406
Книга Сергея Цыпцына
Мощно таскаем вершины после многочисленных сплитов и удалений, ориентируясь на
фото и полируя форму брови и переносицы.
Продолжаем собирать бровь. Делаем три сплита. И удаляем ребро
Отодвигаемся подальше. Раздраженно смотрим на модель. Глобально таскаем вершины, особенно
в верхней части головы.
Моделирование головы
407
или
Правим ситуацию над бровью. Вставляем ребро сплитом. Удаляем соседнее ребро и
равняем точки вокруг.
Примериваемся к жирной грани на лбу. Пробуем различные варианты рассечения.
Сомневаемся. Останавливаемся на одном из них. Общий принцип можно сформулировать так: в
малоподвижных - с точки зрения анимации - областях грани могут оставаться более «жирными»,
а на сильно деформирующихся участках нужно делать грани поменьше.
Обнаруживаем пятиугольную грань в районе переносицы.
Сечем ее сплитом и подтаскиваем точки.
Делаем диагональный сплит. Удаляем «треугольное» ребро. Немного тащим точки.
Вставляем сплит из трех ребер. Опять удаляем ребро.
Еще один кольцевой сплит вокруг рта с традиционным двиганием точек.
408
Книга Сергея Цыпцына
Короткая очередь из трех сплитов на лбу.
Плюс критическое редактирование области носа.
Грани на скуле кажутся нам жирными. Сечем их сплитом и выравниваем вершины.
Моделирование головы
409
Продолжаем сечь жирные грани.
Длинный сплит около челюсти, удаление ребра и коррекция точек.
Область в углу глаза явно нуждается в правке. Делаем три сплита и удаляем ребро с помощью
Delete Edge.
Тут сам напрашивается короткий двухреберный сплит (длинный сделаем позже).
И тотальное редактирование области глаза.
Move Components - очаровательная операция. Позволяет получить манипулятор типа Extrude Face,
но не добавляет новых граней. В данном случае, это просто проба пера. Никто ничего не двигал!
410
Книга Сергея Цыпцына
Если отъехать и приглядеться, то можно заметить, что модель становится катастрофически
похожа на оригинал. Веселеем. Таскаем точки в районе усов, делая равномерную сетку.
Далее начинается процесс улучшения, который может длиться до бесконечности. Делаем сплит
вдоль упитанных граней на щеке и таскаем точки.
Еще один кольцевой сплит и коррекция вершин в районе глаза.
Продолжаем терзать глаз. Вставляем круговой сплит и сужаем его.
Моделирование головы
411
Прорабатываем веко. Для работы с глазом понадобится много вершин, ибо он состоит из
большого количества деталей. Кольцевая четырехугольная топология позволяет безболезненно
вставлять новые круговые сплиты и уточнять форму глаза.
Дополнительных вершин потребует слезная железа в углу глаза. Поэтому вонзаем пять сплитов.
Убираем пару ненужных ребер.
412
Книга Сергея Цыпцына
Радикально прорабатываем угол глаза.
Ведомые жаждой деталей, вставляем еще один кольцевой сплит.
Оставляем его пока в неотделанном состоянии и удаляем внутреннюю грань на дне глаза.
Моделирование головы
413
Добавляем пару сплитов в самый угол глаза.
Делаем окончательную коррекцию области глаза и переходим к шее.
Выбираем нужные грани и делаем экструд.
414
Книга Сергея Цыпцына
Здесь возникает сильно подозрение, что вы уже уловили суть процесса. Если нет, начинайте
главу с начала.
По-моему, уже нет смысла комментировать процесс изготовления шеи, полости рта, а
также финальную доводку. Вы можете сами пронаблюдать оставшиеся 67 шагов и сделать нужные
выводы. Никаких секретов и сакральных трюков финальная доводка не содержит, а продолжаться
она может бесконечно. Напомню, что в нашем примере магия закончилась на 55-м кадре.
Там же заканчивается свод хоть каких-то правил. Дальше идет импровизация. Хочется
заметить, что финальная доводка производится без строгих инструкций - более того, если вы
будете моделировать голову заново, она обязательно получится немного другая с точки зрения
топологии.
Улучшать модель можно бесконечно, ибо идеала невозможно достигнуть, никогда! В
нашем случае можно еще разобраться с верхней губой и потаскать ее вершины. Еще одно не очень
удачное место - скула, можно по-другому перераспределить ребра. Можно также добавить еще
один круговой сплит вокруг рта, непосредственно под носом. И так далее.
Вы можете открыть файл polyHeadTextured.ma и полюбоваться на заключительный
результат. Там представлена окончательная голова с текстурными координатами и тремя
текстурами: для цвета, бампа и блика. Крутите, вертите, изучайте!
Пара заключительных советов
В заключение еще пару советов для финальной доводки и вообще для работы с человеческой
головой. Смотреть на модель надо не только в перспективе - сильнее всего ошибки видны в камере
front и, как ни странно, в камере top.
Надо обязательно закладывать асимметрию в модель, например, разнести слегка глаза
по высоте, одна щека больше другой, одно ухо оттопырено сильнее и т.д. Если этого не сделать,
будет сильно бросаться в глаза строгая симметричность, которой в природе не бывает. Это, кстати,
может быть источником дополнительной работы - Blend Shapes придется делать полностью, а не из
половинок.
Чтобы освежить взгляд, переверните модель вверх ногами. Неожиданно вылезут все
косяки, особенно в районе глаз. Это - магия...
Ищите характерные черты лица вашей модели, причем в самом начале работы. И
постарайтесь сделать их максимально похожими на оригинал, в данном примере это был
характерный рот (у другого человека это может быть подбородок или нос). Если вы сделали его
похожим, а остальные части лица оставили «так себе», то эффект узнавания уже гарантирован.
Сделайте для перспективной камеры побольше фокусное расстояние, чтобы минимизировать
перспективные искажения на экране. Глаза для модели сделайте смотрящими не точно вперед,
а слегка косящими вовнутрь, как будто они смотрят на что-то находящееся поблизости. Сразу
пропадет ощущение дебильности во взгляде. Пока глаза будут смотреть прямо вперед, они
постоянно будут привлекать к себе внимание (именно своей неестественностью) и отвлекать вас от
других деталей. Белки глаз понадобятся, когда дело дойдет до век. Они ставятся по фотографии,
в нужном месте - его, как правило, хорошо видно. Положение вершин века возле носа можно
определить только с помощью глазного яблока.
Если уже готова UV-раскладка и вдруг надо что-то переделать или добавить, то следует
использовать только Split Polygon Tool или Duplicate Edge Loop Tool, тогда UV-координаты не придется
сильно править. И ни в коем случае не использовать Extrude и Bevel, иначе UV-координаты просто
придется переделывать.
Обязательно сохраните файл под новым именем, чтобы не испортить универсальный
тренажер по моделированию всего на свете. Напоминаю также, что с помощью вышеупомянутого
скрипта вы можете превратить все имеющиеся файлы с неубитой историей моделирования в
универсальные тренажеры.
Моделирование головы
415
Subdivision Surfaces
Итак, сабдивы. Как я уже упоминал, первые ссылки на этот тип поверхностей появились еще
в 1976 году, однако методы их быстрого и эффективного вычисления появились лишь несколько
лет назад. Это вызвало шквал интереса к ним с точки зрения компьютерной графики, ибо сабдивы
воплотили в себе все лучшие черты сплаиновых поверхностей (гладкость, непрерывность), а
также главное преимущество полигонов - произвольную топологию.
Я не буду вдаваться в суть их математического описания, скажу лишь, что сабдив можно
грубо представить себе как набор сплаиновых патчей, гладко сшитых операцией Stitch. Причем
чем причудливее и изощренней форма поверхности, тем большее количество патчей требуется
для описания такого сабдива.
Пытливые умы могут взять полигональную поверхность, садистски помять ее, затем
сконвертировать ее в сабдив, а потом полученный сабдив сконвертировать в NURBS-поверхность.
И полюбоваться на количество патчей. Уже один этот опыт должен вызвать ваш священный трепет
перед сабдивами: ведь они умеют хранить в себе огромные наборы патчей, при этом оставаясь
одной поверхностью.
Но это еще не все! Как я уже говорил, сабдив-поверхность можно представить как
результат применения бесконечного количества операций Smooth к полигональному объекту. В
результате каждого применения операции Smooth мы получаем новый и более подробный набор
вершин. Так вот: все эти наборы вершин хранятся внутри сабдива! И мы можем получать к ним
доступ и редактировать поверхность в нужном месте с использованием набора вершин с нужным
416
Книга Сергея Цыпцына
уровнем подробности. Конечно, в конкретных реализациях бесконечное количество уровней не
используется, иначе оперативной памяти не хватило бы для хранения даже одного кубика. В ЛААУА
можно работать с четырнадцатью уровнями вершин.
Кроме того, некоторые умные программы для рендеринга, типа Renderman for Maya, умеют
просчитывать сабдивы совершенно гладко, не разбивая на полигоны.
А где же подвох? Не может же быть все так «шоколадно»! Это верно, за удовольствия
надо платить, и в данном случае платить надо производительностью компьютера, ибо сабдивы
являются вычислительно тяжелыми. То есть требуют изрядной мощности и норовят беспардонно
тормозить, когда речь заходит о сложных моделях. Однако, кого это когда-нибудь пугало? Прогресс
не остановить...
Реализация сабдивов в MAYA
В программе MAYA реализована одна из самых замысловатых вычислительных моделей
сабдивов - иерархические Subdivision Surfaces. Это означает, что поверхность имеет много (максимум
четырнадцать) наборов вершин для различной степени сглаженности и что редактирования вершин
на разных уровнях-наборах иерархически складываются между собой.
Если это звучит слишком замысловато, проделайте небольшой эксперимент.
Возьмите поликуб.
Нажмите «Alt-'» или выполните Modify=>Convert=>Polygons to Subdiv.
Нажмите «3», чтобы улучшить отображение.
Теперь, используя правую кнопку мыши, выберите вершины поверхности. Потаскайте их
и убедитесь, что это вершины бывшего куба, а сам сабдив представляет собой как бы идеальный
Smooth Proxy объект.
Сабдивы
417
ниш
Таким образом, вся информация о «прародителе» осталась доступной в сабдиве.
Выберите любую вершину (или несколько вершин) и контекстном меню (которое я так и
буду дальше называть, имея в виду меню правой кнопки мыши) выберите Refine Selected («Уточнить
выбранное»), чтобы получить доступ к вершинам следующего уровня.
Примечание. Вершины следующего уровня появляются только в окрестности
выбранных точек на текущем уровне. Это мера безопасности. Если показывать все
вершины на всех уровнях, MAYA может упасть от истощения. Как вы понимаете,
на десятом уровне количество вершин трудно поддается счету. Кроме того, так
удобнее вносить исправления только в нужном месте.
Теперь вы можете работать с вершинами нового уровня. Повторите этот трюк несколько
раз. Редактируйте точки на любом уровне.
Обратите внимание, что в Channel Box появится индикатор уровня, который вам нужно
отредактировать.
Спуститься обратно, на более низкие уровни, можно разными способами.
Прежде всего, в контекстном меню можно напрямую выбрать уровень, на который вы хотите
попасть. Имейте в виду, что количество уровней зависит от того, как высоко вы «забрались» перед
этим. Нельзя сразу попасть на десятый уровень, не побывав на нем с помощью Refine Selected. Это
тоже мера безопасности.
418
Книга Сергея Цыпцына
Обратите внимание, что переход на нижние уровни не отменяет выделения с уже выбранных
вершин более высокого уровня.
Заметьте также, что, переходя на нижние уровни, вы видите не все, а только некоторые
вершины, примыкающие к месту последнего редактирования.
Здесь надо упомянуть об иерархическом устройстве и о системе редактирований на разных
уровнях. Дело в том, что MAYA запоминает для каждого уровня вершин все изменения, которые
на нем сделали. Эти изменения в результате складываются снизу вверх, от нижних уровней к
верхним, что дает окончательную форму. Эти изменения (edits) сохраняются только там, где они
были сделаны: ведь нет смысла хранить все вершины всех уровней, куда разумнее хранить только
локальные манипуляции с нескольким вершинами. На поверхности это можно увидеть в виде
сеток - участков разного разрешения. Если сетка редкая, значит в этой области вершины верхних
уровней не были затронуты, если частая, значит кто-то полазил на одном из верхних уровней.
Помните, что редактирования разных уровней наслаиваются друг на друга, как слои в
«Фотошопе» , и, соответственно, будут сохранены в сцене раздельно. Причем, если вы зашли на
более высокий уровень с помощью Refine Selected и ничего там не сделали, то MAYA все равно
отмечает этот участок как отредактированный: вы же там побывали!
Чтобы избавиться от таких помеченных, но не отредактированных вами участков,
существует операция Clean Topology в основном меню Subdiv Surfaces. Для ее выполнения нужно
выбрать объект целиком.
Сабдивы
419
Кроме того, вы можете отменить все изменения, произведенные вам на любом уровне,
просто зайдя на этот уровень, выбрав все (или только нужные) точки и нажав клавишу Delete. Не
бойтесь, это не удалит вершины, это лишь удалит все перемещения, которые вы с ними вытворяли
и которые MAYA тщательно запомнила. После этого можно выполнить операцию Clean Topology,
чтобы облегчить и почистить поверхность.
Итак, вы можете пробираться на любой уровень вершин с помощью Refine Selected и
редактировать на любом локальном участке. Эти редактирования запоминаются отдельно для
каждого уровня. Кстати, спускаться на уровень ниже можно с помощью контекстного меню и
операции Select Coarser («Выбрать более крупный»).
Но это еще не все. Все описанные манипуляции можно производить не только для вершин,
но и для ребер и граней, которые являются полноценными компонентами сабдивов. Помните,
что клавиша Delete выполняет функции Undo (а точнее: Reset Transformation) и не удаляет
компонент.
Примечание. Имейте в виду, что вы можете переключиться на любой уровень с
помощью меню Channel Box или Attribute Editor, но вы ничего там не увидите, пока на
этом уровне не будут сделаны хоть какие-то изменения. А сделать эти изменения
можно, пробравшись на уровень с помощью последовательного повторения Refine
Selected.
Но и это еще не все. Как вы могли заметить, вершины сабдивов не лежат на поверхности,
как для сплайнов. Однако, если вы выберете любую вершину на любом уровне и выполните
операцию Full Crease Edge/Vertex, то поверхность притянется к точке.
Как следует из названия операции, притягивать поверхность можно не только к точкам, но
и к ребрам. Таким образом, вы можете делать острые ребра и шипы в любом месте поверхности.
420
Книга Сергея Цыпцына
Разновидностью операции притягивания является операция Partial Crease Edge/Vertex,
которая осуществляет частичное притяжение поверхности к выбранным компонентам. Следует
заметить, что в отличие от полного притяжения, это просто трюк, состоящий в том, что вместо
изменения статуса выбранных компонент, на следующем уровне берутся соседние компоненты и
немного вытягиваются в сторону выбранной вершины или ребра. Таким образом, операция Partial
Crease Edge/Vertex «замусоривает» более высокий уровень и порождает на нем дополнительные
редактирования. Это просто автоматический способ сделать мягкое «вспучивание» в окрестности
выбранной компоненты.
Два способа работы с Subdivision Surfaces
И что же делать со всем этим «счастьем»? Если уж вы решили использовать сабдивы,
вам предстоит решить, насколько радикально вы будете полагаться на все их преимущества и
бороться с их недостатками.
На первый взгляд, возможность произвольного локального редактирования поверхности
выглядит чудесным подарком для тех, кто занимается органическим моделированием. И это так.
Однако, те, кто не ограничивается моделированием и держит в уме дальнейшую персонажную
анимацию, сразу должны задать себе несколько вопросов:
Как деформеры воздействуют на разные уровни вершин?
Как делать скининг для Subdivision Surfaces с разными наборами вершин?
Как будут взаимодействовать кластеры, назначенные на разных уровнях?
Ох, а как же будут работать Blend Shapes?
И как вся эта махина будет шевелиться?
Те, кто не хочет разбираться в этих вопросах и бороться с неожиданными проблемами
и парадоксами, принадлежат к консервативной группе майщиков, использующих сабдивы
как идеальный Smooth Proxy объект. Эти практичные пользователи моделируют свои объекты
и персонажи преимущественно в полигонах, конвертируя их время от времени в сабдив и
поглядывая, как они будут выглядеть. Когда модель практически завершена, они могут позволить
себе сконвертировать ее в сабдив и, может быть, в редких случаях добавить пару редактирований
вершин непосредственно на сабдиве. Деформеры и скининг в этом случае производятся на нулевом
Сабдивы
421
Ш11.У.
уровне вершин. Поэтому основной задачей становится удачная конвертация полигональной модели
в сабдив, который используется как идеально сглаженная модель.
Примечание. Честно говоря, немало пользователей MAYA считает майские сабдивы
слишком продвинутыми! Иерархичекая структура делает их довольно тяжелыми
и не очень удобными для анимации. Поэтому довольно часто используется
реализация сабдивов от компании Pixar, входящая в пакет Renderman Artist Tools,
которая включает в себя только вершины нулевого уровня и возможность плавного
притягивания к этим вершинам и ребрам. При этом все моделирование и анимация
производятся в полигонах, а сабдивы возникают только на этапе рендеринга - как
идеально гладкая поверхность.
Итак, если вы намерены использовать сабдивы только как гладкую версию созданной вам
полигональной модели, то перед вам стоит задача удачной конвертации полигонов в сабдивы,
ибо последние довольно капризны и не любят «плохой» геометрии. О том, что такое «плохая
геометрия» и как с ней бороться, подробно написано в главе про полигоны, поэтому здесь об этом
больше читать нечего.
Однако если вы хотите немного подробнее познакомиться с поверхностями будущего, то
вам имеет смысл поискать ниже ответы на вопросы, обозначенные выше.
Немного о конвертации
0 пользе операции Cleanup уже было немало написано выше. Она является неотъемлемой
частью процесса подготовки полигональной поверхности к переводу в сабдив. Здесь же я напомню
уже набивший оскомину совет - держитесь четырехугольников! Даже если конвертация пройдет
успешно и ваши треугольники будут успешно проглочены сабдивами, у вас могут возникнуть
неожиданные проблемы не только на этапе анимации, но и в процессе рендеринга. Все зависит от
интеллектуальности вашей программы для финального просчета.
Если вы собираетесь конвертировать сплайновый поверхности в сабдив, я рекомендую вам
сначала перевести их в полигоны, а уж потом в сабдив. Это будет более предсказуемо и гибко.
Если же говорить об обратной конвертации (из сабдивов в полигоны - она имеет смысл,
если ваш игровой движок почему-то не понимает сабдивы, а любимый рендерер ничего не хочет
о них слышать), то нужно сразу определиться, что вы хотите получить на выходе.
Когда вы хотите получить как можно более похожую поверхность и при этом сэкономить
грани, лучше выбрать в Option Box опцию Adaptive и «подрулить» значение Divisions Per Face.
422
Книга Сергея Цыпцына
Если же вы хотите снять слепок с определенного набора вершин (или, иначе говоря,
скопировать только заданный уровень вершин), вам имеет смысл выбрать опцию Vertices и задать
уровень, с которого вы хотите снять полигональную копию.
Два режима работы с Subdivision Surfaces
После того, как вы сконвертировали полигональный объект в сабдив, исходная
полигональная сетка хранится в сабдиве как компоненты базового нулевого уровня. Таская
за вершины этого уровня, вы можете как бы деформировать исходный полигональный объект
и мгновенно получать результат на сабдиве. Однако вы не можете использовать операции
полигонального моделирования для вершин, ребер и граней сабдива.
Однако есть возможность редактировать исходный полигональный объект, не делая заново
конвертацию. Дело в том, что в любой момент можно переключиться в режим Polygon и получить
на экране исходную полигональную сетку.
Используйте для этого правую кнопку мыши и направление на «пол-пятого»
С полученной полигональной сеткой можно делать все, что дозволено делать с полигонами
с помощью соответствующих инструментов. Любые операции будут мгновенно отражаться на
форме сабдива.
Сабдивы
423
Примечание. Полигональная сетка по умолчнаию не имеет материала и
отображается только как каркас, но вы всегда можете назначить на нее материал
и задать для него нужную прозрачность.
Примечание. Если заглянуть в Outliner и включить там отображение Shapes, можно
увидеть, что при переходе в режим Polygon под одним трансформом возникают две
ноды Shape, одна типа subdiv, другая типа mesh.Это может помочь вам понять,
что происходит в сцене, и выбрать в некоторых случаях нужный Shape.
Важно понимать, что переключение в режим Polygon происходит с участием Construction
History, поэтому в Attribute Editor можно разыскать ноду polyToSubdiv и убедиться в Hypergraph,
что формы сабдива и полигона зависят друг от друга.
Все, что вы будете делать с полигональной сеткой, будет накапливаться в ее истории,
однако как только вы вернетесь в режим Standard (то есть к обычному сабдиву), вся история, да и
сам полигональный Shape, будет удален. Когда вы повторно вернетесь в режим Polygon, никакой
истории уже не будет, а будет только полигональная сетка, повторяющая базовый нулевой уровень
вершин сабдива.
Имейте в виду, что если вы сделали какие-то изменения на верхних уровнях сабдива, то
переключение в режим Polygon и произведение некоторых операций типа Split, может привести к
весьма непредсказуемым результатам. Поэтому старайтесь не залезать на верхние уровни, пока
не разберетесь окончательно с базовой сеткой.
424
Книга Сергея Цыпцына
Более того, некоторые операции вызывают ошибку типа:
Error:polyToSubdivl (Poly То Subdiv Node):
The conversion to a subdivision surface failed:
Попробуйте например сделать несколько сплитов, а затем поменять у них в истории атрибут
Subdivisions. Иногда может помочь переход в режим Standard и обратно в режим Polygon. При этом
удаляется история и базовая полигональная сетка пересоздается заново.
Тем не менее, орудуя такими хитами, как Extrude Face и Split Polygon Tool, вы можете
работать в режиме Polygon и наблюдать изменения на сабдиве.
Примечание. Будьте бдительны: если вы, находясь в режим Polygon , удалите
по привычке историю, связь между полигональной сеткой и сабдивом разорвется,
сабдив вернется в режим Standard, а полигональная поверхность останется
болтаться в сцене, пригуппированная к сабдиву и никак с ним не связанная.
Повторный переход в режим Polygon вызовет создание второй полигональной
сетки и т.д.
Кстати, никто не мешает вам выбрать в Outliner именно Shape от сабдива и успешно его
удалить. Это самый быстрый способ сконвертировать базовый уровень сабдива в полигоны.
Как видите, устройство сабдивов весьма логично и прозрачно. Теперь давайте разберем
смежные вопросы, неизбежно возникающие в тот момент, когда заканчивается «скучное»
моделирование и начинается куда более веселая жизнь: анимация, деформация, динамика и
рендеринг.
Динамика и сабдивы. Полный коллапс.
Если вы попытаетесь превратить сабдив в мягкое или твердое тело, то MAYA с возмущением
обругает вас, ибо майская динамика на дух не переносит сабдивы. Однако с помощью режима
Polygon легко ее обмануть.
Возьмите любой сабдив-примитив, например, конус.
Перейдите в режим Polygon.
Превратите имеющуюся конструкцию в активное твердое тело. MAYA скушает ее в лучшем виде.
Сабдивы
425
Однако, если вы заставите, с помощью гравитации, это твердое тело упасть на не менее
твердую полигональную плоскость, то обнаружите, что оно контактирует с плоскостью своей
полигональной оболочкой, а не сабдив-поверхностью. Как быть?
Выходов масса. Можно сконвертировать сабдив в полигоны и использовать полученный
объект в качестве твердого тела, а сабдив припарентить к нему. Однако можно применить более
хитрый трюк.
Дело в том, что с помощью операции Collapse можно превратить любой уровень вершин
в базовый нулевой уровень. То есть вершины, например, второго уровня становятся базовым
уровнем, а нулевой и первый уровень просто исчезают.
Если выбрать в первом кадре конус и выполнить для него Collapse, вы получите абсолютно
такой же конус. Однако, посмотрев на его вершины или перейдя в режим Polygon, вы увидите, что
его базовый уровень совпадает с первым уровнем оригинального конуса.
426
Книга Сергея Цыпцына
Дальше, я думаю, все понятно. Достаточно подобрать уровень, который подходит для
коллизий. Точно также можно поступить и с мягким телом (Soft Body), с той лишь разницей, что
перед созданием оного, нужно выбрать в Outliner полигональный Shape.
Самое главное, о чем стоит помнить: проделывая такие трюки, ни в коем случае нельзя
возвращаться в режим Standard, ибо полигональная сетка, превращенная в мягкое или твердое
тело, тут же пропадет.
Деформация сабдивов
Поскольку деформеры можно назначать не только на сами объекты, но и на их выбранные
компоненты, то здесь все просто. Если вы выбираете сабдив как объект и назначаете на него
деформер, то деформация действует на вершины базового нулевого уровня. В то же время вы
можете выбрать вершины на любом уровне и навалить деформер на них.
Сабдивы
427
Вроде бы все просто, однако держите в уме несколько моментов.
Пока на сабдиве есть деформер (и вообще история), вы не можете переключиться в режим
Polygon. Для этого надо удалить историю.
Если вы удалите деформер с сабдива, то история не пропадет, так как останется скрытая
нода типа ...ShapeOrig. Поэтому историю придется удалять вручную.
Деформировать участок поверхности с помощью разных деформеров на разных уровнях
иерархии вершин - не очень хорошая идея. Деформеры на разных уровнях придется использовать
на свой страх и риск, причем желательно быть уверенным, что их области действия пересекутся
минимально. В самом деле, вам придется помнить про порядок деформаций и одновременно
учитывать, как они складываются между уровнями точек. Старайтесь хотя бы назначать сначала
деформеры на более низкие уровни, а затем на более высокие, чтобы обеспечить адекватный
порядок деформаций.
Кстати, для сабдивов вы можете использовать Sculpt Geometry Tool. Для этого
предварительно перейдите на нужный уровень, выберите вершины участка, который вы хотите
«помять», и вызывайте Sculpt Geometry Tool. Попробуйте переключаться между уровнями прямо
во время покраски, используя Refine Selected.
Blend Shapes и сабдивы
В отличие от других деформеров, если выбрать два сабдива как объекты и сделать между
ними Blend Shape, то морфинг будет производиться не только между вершинами объектов на
базовом уровне, но и между вершинами на всех уровнях. «На всех уровнях» означает, «на тех
уровнях, где есть отредактированные вершины», а вовсе не: «на всех четырнадцати уровнях»!
Даже если вы снимете галочку Check Topology в Option Box для операции Create Blend Shape, MAYA
все равно будет проверять геометрию сабдивов и требовать, чтобы на базовом уровне количество
граней у морфируемых объектов совпадало.
Помните также, что для сабдивов (равно как и для полигонов) морфирование осуществляется
на основе номеров вершин, поэтому хорошей идеей будет изготовление таргетов с помощью
копирования и редактирования одного и того же объекта. Вы, конечно, можете «скрестить слона с
джульбарсом» и морфировать сабдив-тор в сабдив-конус, подобрав количество граней. Но ничего
хорошего из этого не выйдет.
Если вы выберете на каждом объекте вершины на определенном уровне, то Blend Shapes
будут создаваться только для этих вершин. Это может послужить причиной полного хаоса, так как
никаких проверок на принадлежность к одинаковым уровням или на порядок выбора вершин не
производится. Поэтому будьте максимально внимательны при выборе вершин для морфинга или
выбирайте сабдивы целиком, чтобы избежать неприятностей.
428
Книга Сергея Цыпцына
Сабдивы и скининг
Хотя есть возможность прискинить к костям только выбранные вершины на любом уровне,
это не очень хорошая идея. А прискинивать вершины на верхних уровнях к скелету - это даже очень
нехорошая идея. Тем самым дискредитируется сама идея создания и редактирования скининга.
Ведь привязываемая к костям поверхность должна быть как можно проще, то есть иметь не очень
много вершин, для того, чтобы можно было нормально настраивать скининг. Кроме того, привязка
вершин с верхних уровней чудовищно влияет на производительность и интерактивность.
Поэтому сабдив, как правило, выбирают целиком и привязывают к скелету стандартным
способом. В этом случае веса распределяются среди точек базового уровня. При этом надо
убедиться, что вы находитесь в режиме Standard, ибо привязка в режим Polygon может давать
весьма неожиданный результат.
Кроме того, если вы прискините вершины с верхних уровней сабдива, вас ожидает немало
веселых минут при покраске весов этих точек. Естественно, что надо переключиться на нужный
уровень перед тем как редактировать веса. Это можно сделать и в процессе рисования, однако
лучше выбрать прискиненные вершины заранее. Все, что я могу посоветовать, это поставить
несколько ключей на кости и в процессе рисования постоянно шевелить ими, чтобы обновлять
экран.
Если вы привязываете все вершины с определенного уровня, следует убедиться, что они
выбраны ВСЕ. На верхних уровнях часто отображается только часть вершин.
Хорошая идея - применять Freeze Transform перед привязкой сабдива к скелету.
Даже если вы удалите скининг с помощью операции Detach Skin, вам все равно дополнительно
придется удалить историю, чтобы режим Polygon стал доступен.
Рендеринг сабдивов
Плохая новость для всех любителей сабдивов: при рендеринге майским рендером или с
помощью mental ray сабдивы разбиваются на полигоны, точно также как сплайновые поверхности.
Что из этого следует?
Если речь идет об простых органических формах без супер-изысков, то проблем быть не
должно. Вы сделали полигональную модель, сконвертировали ее в сабдив, может быть добавили
пару деталей на первом-втором уровнях, запустили рендер и получили вменяемый результат даже
без особой настройки, так как по умолчанию про просчете сабдивов используется адаптивный
алгоритм разбиения поверхности на полигоны.
Однако если вы сделали иезуитски изощренного ежа, залезая на высокогорные уровни
вершин, вас ожидают проблемы. Это означает, что вам понадобится изрядный запас памяти и
терпения, чтобы настроить рендеринг тонких деталей.
Сабдивы
429
Управлять процессом разбиения поверхности на полигоны в процессе рендеринга можно
для каждой поверхности индивидуально. Для этого достаточно открыть Attribute Editor и найти в
закладке для ноды типа subdiv раздел Tesselation.
Как правило, вам должно хватать настроек алгоритма Adaptive. Если вы видите, что где-то
полезли острые грани и не хватает разбиения, достаточно увеличить параметр Sample Count.
Майский рендер довольно предсказуемо работает с сабдивами. А вот mental ray изволит часто
капризничать и «глючить». Имейте также в виду, что mental ray по-своему трактует значения в
разделе Tesselation. Я могу посоветовать вот что: используйте алгоритм Uniform в тех случаях,
когда у вас появляются артефакты. Для него сразу установите Depth=0 и подбирайте осторожно
значение Sample Count. Другой способ избавиться от артефактов - это создать новую аппроксимацию
специально для mental ray. Это можно сделать через меню Window->Rendering Editors->mental ray-
approximation Editor.
Повторю, что это касается лишь тех случаев, когда у вас есть тонкие детали, сделанные на
высоких уровнях.
В качестве небольшого упражнения проделайте следующие «шаманские» действия.
Откройте сцену subdivMR.ma.
Там находится кубик, у которого сделан шип вытягиванием вершин вплоть до шестого уровня.
Просчитайте его.
Майский рендер дает довольно предсказуемую картину.
Чтобы улучшить тесселяцию, задайте в Attribute Editor для поверхности значение Sample
Count=5.
430
Книга Сергея Цыпцына
А теперь попробуйте просчитать с помощью mental ray.
С обрезанием разберемся позже, а сейчас стоит подивиться на разницу в картинках. Игра
с Sample Count ни к чему не приведет.
Переключаем метод в Uniform. Уводим Depth в ноль (mental ray его игнорирует) и тихонько
задаем Sample Count=5.
Картина радикально изменилась, притом в лучшую сторону. Однако побороть глюк с
отрезанием кончика не так то просто. Используем партизанский метод (логика его использования
недоступна - на то он и партизанский). Открываем в Attribute Editor закладку initialShadingGroup и
набрасываем пустой дисплейсмент материал на канал Displacement Mat.
Считаем. Теперь мы увидим кончик.
Сабдивы
431
Однако тесселяция опять съехала. Безумные игры в разделе Tesselation ни к чему похоже
не приведут: mental ray их просто игнорирует. Тогда применим еще один партизанский трюк,
для того чтобы побороть артефакты: надо создать специальную тесселяцию для нулевого(!)
дисплеисмента. Выбираем сабдив и идем в Window->Rendering Editors->mental ray->Approximation
Editor. Напротив поля DisplaceApprox нажимаем кнопку Create. Идем в Attribute Editor и выбираем
Presets=Fine View High Quality. Считаем. Ждем.
И ни в коем случае не создавайте новую аппроксимацию для Subdivision Approximation.
Иначе вы опять не сможете влиять на тесселяцию.
Описанное «шаманство» было проделано для MAYA версии 7.0. Возможно, что в других
версиях все будет (или было) иначе. Этот пример лишь призван показать, что иерархические
сабдивы и mental ray - довольно веселая комбинация. Если вы являетесь счастливым обладателем
плагина Renderman for Maya, можете попробовать просчитать упомянутую сцену с помощью него.
Просто откройте файл, выберите рендерер и нажмите кнопку Render Current Frame.
Никаких артефактов, никаких обрезаний, никакого разбиения на полигоны! Renderman
не использует тесселяцию вообще, поэтому вы можете приближаться к поверхности как угодно
близко.
432
Книга Сергея Цыпцына
Обратите также внимание на скорость просчета.
Практические советы по использованию сабдивов
Основная масса советов касается улучшения производительности и интерактивности работы
с сабдивами. Когда вы переходите в режим Polygon, выключите в Attribute Editor (в закладке для
ноды polyToSubdiv) обработку UV-координат. Для этого установите UV Treatment=No UVs On Sub-
div.
subdivCubetShapeHtstPoly polyToSubdiv! ] initialShadingGfoup| lambertl | < I »|
Помните: если вы залезаете на верхние уровни, надо время от времени выполнять
Clean Topology.
Используйте опцию Normal в настройках Move Tool. У сабдивов хорошие нормали.
Чем меньше граней будет на нулевом уровне, тем быстрее можно редактировать и
деформировать всю поверхность. Делайте привязку к скелету на нулевом уровне. Если вам очень
хочется сделать это на первом уровне, выполните Collapse и привязывайте получившийся нулевой
уровень. Добавляйте кризы (Crease) в самом конце, когда будете уверены, что больше не будете
менять топологию (то есть экструдить, сплитить, удалять грани). Кризы привязаны к нумерации
вершин, которая может измениться, вследствие чего, кризы перескочат на другие компоненты.
Вы можете использовать Isolate Select при работе в режиме Polygon. Если вы хотите, чтобы
масштабирование вершин на нижних уровнях вызывало также растяжения на верхних, установите
Scaling Hierarchy=Propagate в Attribute Editor для сабдива. Но учтите, что такая «супер-резиновость»
может сыграть плохую шутку при анимации. Я намеренно, не стал включать в книгу практический
пример на моделирование чего-нибудь в сабдивах. Дело в том, что 95 процентов работы, как
правило, проводится в полигонах, после чего нужно проделать чистку и конвертацию в сабдив для
добавления некоторых деталей. Делать упражнение на добавление некоторых деталей я считаю
бессмысленным, ибо это сводится к выбору нужных вершин на нужных участках и перетаскиванию
их в нужные места.
Интернет кишит примерами на моделирование ногтя большого пальца руки с помощью
сабдивов, и они достаточно наглядны.
Сабдивы
433
uv
Курсы кройки и шитья.
Текстурирование полигонов
Если вы смоделировали умопомрачительный шедевр и думаете, что основная часть работы
позади, вы очень наивны и жестоко ошибаетесь. Если вас вдруг посетит ничем не объяснимое
желание отрендерить свою шедевральную модель, и не просто так, а с феерическими текстурами,
то основная (и не самая приятная) часть работы еще впереди. При этом чем умопомрачительнее
ваша модель, тем больше времени вам придется потратить на подготовку ее к просчету.
В среднем по статистике (происхождение которой неизвестно) на текстурирование - даже
нет, на подготовку модели к текстурированию - уходит примерно столько же времени, сколько на
изготовление самой модели. Что же это за ужасающая подготовка? Зачем и когда она нужна?
Начнем с вопроса, когда нужно создавать текстурные координаты. А точнее: когда этого можно
избежать.
Если текстуру, нарисованную в Фотошопе, Пейнтере или Пейнтбраше, на модель (на ее
цвет, прозрачность, бамп и пр.), то, соответственно, текстурные координаты вам ни к чему. Если
ваша модель будет полированно-стальной, стеклянно-прозрачной или матово-серой, настроек
материала будет вполне достаточно, чтобы добиться нужного эффекта без применения текстур.
Если для задания бампа или цвета вы будете использовать только процедурные трехмерные
текстуры (например, Marble или Stucco, UV-координаты вам не понадобятся. Напомню: трехмерные
текстуры не обтягивают модель, а «проступают» на ней в виде узора - там, где поверхность
пересекается с объемом текстуры. Процедурные текстуры задаются не картинкой на диске, а
некоторой формулой-узором (типа шашек или сетки).
Непроцедурную, то есть обычную, битмапную, текстуру можно превратить в трехмерную,
если накладывать ее не обычным, «обтягивающим» способом, а как проекцию. Для этого в MAYA
есть довольно обильные возможности, поддерживающие всевозможные виды проекций.
436
Книга Сергея Цыпцына
В этом случае UV-координаты также не понадобятся, ведь текстуру проецируют на
поверхность, как кинофильм - на экран. Неискушенные умы часто путают проецирование текстур и
проецирование текстурных координат. В первом случае на поверхность проектируется изображение,
независимо от того, есть на объекте текстурные координаты или нет, и никаких новых координат
не появляется. Во втором случае на поверхности создаются текстурные координаты методом
проектирования их с плоскости (плоскостей), сферы или цилиндра, и при этом на поверхности не
появляется никакой текстуры или изображения.
Если вы работает с NURBS-объектами, то текстурные координаты у вас уже есть, они
автоматически порождаются параметризацией и представляют собой идеальную прямоугольную
сетку.
И только в том случае (а это примерно 98 процентов из общего числа случаев), если вам
нужно обтянуть полигональную поверхность (или сабдив) обычной текстурой, вам следует быть
готовым «замапить» или «расшить» вашу модель.
Надо сказать, что создание UV-координат - одна из самых черновых и низкооплачиваемых
работ. Поэтому, если вам обещают интересную творческую работу с использованием программы
MAYA, скромно поинтересуйтесь о характере этой работы.
«Замапливание» терминологии
В понятие текстурирование обычно входит и создание текстурных координат и отрисовка
самих текстур. Я не буду здесь обсуждать приемы рисования феерических текстур и принципы
работы Фотошопа. Основное внимание будет уделено принципам создания текстурных координат,
по которым эти гениальные текстуры лягут на поверхность.
Вот как еще называют создание текстурных координат на поверхности: «создание UV-
координат», «замапливание», «размапливание», «маппинг», «расшивка», «раскройка», «раскладка
UV». А также многими другими, не всегда уместными терминами. В рамках данной главы я буду
использовать «текстурные координаты» и «UV-координаты» как синонимы, отдавая предпочтение
последним.
Компоненты полигональной поверхности типа UV в майском сообществе принято любовно
называть «ювишками». «Правильная» фраза - типа «выберите UV-компоненту» или «перетащите
UV-координаты» - воспринимается кактяжеловесная, а не то и вообще непонятная. Ну нет для них
нормального перевода, как, например, «вершина» для термина «vertex»! Поэтому я, под страхом
обструкции буду так и писать «ювишки». Смотрится чудовищно, но ничего другого я непридумал.
Не писать же «юви-вершины» или «ув-точки»...
Термин shell можно перевести как «замкнутая область в UV-пространстве». Но это
громоздко, поэтому придется как-нибудь выкручиваться, объясняя «на пальцах». Texture Border
будут у нас, так и быть, «границы текстурных областей».
Далее я буду говорить о текстурах, имея в виду, как правило, растровые изображения
- где-нибудь нарисованные, сфотографированные или отсканированные.
Создание UV-координат на поверхности
Теперь вернемся к вопросу, зачем нужно создавать текстурные координаты. Если вы
смоделировали, например, стену, вопрос о том, как положить на нее текстуру, надеюсь, не
стоит... Но если модель - это клешня краба, кактус или даже банальный тор? Как «натянуть» на нее
прямоугольную текстуру. Иначе говоря, как расположить прямоугольную область на произвольно-
изогнутой поверхности. Как ее повернуть, растянуть или деформировать?
Представьте себе: у вас в руках переводная картинка (довольно внушительного размера
и прямоугольной формы), и вы собрались приложить ее к поверхности и получить узор. Если
Текстурирование
437
ШШШ
поверхность - это бутылка, то никаких проблем: вы просто обернете бумагу вокруг бутылки и
получите ровный узор. Если поверхность - сфера, придется помучиться, ибо завернув сферу в
прямоугольный лист, вам придется зажать верхний и нижний край, изрядно их помяв. Если же
взять тор, захочется, чтобы бумага была «резиновой» и растягивалась в нужных местах, чтобы
можно было ею «обклеить» тороидальную поверхность. Если это поверхность - куба, вообще
непонятно, как быть... Можно, конечно, упаковать куб в бумагу, «как в магазине», но удастся ли
перевести узор на боковые грани, вообще непонятно. Проще всего разрезать бумагу на несколько
кусков и каждый кусок прилепить к нужной грани. Именно о таком разрезании и пойдет речь в
данной главе.
В реальности (то есть в нереальности, то есть в MAYA...) все происходит, как правило, в такой
последовательности: сначала создаются UV-раскладки, а уже потом по ним рисуются текстуры.
(Случаи, когда готовую фотографию надо натянуть на объект, редактируя UV-координаты, мы
рассмотрим отдельно.)
Эти нарисованные текстуры часто напоминают разрезанные и уложенные на квадратный
лист кусочки некоторой картинки. Когда текстура натянется на объект, эти кусочки лягут строго в
нужные места.
Итак, как же создаются (лучше сказать: порождаются) UV-координаты на поверхности? (Я не
буду рассматривать случаи использования готовых UV на примитивах.) Можно, конечно, создавать
текстурные координаты вручную, вбивая цифры в клетки, а точнее в Script Editor. Но стандартный
метод генерации UV-координат -спроецировать (или, что то же самое, спроектировать) их откуда-
нибудь.
Представьте себе, что у вас есть сплайновая плоскость, на которой существуют идеальные
текстурные координаты в виде сетки с диапазоном от нуля до единицы. Далее, вы берете
эту плоскость и проектируете ее на ваш полигональный объект, как бы светите сквозь нее
кинопроектором. Вся текстурная сетка спроектируется на полигональную поверхность, точнее,
на ее вершины. Таким образом, в вершинах полигонального объекта появится новая информация
- текстурные координаты, или UV-координаты.
Конечно, если вы возьмете полигональную сферу и спроектируете на нее текстурные
координаты с плоскости точно сверху, вершины на нижней полусфере и на верхней полусфере
получат одинаковые UV-значения. Ведь проекция параллельная. Если вы положите текстуру на
такую сферу, рисунок будет одинаковый и сверху и снизу.
Поэтому существует еще два типа проекционного маппинга текстурных координат. Можно
создать вокруг объекта сферу и спроектировать ее текстурную сетку на поверхность в направлении
к центру сферы. Точно так же можно поступить с цилиндром, проектируя UV-координаты в
направлении оси цилиндра. Значения, которые спроектируются в вершины объекта, и будут UV-
координатами.
438
Книга Сергея Цыпцына
Для начального варианта, естественно, разумно подобрать версию маппинга, наиболее
подходящую форме вашей модели. Для головы, например, это цилиндрический маппинг (ведь
голова, как известно, кубик, а кубик - это цилиндр, только негладкий). Для конечностей - тоже.
Для передней и задней части тела чаще используется планарныи маппинг (проектирование с
плоскости). Сферический маппинг не слишком популярен и используется для текстурирования,
например, воздушных шаров или мыльных пузырей.
Здесь следует сделать важное уточнение. UV-координаты проектируются и создаются не в
самих вершинах поверхности, а в углах граней, примыкающих к этим вершинам. Можно сказать,
что UV-координаты создаются на гранях, но это будет не совсем корректно, ибо они находятся в
углах граней. Точно так же, как вершинные нормали, по одной для каждой грани, примыкающей
к вершине.
Например, в углах куба находятся сразу три пары текстурных координат, по одной для
каждой грани. Эти пары могут быть сшиты (склеены, синхронизированы) в одну пару, а могут
быть разрезаны на индивидуальные пары. (Тут полная аналогия с мягкими и жесткими ребрами.)
К этому мы еще вернемся, а сейчас имейте в виду: выбирать грани поверхности и проектировать
текстурные координаты можно только на них. На соседних гранях могут быть совсем другие UV-
координаты, хотя у этих граней могут быть общие вершины. Сшивка и разрезание текстурных
координат в вершинах - наиболее частое занятие любого текстурного «закройщика». Забегая
вперед, скажу, что текстурные координаты можно разделять на слои (UV-sets), и создавать
несколько таких слоев, чтобы текстура цвета могла лежать в соответствии с одним набором
координат, а текстура бампа - в соответствии с другим.
Немного практики. Освежевание утки. Texture Editor
Не желая сухо описывать все подряд инструменты для раскладывания UV-координат,
решил я, что для вводного знакомства с основными инструментами лучше привести небольшой
пример потрошения утки. Те, кто уже имеет опыт работы с текстурированием (или уже выполнил
пару упражнений из Интернета - http://www.highend3d.com/maya/tutorials/texturing/), могут, в
принципе, пропустить этот пример: он приводится, во-первых, для начинающих, во-вторых - из
некоего чувства приличия. Хотя, в-третьих, я попытался сделать его не совсем тривиальным, так
что если некое любопытство вас гложет, все же пробегите его глазами. А после него будет немало
небесполезной информации.
Итак, откройте файл duckUVstart.ma. Там находится тушка утки (селезня, лебедя, журавля,
птеродактиля). Лапы у птички я предусмотрительно отрезал, ибо их явно можно текстурировать
отдельно, а тратить на них время, мне представляется неразумным. (Модель для издевательств
любезно предоставил Стае Глазов.)
Главный инструмент для работы с UV-координатами - это окно UV Texture Editor, его можно
найти в меню Window. Однако я вам советую располагать его в панели, рядом с перспективной
Текстурирование
439
камерой - для этого достаточно щелкнуть правой кнопкой мыши на полоске со схемами расположения
окон и выбрать Persp/UV Texture Editor.
Если объект выбран, в Texture Editor отображаются его текстурные координаты. Как видите,
утка имеет какой-то набор координат, сделанный по цилиндрической проекции. Эти координаты
проще удалить и сделать заново.
Выполните в меню Texture Editor операцию Polygons=>Delete UVs.
Примечание. Далее я буду ссылаться на операции из меню Polygons окна Texture
Editor. Все эти команды доступны также в основном меню Polygon UVs.
Texture Editor очистится, ибо ему нечего показывать: UV-координат больше нет.
Основная идея изготовления UV-раскладок в том, чтобы найти нужные участки поверхности,
выделитьсоответствующие грани и проектировать на них UV-координаты с помощью планарнои
или цилиндрической проекции. Потом, возможно, потребуется сшить некоторые куски, чтобы
избежать швов на рисунке поверхности.
Беглый взгляд на несчастное животное позволяет выделить верхние и нижние плоскости
крыльев, их переднюю и заднюю кромки. Эти участки проще замапить планарнои проекцией.
Туловище с шеей и ноги лучше обработать цилиндрическим маппингом.
Совет. Очень хорошая идея - создать Quick Select Sets, для последующего быстрого
выбора нужных граней.
Создание Quick Select Sets
Выберите грани на верхней поверхности крыльев и создайте для них Quick Select Set,
назовите его UpWing.
440
Книга Сергея Цыпцына
Совет. Невероятно удобный инструмент для выбора граней - Paint Selection
Tool. Особенно для текстурирования, где необходимо выбирать связные участки
поверхности. Положите этот инструмент на полку и не забывайте про него.
Далее создайте такие же сеты для нижней плоскости крыльев, для передней и задней
кромки. Назовите их BottomWing, FrontWing, BackWing.
Сделайте тоже самое для туловища (Body) и лап (Legs).
Текстурирование
441
При создании сетов и использовании Paint Selection Tool вас поджидают всякие каверзы и
ловушки. Выбрав грани и создав сет, вы наверняка забудете снять выделение с выбранных граней
и начнете выделение для следующего сета. Я, по крайней мере, ошибся раза три. Пришлось
удалять сеты и создавать их заново, это быстрее, чем выковыривать из них лишние грани.
Если вы совсем умучаетесь, откройте файл duckUVstartQ.uickSets.ma. Там уже созданы
необходимые сеты.
Совет. Подменю Edit=>Quick Select Sets со списком сетов нельзя «оторвать»,
поэтому все сеты удобно выложить на полку.
Теперь, вооружившись от хвоста до клюва, можно приступать к проектированию UV-
координат.
Планерная проекция
Выберите верхние грани крыльев (UpWing).
Откройте Option Box операции Polygon UVs=>Planar Mapping.
Задайте значения по умолчанию.
Выберите Mapping Direction=Y Axis. Гораздо быстрее установить ориентацию плоскости
проектирования заранее, чем потом многократно ее вращать и растягивать.
442
Книга Сергея Цыпцына
Нажмите Apply.
В Texture Editor появится развертка для крыльев. Все, вроде бы, хорошо, однако пропорции
крыльев сильно искажены, так как UV-координаты по умолчанию растянуты на весь квадрат - от
О до 1. Когда вы (или кто-то другой) будете рисовать текстуру крыльев, держать в голове, как
искажен размер, довольно утомительно, да и работать с растянутой картинкой просто неудобно.
Сделайте Undo.
В Option Box включите галку Keep Image Ratio.
И снова нажмите Apply.
Теперь развертка крыльев будет близка к оригинальной форме.
Уважайте труд работников Фотошопа!
Текстурирование
443
Примечание. Делать Undo было необязательно. По умолчанию новая проекция
просто заменяет старые UV-координаты на выбранных гранях. Однако в истории
плодятся ноды, отвечающие за проекции.
Совет века. Включите отображение границ затекстурированных областей
на гранях поверхности. Эти границы обозначают, что соседние грани имеют
различные UV-координаты и не сшиты между собой в UV-пространстве. Включить
отображение можно, нажав Shift и правую кнопку мыши и выбрав Toggle Texture
Borders. Или еще десятком способов.
Нажмите правую кнопку мыши в Texture Editor, выберите UV в качестве маски выбора.
Выделите все ювишки (UV) и оттащите полученные развертки налево, за пределы квадрата (не
забудьте включить Move Tool).
Дальше пойдет рутинная работа. Выделите нижние грани крыльев.
Нажмите Apply в Option Box.
Выделите полученные ювишки и оттащите их налево, к предыдущей развертке.
Выделите передние грани крыльев.
В Option Box установите Mapping Direction=X Axis.
Нажмите Apply.
Выделите полученные ювишки и оттащите их вниз за пределы квадрата.
444
Книга Сергея Цыпцына
Сделайте то же самое для задних граней крыльев.
Обратите внимание, что все операции проектирования накапливаются в истории. Удалите
историю. Сохраните сцену как duckUVwingsMapped.ma.
Цилиндрическая проекция
Займемся тушкой. Выберите грани туловища (Quick Select Stes=>Body).
Откройте Option Box операции Cylindrical Mapping. Обратите, что галки, позволяющей
сохранять пропорции, там нет.
Текстурирование
445
Цилиндрический маппинг славится тем, что лихо искажает размеры граней. Так как
заранее предсказать, как «ляжет» цилиндр проекции, довольно сложно, ничего не трогайте, а
просто жмите кнопку Project.
Вокруг утки появится цилиндрический манипулятор. Чтобы его развернуть нужным
образом, нужно разыскать на нем красный Т-образный «локатор» и щелкнуть по нему. Появится
другой манипулятор, позволяющий двигать-вращать-масштабировать проекцию.
Разверните цилиндр «вдоль» утки.
Откройте Attribute Editor и найдите закладку PolyCylProjl, соответствующую проекции
(надеюсь, вы не забыли убить историю перед проекцией).
Задайте rotateY=rotateZ=90, чтобы точно развернуть цилиндр вдоль туловища и сделать
так, чтобы шов был снизу.
Взгляните в Texture Editor и - ужаснитесь...
Пытливые умы, конечно, сообразят, что MAYA по умолчанию сместила цилиндр по высоте,
поэтому картину можно немного поправить, задав translateY=0.
446
Книга Сергея Цыпцына
Однако картина развертки все равно безрадостная. Становится очевидно, что мы забыли
про клюв, а точнее, про его внутреннюю часть. Кроме того, нас приветствует традиционный милый
артефакт цилиндрической проекции - съехавшие ювишки в верхней части.
Не спешите хвататься за сердце и за Move Tool. Подумайте. Похоже, надо скорректировать
ситуацию, для чего придется потаскать ювишки, однако никаких средств симметричного
редактирования, по-видимому, не предусмотрено. Кроме того, как вы собираетесь раскладывать
лапы? Каждую по очереди? Синхронно?
Симметрия прежде всего
По-видимому, насмотревшись в Интернетемногочисленныхупражненийпотекстурированию
космических кораблей, мы забыли про симметрию и по инерции бросились на объект целиком.
Ну что ж, за невнимательность надо платить, но, к счастью, переделывать на данном этапе
почти ничего не надо. А наказанием может послужить излишняя работа, связанная с выбором
симметричных граней при создании Quick Select Sets.
Вспомним принцип моделирования - максимум работы надо выполнять на половине модели
и сшивать ее в последнюю очередь. В этот максимум входит и раскладка UV.
Будем резать пернатое чудовище пополам.
Перейдите в камеру Side.
Выберите и удалите левую половину граней.
Взгляните горестно в Texture Editor. Съехавшие ювишки по-прежнему на месте.
Текстурирование
447
Откройте в Attribute Editor закладку polyCylProjl и убедитесь, что translateY=0.
Задайте translateZ=0.01, и произойдет чудо. Выкройка примет человеческий вид.
Сместив совсем чуть-чуть цилиндр по оси Z, мы как бы немного «надвинули» его на
половину утки, и ось цилиндра ушла из плоскости симметрии. Объяснение работы этой магии
выходит за рамки этой книги.
Примечание. Высота цилиндра проекции определяется атрибутом Projection Height.
Не спешите растягивать высоту так, чтобы утка целиком помещалась внутри
цилиндра. Это не имеет смысла и лишь растягивает UV-раскладку вертикально.
Это же относится к атрибуту Projection Horizontal Sweep, определяющему ширину
раскладки и не влияющему на то, какая часть модели окажется «охваченной»
цилиндром. Воспринимайте их как размеры плоской UV-раскладки. Кстати, если
вы потеряли манипулятор проекции, выберите ноду polyCylProj в Attribute Editor
или Channel Box и вызовите Show Manipulator Tool.
Задайте Projection Height=3, это примерно сохранит пропорции обездоленного животного.
Хотя говорить о пропорциях после цилиндрической проекции приходится с большой натяжкой, и
это ее главный недостаток.
Приведем пока развертку тушки к удобному размеру. «Пока» потому, что позже мы
все равно будем менять размеры всех выкроек - для того, чтобы сохранить пропорции между
расчлененными участками горемычной кряквы.
Нормализация
Выберите все ювишки, полученные цилиндрической проекцией для граней тушки. Это
можно быстро сделать, выбрав грани с помощью Quick Select Set, а затем нажать Ctrl и правую
кнопку мыши в окне Texture Editor.
В полученном меню надо выбрать to UV.
Совет. Комбинация Ctrl + правая кнопка мыши позволяет быстро, очень быстро,
конвертировать одни выбранные компоненты в другие. В нелегком деле кройки и
шитья это очень удобно.
Выполните операцию Normalize UV для выбранных ювишек.
Выкройка «скакнет» в единичный крадрат. Однако сильно растянется.
448
Книга Сергея Цыпцына
Можно, конечно, сделать Undo, и найти нужную галку в Option Box операции Normalize UV,
однако можно воспользоваться историей
Откройте Attribute Editor и найдите ноду polyNormalizeUVI.
Включите галку Preserve Aspect Area, чтобы сохранить пропорции при нормализации.
Нормализация - это приведение в единичный диапазон путем простого сжатия-растяжения.
Сохраните сцену как duckUVbody.ma
Текстурирование
449
Первые удары скальпелем. CutUV
Коль скоро мы наваляли с клювом, придется исправить ситуацию на ходу. Нам нужно
достать и вырезать раскладку для граней внутренней поверхности рта злосчастной пичуги.
Коль скоро эти грани замаплены неправильно, проще их перемапить заново, чем распутывать
цилиндрический хаос. Это еще один повод как следует подумать, прежде чем бросаться кроить
поверхность на участки.
Выделите все грани внутри рта. Их должно быть пять.
Откройте Option Box операции Planar Mapping и задайте Mapping Direction=Y Axis.
Нажмите Project.
Развертка полости клюва уляжется горизонтально в единичный квадрат. Чтобы ее развернуть
450
Книга Сергея Цыпцына
№
вертикально, для удобства совмещения с основной выкройкой для тела можно воспользоваться
атрибутами ноды PolyPlanarProj в Attribute Editor, однако мы сделаем вид, что случайно и давно
убили историю, и сделаем это вручную.
Выберите в Texture Editor ювишки клюва и тут же оттащите их вниз, чтоб не они перепутались
с другим куском развертки.
Сожмите их, банально используя Scale Tool. Откройте Option Box операции Rotate UV и
задайте там Rotate Angle=-90 и нажмите Rotate. Еще немного сожмите выбранные UV.
Теперь выберите две нижних грани в полости клюва.
Сконвертируйте выбор в ювишки, используя Ctrl и правую кнопку мыши.
Текстурирование
451
Нажмите на полке в Texture Editor третью кнопку под названием Flip Selected UVs in V
direction. Выгодное преимущество кнопки перед соответствующей операцией заключается в том, что
ювишки остаются выбранными.
Подтащите выбранные ювишки вертикально вверх, чтобы создать развертку утиной
челюсти.
452
Книга Сергея Цыпцына
Теперь выберите все ювишки для этого куска и сожмите этот лоскут так, чтобы его размер
соответствовал размеру клюва на цилиндрической развертке для тушки.
Оставьте его пока внизу, но помните: мы будем делать зеркальную копию нашей
половины.
Вернемся к туловищу. Если мы хотим, чтобы наши половины сшились без шва, то мы
должны сделать левую границу выкройки прямой и строго вертикальной.
Если мы хотим, чтобы шов, который будет идти по брюху, то есть снизу, тоже был
«бесшовным», то мы должны сделать также правую границу выкройки прямой и строго
вертикальной.
Этим и займемся.
Сначала распутаем углы в районе клюва.
Выберите прямо на модели вершину прямо на верхней половине клюва и посмотрите, где
она находится в Texture Editor.
Выберите эту ювишку в Texture Editor, перетащите ее немного вниз (ведь она должна быть
в углу развертки) и распутайте развертку для передних граней клюва.
Текстурирование
453
Сделайте тоже самое для нижней части клюва.
Теперь распутаем хвост.
На конце хвоста находится грань, куда сходятся и нижний и верхний шов.
Эта грань должна быть половиной закрывающей крышки цилиндра (ведь будет и вторая,
зеркальная половинка). Поэтому две точки на границе поверхности должны располагаться на
левой и правой вертикальной границе выкройки.
454
Книга Сергея Цыпцына
Растащите их и расположите оставшиеся две точки горизонтально между ними.
Распутайте остальные точки, глядя на грани хвоста, старайтесь сохранить их топологию и
расположение.
Не упорствуйте до изнеможения, помните что редактируемый участок занимает крошечную
площадь и неизвестно, попадет ли он в камеру. Вряд ли режиссеру придет мысль заглядывать
утке в ... гузку.
Назначение шашек
Хорошей идеей будет назначение всеми любимой текстуры Checker на поверхность
этого сиротливого чибиса. Она поможет контролировать равномерность накладывания текстуры,
убирать области чрезмерного растяжения, отслеживать швы и дырки. Некоторые мастера UV-дзен
используют свои собственные секретные текстуры (типа квадратиков с цифрами), которые никому
не показывают и хранят на дискете.
Если вы еще не назначили «шашечки» на поверхность, сделайте это.
Задайте им большую частоту повторения, например 24x24.
Отображение текстуры в окне Texture Editor можно контролировать через меню Image. Там для
этого есть масса настроек, самая полезная из который это Dim Image. В зависимости от стоимости
Текстурирование
455
вашей видеокарты, вас поджидают разные глюки с отображением процедурных текстур в окне
Texture Editor. С этим можно бороться с помощью операции UV Texture Baking.
Чтобы окончательно закончить работу с цилиндрической проекцией, выровняем
вертикальные границы выкройки, чтобы сделать их идеально прямыми.
Для этого выберите сначала все ювишки на левой вертикальной границе и нажмите седьмую
кнопку слева под названием Align selected UVs to minimum U Value.
Она соответствует операции Align UVs. После этого все ювишки выровняются по левому краю
строго вертикально.
Сделайте тоже самое для правого края выкройки.
Сохраните сцену как duckUVbodyCylMapped.ma.
456
Книга Сергея Цыпцына
Немного о швах
Как видите, мы продолжаем упорствовать и оставаться в рамках цилиндрической проекции.
Это связано с тем, что, имея две прямолинейных вертикальных границы, мы можем, во-первых,
отзеркалить и сшить вторую половину модели вдоль одного из швов, а выкройка второй половины
будет просто зеркальным отражением уже имеющейся.
Во-вторых, когда текстура «обернется» вокруг двух половин модели, второго шва тоже не
будет, так как встретятся два вертикальных совпадающих шва.
Если вам очень критично не иметь швов ни сверху, на спине утки, ни снизу, на брюхе, то
вы, возможно, захотите остаться в рамках цилиндрического маппинга.
Однако нетрудно заметить, что цилиндрическая проекция сильно искажает пропорции
граней: шея становится толщиной с брюхо. Поэтому я собираюсь нарушить прямоугольность
выкройки и немного растянуть выкройку, чтобы придать ей схожесть с оригинальной трехмерной
формой. Следовательно, я пожертвую бесшовностью на брюхе и приведу правый край раскладки в
более пропорциональное состояние, чтобы контуры утки отдаленно проступили на UV-выкройке.
Здесь, конечно, нужно заметить, что все, как обычно, зависит от задачи. Будет ли это крупный
план, будут ли видны области швов в кадре, насколько резкая или размытая будет текстура?
Поэтому нельзя сказать, как НАДО делать в нашем абстрактном случае. Нельзя также сказать, как
ПРАВИЛЬНО делать.
Также все зависит от мастерства того, кто будет рисовать текстуры. Хорошие мастера этого
дела могут учитывать растяжения и искажения картинки «на глаз», глядя на выкройку и на модель.
В этом случае вы можете себе позволить больше искажений, но более простую раскладку.
Про швы я еще поговорю позже, здесь же замечу, что в обильный интернетовских
упражнениях на текстурирование космических эскадр всегда полагается, что швы - это не
проблема, так как металлические монстры предполагаются сваренными из кусков листового
железа, а раскладки создаются исключительно планарным маппингом.
Скажу по секрету, что, возможно, цилиндрический маппинг в нашем случае - не оптимальное
решение, однако как иначе я вам могу доказать это, кроме как поработав с ним и обнародовав
некоторые его, скажем так, особенности.
Корректировка цилиндрической развертки. UV Lattice
Не забывайте, что нам еще предстоит отзеркалить половину обездоленного бекаса и
разобраться, что происходит с UV-координатами при этом. Сшивать раскладки для обеих половин
мы будем вдоль спины, поэтому важно сохранить прямым левый край раскладки тушки. Правый
край можно «помять», чтобы придать шее, голове и туловищу нужные пропорции.
Для начала разберемся с хвостом. Там, вроде, все просто. Раскладка просто должна
сужаться к левому краю, повторяя очертания хвоста.
Текстурирование
457
Однако, потаскав за многочисленные точки, вы наверняка захотите перетаскивать их все
вместе и как бы «пропорционально». К сожалению, банальный Scale Tool работает плохо, так как
сетка UV-координат совсем неравномерная и непрямоугольная, и выбирать каждый раз ювишки
для масштабирования просто неудобно.
Применим современные методы борьбы с густыми сетками.
Выберите ювишки, относящиеся к голове и захватите один ряд, относящийся к шее.
Шелкните по первой кнопке на полке Texture Editor. Появится магический UV Lattice Tool.
С его помощью придайте форму голове, не трогая левый ряд точек. Согласитесь, что
удобнее таскать шесть точек.
458
Книга Сергея Цыпцына
Совет. Чтобы перемешать одновременно несколько точек решетки, выберите
их вместе, щелкая и нажимая Shift. Если хотите изменить количество ячеек
решетки, щелкните два раза по кнопке инструмента, а дальше все, как обычно.
Заметьте, что можно выбирать новые области точек, не покидая инструмента. Это удобно для
тонкой настройки нужных участков. Хотя тонкую ручную правку никто отменять не собирается.
Теперь выберите три ряда точек, относящихся к шее, и сожмите ее в нужной пропорции.
Доработайте область основания шеи и усилием воли остановите свою тягу к совершенству.
Текстурирование
459
Полный Relax
Перфекционисты, конечно, заметят, что в области глаза присутствует некий хаос, распутать
который, похоже, можно только вручную. Однако есть способ сделать это автоматически.
Выберите точки только внутри глазной области.
Откройте Option Box операции Relax.
Включите там галку Pin Unselected UVs, чтобы не трогать не выбранные точки.
Нажмите Apply и вы увидите, как «расслабилась» выбранная сетка точек.
Не обольщайтесь особо насчет универсальности этой операции. Поэкспериментируйте с
460
Книга Сергея Цыпцына
№
другими областями и отметьте, что данное расслабление довольно сильно искажает некоторые
участки. Это средство незаменимо при распутывании густых сеток. Не забывайте включать
указанную галку, иначе расслабляться будет вся сетка целиком, за исключением границ.
Сохраните сцену как duckUVbodyOK.ma.
Трюки. Blend Shapes для UV-координат
Осталось замапить окорочка мясистого селезня. Хотя они не представляют собой
объект невыносимой сложности и вполне могут быть затекстурированы планарной проекцией
с последующим ручным распутыванием, я приведу трюк, помогающий упростить создание UV-
координат на поверхностях сложной или «кривой» формы.
Идея заключается в том, чтобы взять сложный объект, скопировать его, потом изменить
его форму в сторону более простого объекта (не меняя количества точек), а затем сделать Blend
Shape, чтобы исходная поверхность могла принимать более простую форму. После этого можно
затекстурировать объект в этой более простой форме и вернуться назад, в оригинальное состояние.
Историю, как положено, можно будет убить.
Альтернативным подходом является перенос UV-координат с более гладкого (и,
следовательно, более удобного для текстурирования) объекта на более «сложный». Это
осуществляется с помощью операции Transfer. Ее главное ограничение -необходимость иметь
абсолютно одинаковое количество и нумерацию точек на обеих поверхностях. Об этом в конце
главы будет рассказано подробнее.
Более гладкая и удобная для текстурирования копия часто может быть изготовлена
применением операции Average Vertices, усредняющей позиции вершин и сглаживающей форму
без изменения топологии. Этого же результата можно достичь, интенсивно покрасив поверхность
с помощью Paint Geometry Tool, применяя режим Smooth.
Выберите половину нашей гагары и скопируйте ее.
Отодвиньте в копию в сторону и выберите на ней грани ноги. Это, кстати, удобно сделать, используя
Quick Selection Set для лапы (Legs), который теперь выбирает грани на обеих поверхностях, после
чего грани на исходной модели нужно «развыделить».
Для удобства работы изолируйте выбранный участок в камере: Show=>lsolate Select=>View
Selected.
Текстурирование
461
Теперь перемодельте его, чтобы разогнуть ногу и придать ей вид правильного цилиндра,
сужающегося книзу. Вы сэкономите еще немного времени в будущем, если расположите
поперечные ряды вершин примерно на одной высоте.
Теперь покажите остальную геометрию.
Далее есть два пути. Пытливые умы могут попробовать замапить грани ноги на копии
цилиндрической проекцией, а потом перенести UV-координаты операцией Transfer с копии на
оригинальную поверхность.
Мы пойдем более замысловатым путем.
Выберите оригинальную поверхность, затем копию и выполните Deform=>Create Blend
Shape. После этого удалите оригинальную поверхность, так как она больше не пригодится.
Разыщите атрибуты Blend Shape в Attribute Editor или Channel Box и пошевелите их, чтобы
убедиться, что утка сгибает ногу.
Выпрямите лапу и выберите грани, ей принадлежащие (не забудьте про Quick Select Set).
462
Книга Сергея Цыпцына
Откройте Option Box операции Cylindrical Projection и убедитесь, что галка Insert Before
Deformers включена. Это гарантирует, что в истории сначала создадутся UV-координаты, а потом
объект будет гнуться. Иначе при деформациях, текстурные координаты будут «ездить» вдоль
поверхности.
Нажмите Project.
Полюбуйтесь на отличный маппинг в Texture Editor. Если надо, немного поправьте его, с
точки зрения пропорций. Отодвиньте точки в сторону в Texture Editor, сожмите их и расположите
где-нибудь рядом с выкройкой для тела. Помните, что быстро выбрать ювишки для ноги можно,
выбрав грани и сконвертировав выбор в UV.
Удалите историю.
Сохраните сцену как duckUVbodyFull.ma.
Кройка и шитье. Cut, Move and Sew UVs
Прежде чем рисовать текстуры, надо постараться свести число отдельных кусков к
минимуму. Это стоит делать прежде всего для минимизации количества швов. Ведь вы можете
создавать бесшовные текстуры только прямоугольной формы, которые будут сшиваться вдоль своих
краев. UV-выкройки имеют произвольную форму, поэтому попробуем убрать заранее некоторые
швы. Например, имеет смысл сшить верхнюю, переднюю и заднюю часть крыла в единое целое,
создав развертку крыла, так чтобы можно было нарисовать текстуру без шва на передней стороне
крыла. Задняя кромка вряд ли попадет в область видимости, однако можно пришить и ее тоже,
чтобы минимизировать число отдельных кусков выкройки.
Текстурирование
463
Пока что наши части разбросаны в UV-пространстве довольно произвольно. Это удобно, так
как нас пока не интересует взаимное расположение или компактность, а больше заботит свободное
место: чтобы выкройки не налезали друг на друга.
Займемся крыльями.
Выберите прямо на модели ребра, соединяющие верхнюю и переднюю кромки крыла.
В Texture Editor они появятся дважды, так как эти ребра содержат вершины, в которых
находятся разные UV-координаты для разных граней.
Эти UV-координаты можно сшить. То есть сделать равными, или «слить в одно значение».
Выполните прямо сейчас операцию Sew UVs (sew - это «шить»).
Упс! UV-координаты в вершинах ребер действительно слились в одно значение, равное
среднему арифметическому между ними.
Жмите Undo.
Было бы разумнее ожидать, что один кусок притянется к другому целиком, вслед на
сшиваемыми точками. Именно для этого служить другая операция.
464
Книга Сергея Цыпцына
Выполните Move and Sew. После этого меньший кусок (передняя кромка) подтянется к
большему (верхняя плоскость крыльев). При этом крайние ребра большего куска растянутся (если
необходимо) и повернутся так, чтобы пристыковаться к ребрам меньшего куска.
Однако прежде чем быстро резать (то есть шить) давайте семь раз отмерим.
Жмите Undo.
Выберите выкройку передней кромки (как UV), разверните ее вертикально и расположите
между лоскутами крыльев.
Напряженно подумайте.
Очевидно, что проекцию нижней плоскости крыльев нужно горизонтально «отзеркалить».
Ведь мы использовали единую планарную проекцию в направлении «сверху-вниз» (Y Axis), а не
«снизу-вверх».
Выберите точки «нижнего» крыла и выполните операцию Flip UVs. Для нее также есть
удобная, вторая справа, кнопка на полке Texture Editor.
Текстурирование
465
Еще раз напряженно подумайте. Например о том, как должна выглядеть окончательная
развертка крыла, когда мы сошьем эти три куска.
Наверное, это должен быть лоскут с вертикальными рядами точек посередине. При этом
крылья целиком хочется немного выпрямить заранее, чтобы при сшивании краев искажения,
приходящиеся на границы, были минимальными. А переднюю кромку хочется превратить с
вертикальную полосу, сужающуюся кверху.
Если вам не лень, вооружитесь Lattice Tool, также используйте для вертикального
выравнивания AlignUV и немного поработайте, выпрямляя крылья.
Теперь можно сшивать куски вдоль ребер. Это только на космических кораблях все лоскуты
симметричные, с ровными границами и идеальным выравниваем. Внимательно выберите нужные
ребра и выполните операцию Move and Sew для трех лоскутов.
466
Книга Сергея Цыпцына
Торопливые умы могут сначала попробовать сшить все три куска, не выпрямляя развертки
крыльев, а уж потом распутывать сетку из точек. Это кому как больше нравится.
Те, кого беспокоит судьба задней кромки, должны повернуть ее вертикально, не забыть отзеркал ить,
приставить слева к основному лоскуту и подогнать ее форму и пропорции под границу лоскута.
А затем пришить ее, с помощью все той же Move and Sew.
Сохраните сцену на всякий случай как duckUVsew.ma.
Автоматическая мозаика. LayoutUV
Для сборки всех кусков в единичный квадрат можно, конечно, перетаскать их все руками,
однако проще воспользоваться автоматическим сборщиком кусков.
Выберите нашего рябчика как объект и выполните операцию Layout UVs.
Текстурирование
467
Все куски расположатся в единичном квадрате, причем их сжатие-растяжение будет
произведено с учетом пропорций между ними. Это основное преимущество этой операции.
Далее вы вольны располагать лоскуты, как вам заблагорассудится, а точнее - так, как
будет удобнее рисовать текстуру.
Однако, если приглядеться, можно заметить непонятный кусочек в виде отрезка в правом
нижнем углу.
Если вы забыли вовремя включить отображение Texture Borders (как это сделал я), то могли
прозевать очаровательную особенность цилиндрической проекции «разрезать» UV-координаты
вдоль некоторых ребер в районе оси цилиндра.
Если выбрать эти ювишки в Texture Editor, то можно обнаружить их на хвосте утки. Они
принадлежат последней квадратной грани.
468
Книга Сергея Цыпцына
Чтобы ликвидировать швы вокруг этой грани, надо просто сшить эти ювишки с остальной
частью корпуса утки.
Выберите эти четыре ювишки и выполните операцию Move and Sew.
В принципе можно закончить работу, но давайте подумаем о том, кто будет рисовать
текстуру. Если это будете вы сами, позаботиться о себе, любимом, будет крайне полезно.
Сориентируем и отмасштабируем куски так, чтобы было удобнее рисовать соседние части
текстуры.
Выберите ребро, соединяющее крыло и тушку на спине. Посмотрите, где оно находится в
Texture Editor.
Выберите все ювишки крыла.
Разверните и переместите выкройку крыла так, чтобы ребра были рядом. Сожмите крыло
так, чтобы ребра стали примерно одного размера.
Текстурирование
469
Теперь оттащите крыло в сторону. Теперь оно ориентировано более удобно для рисования
и имеет пропорциональный размер. Впрочем, это не универсальный трюк, потому что иногда нужно
прорисовывать некоторые части с большим разрешением (например, в местах будущих растяжений
и сгибов), поэтому размер некоторых куском может быть умышленно и непропорционально
увеличен.
Нет смысла ориентировать выкройку лапы под место сшивания. Ее, возможно, удобнее
будет рисовать «горизонтально». Просто разверните ее на 90 градусов.
Помните также о том, что выкройка полости клюва, должна иметь вертикальный край, так
как будет сшиваться с зеркальной половиной.
В конце концов спросите себя (или художника), как вам будет удобнее рисовать текстуру:
головой вниз или вверх? Возможно, имеет смысл перевернуть выкройку.
Сохраните сцену как duckUVhalfOk.ma.
470
Книга Сергея Цыпцына
№
Зеркалирование и сшивание половин
Выберите половину нашего меланхоличного буревестника как объект.
Откройте Option Box операции Mirror Geometry.
Задайте направление зеркалирования Mirror Direction=+Z и убедитесь, что галка Merge
Vertices включена.
Нажмите Mirror.
Посмотрим, что случилось с UV-координатами на целой сшитой модели.
А с ними, похоже, ничего не случилось. В Texture Editor по крайней мере, все осталось
как прежде. На самом деле, для новых граней UV-координаты просто скопировались и остались на
прежних местах.
Если поглядеть на шашечки, можно увидеть, что вдоль спинного шва текстура просто
зеркал ируется. Для любых узоров это, конечно, будет сильно заметно, поэтому надо сделать так,
чтобы изображение не отражалось зеркально, а просто накладывалось на тушку целиком.
Для этого надо выделить все ювишки левой половины тушки и отзеркалить их горизонтально
в окне Texture Editor.
Проще всего это сделать следующим образом:
Выберите прямо на модели любую неграничную ювишку.
В окне Texture Editor нажмите Ctrl и правую кнопку мыши и выберите меню То Shell
Примечание, Команда То Shell - гениальная команда! Она позволяет выбирать все
ювишкиу принадлежащие одному замкнутому куску выкройки. С ее помощью удобно
растаскивать перекрывающиеся лоскуты и распутывать густые сетки.
Текстурирование
471
Выбранные ювишки для левой половины тела, надо отразить зеркально-горизонтально.
Причем желательно сделать это вокруг левой границы, а не вокруг локального центра
выделения.
Поэтому откройте Option Box операции Flip UVs и задайте там Direction=Horizontal,
Coordinate=Global.
ilfl Polygon Force UV Options
Edit Help
Normalize Flip | Carnefa ] Unitize j
Direction (* Horizontal
Coordinate <"" Local
JnJ>
' Vertical
fr Global
2l
Appfy and Close
Apply
Close
Нажмите Apply and Close. He пугайтесь, ненавязчивый сервис выбирает для вас все только
отраженные грани. Выберите любую ювишку.
Имейте в виду, что полученная развертка хоть и кажется единым целым, но не сшита вдоль
вертикальной границы. Об этом свидетельствует толстая линия, обозначающая край текстурного
«куска».
Примечание. Обратите также внимание, что сшивание полигональных вершин
при зеркалировании геометрии никак не влияет на сшивание UV-координат в этих
вершинах. Это - два независимых процесса.
Имеет смысл сшить UV-координаты вдоль шва, чтобы потом их случайно не растащить.
Проще всего выбрать вертикальные границы выкройки прямо на модели, выделив все
ребра вдоль спины, от клюва до хвоста. Когда дойдете до хвоста, наверняка увидите изящный
хвост, завязанный бабочкой. Это последствия не проконтролированного слияния вершин. Если вы
еще не убили историю, это дело легко поправить.
472
Книга Сергея Цыпцына
Разыщите в Attribute Editor закладку PolyMirrorl и задайте там, чертыхаясь, Merge Tresh-
hold=0.01: вы ведь заметили, что такого параметра не было в Option Box операции Mirror
Geometry?
Продолжайте выделять ребра от клюва до хвоста, пока не будете готовы сшить выкройки
для туловища. Выполните операцию Sew UVs. Ее отличие от Move and Sew UVs в том, что она не
двигает один кусок целиком к другому, а лишь тянет ювишки для выбранных ребер навстречу к
друг другу, усредняя и сливая их в одно значение. Если ювишки находятся в одном месте, они
просто сшиваются и граница между кусками в Texture Editor ликвидируется.
Теперь выберите все куски в Texture Editor и сдвиньте их направо, чтобы они поместились
в единичный квадрат.
Если вы подгоняли размеры выкроек для крыльев и лап, можете подвигать их дополнительно,
добиваясь относительной «бесшовности» в местах крепления лап и крыльев.
Текстурирование
473
На этом можно, в принципе, закончить.
Сохраните сцену как duckUVfinished.ma.
Из недостатков полученной выкройки можно отметить растянутость текстуры на боках
тушки. Этого можно было избежать, более аккуратно разровняв сетку либо с помощью Lattice
Tool, либо вручную, в тот момент, когда мы задавали пропорции головы и шеи.
Сохранение UV-выкройки в файл
Однако самый главный результат этой титанической орнитологической работы заключается
в сохранении UV-выкройки в виде обычного изображения, для того, чтобы его можно было затащить
в Фотошоп, положить на нижний слой и рисовать сверху текстуры.
Выберите свою мясистую кукушку и выполните операцию UV Snaphot. Задайте нужное
разрешение и путь к файлу и нажмите ОК.
Совет. Хорошей идеей может быть назначение только что полученного рисунка на
саму модель в качестве текстуры. Это позволить быстро увидеть ошибки, если
они конечно есть.
474
Книга Сергея Цыпцына
Совет. Вы можете положить полученную картинку не только на самый нижний
слой в Фотошопе, но и дополнительно на самый верхний, чтобы периодически
накладывать его сверху, на все остальные слои.
Совет. Не забывайте убивать историю!!!!
Немного про текстуры
Поскольку я обещал не касаться вопросов об искусстве рисования умопомрачительных
текстур, я не буду рассказывать о том, как пользоваться Фотошопом. Если вы все же испытываете
острую потребность одеть нашего пингвина в сногсшибательную текстуру, вы можете нажать
кнопку «8», выбрать кисть Paint Effects и перейти в режим рисования по плоскости. Используя
кисти из раздела Feather, вы можете вдоволь порезвиться.
Не забудьте включить бесшовность изображения по обоим границам (Canvas=>Wrap) и
помните, что панель рисования имеет собственную операцию Undo.
При рисовании текстуры надо учитывать целый ряд аспектов.
Будут ли модель сглаживаться? Если да, что стоит ее сначала сгладить, и использовать
UV-раскладку сглаженной модели.
Если готов план движения и расположения камеры, следует оценить, насколько крупно
поверхность модели будет показана в кадре. Из этого вытекает разрешение текстуры.
Следует оценить количество швов и их видимость в кадре. От этого зависит размытость или
Текстурирование
475
шшш.
резкость текстуры, ее визуальное качество. В случае с нашей выхухолью нужно нечто среднее
между использованием глухой одноцветной заливки и небольшим количеством цветных пятен с
мягкими размытостями вдали от швов. Так, чтобы на швы приходился один и тот же цвет.
Возможно, что для вас открытием сезона станет возможность рисования текстуры прямо на
поверхности, в окне перспективы. Использование 3D Paint Tool мы рассмотрим чуть позже.
Что такое хорошо и что такое плохо.
Как я уже упоминал, нет единого шаблона или универсального способа создавать
UV-раскладки. Я попросил одного из мастеров UV-дзен, Сергея Луценко, сделать раскладку
вышеосвежеванной утки. Он прислал мне не одну, а сразу две раскладки, как бы подчеркивая,
что UV-координаты могут быть сгенерированы массой способов.
Откройте по очереди файлы duckUVplanarl.ma и duckUVplanar2.ma. Там содержатся
модели, расшитые с помощью планарных проекций. В первом файле находятся первоначальные
проекции, а во втором окончательный результат.
Второй вариант раскладки (сцена duckUVnurbs.ma) сделан, что называется, под задачу.
В нем находится наш неутомимый гусь, развернутый в квадратный лоскут, а-ля NURBS-сетка.
Остальные части тела находятся там же, в виде перекрывающихся кусков. Имейте в виду, что
на разные грани можно назначать разные материалы, поэтому раскладки могут перекрываться в
Texture Editor, если для каждой из них будет рисоваться своя текстура.
В этих сценах сохранена история, чтобы вы могли изучить порядок действий и образ мысли
мастеров UV-дзен.
476 Книга Сергея Цыпцына
Бесплатный сыр. Автоматический маппинг
Немного отдохнем от практики и поговорим «за теорию».
В подавляющем большинстве случаев UV-раскладки делаются с помощью планарного
маппинга. Пользователь просто выбирает на глаз участки поверхности, выкройки которых можно
получить с помощью планарных проекций, затем выбирает грани этих участков, делает проекции,
а затем долго и нудно сшивает результаты этих проекций в Texture Editor, растаскивая их по углам
и думая, что с чем лучше сшить.
Для тех, кто обожает всякую автоматизацию, а также для программистов и математиков,
был написан автоматический маппинг, который позволяет ускорить этот процесс, а именно,
заменить острый глаз пользователя и расставить вокруг поверхности несколько проекционных
плоскостей (неким предопределенным способом), а затем сделать планарный маппинг со всех этих
плоскостей. Потом автоматический маппинг, используя свой собственный острый глаз, разделяет
грани поверхности на лоскуты (shells), принадлежащие к каждой из планарных проекций. А затем
выполняется команда Layout UVs, которая растаскивает и сжимает эти лоскуты в единичный
квадрат так, чтобы они еще и не пересекались. Волшебная задача по сшивке пары десятков (а то
и сотен) кусков, любезно предоставлена, как вы понимаете, самому пользователю.
На словах выглядит все очень пристойно, однако на деле вы получаете результат работы
«автоматического острого глаза», который либо нуждается в доводке, либо вообще неприемлем.
Основная проблема в том, что MAYA не анализирует форму поверхности, а лишь позволяет выбрать
вариант расстановки плоскостей вокруг объекта, и потом пытается «интеллектуально» разделить
планарные проекции на непересекающиеся куски.
Поэтому пользователи MAYA делятся на две категории: приемлющие автомаппинг и всячески
его отвергающие, поносящие нехорошими MEL-командами. Ко второй категории относятся, как
правило, эстетствующие художники, имеющие дело с персонажной анимацией, к первой - более
практичные труженики игровой индустрии (деление это, очевидно, условное).
Если модель не очень сложна, можно набить руку в расставлении плоскостей вокруг нее,
чтобы добиваться приемлемого начального результата для дальнейшей ручной правки, однако
надо быть готовым к мнокогратному перекраиванию этого результата.
Возьмите начальную половину утки duckUVbody.ma.
Выберите поверхность и примените к ней операцию Automatic Mapping. В целях изучения
все параметры, задаваемые в Option Box, можно потом менять в истории с помощью атрибутов
ноды polyAutoProj.
Как видите, вместо утки, MAYA подсовывает нам в Texture Editor какие-то сапоги, хотя
часть крыльев явно угадывается.
Текстурирование
477
В окне камеры можно видеть манипуляторы для плоскостей проектирования. Их можно
вращать, таскать, растягивать, но только все вместе, как группу.
В Attribute Editor вы можете задать их число и увидеть, как MAYA «перерасставит» их в
пространстве.
Интеллект MAYA позволяет выбрать два варианта «распиливания» граней на лоскуты
(Optimize): с минимизацией количества кусков либо с минимизацией искажения пропорций.
Атрибуты Layout и Scale Mode относятся к операции Layout UVs, «зашитой» внутрь
автоматического маппинга.
Установите Layout=Overlap, и, возможно, вы почувствуете готовность сшить из полученных
кусков менее «лоскутную» выкройку шкуры утки.
Наиболее воинствующие поклонники автоматического маппинга, могут даже смоделировать
объект, состоящий не более чем из 31 грани и использовать эти его грани в качестве плоскостей
для проектирования (использовать, однако, более 8 граней - плохая идея!). Для этого в Option
Box операции Automatic Mapping есть соответствующие параметры. Грани такого объекта лучше
предварительно проэкстрактить операцией Extract.
Аналогом для автоматического маппинга могут послужить рыцарские доспехи. Крупные,
сравнительно плоские, наиболее заметные при рендеринге области будут металлическими
пластинами нагрудника, наплечников и т.д. Они слабо деформируются во время анимации (или
совсем не деформируются) и представлены в Texture Editor в виде больших лоскутов. Остальные
части - это швы между пластинами, мелкие заплаты, ремешки и застежки и пр. На них приходятся
области максимальной деформации модели и места разделения UV-выкройки на части.
Еще немного практики. Пошив пивных кружек
Обратившись за помощью к мастерам UV-дзен, я задал им коварный вопрос: «Вот
неутомимый пользователь смоделил какую-нибудь "шнягу" и теперь смотрит в панике в Texture
Editor и думает: с чего начать? Как подступиться к UV-раскладке? За какой инструмент браться?
Как сделать начальную раскладку?»
Наилучший ответ я получил из Риги, от мастера высшей UV-категории - Нилса Блумберга.
Он прислал мне целую древнебалтийскую легенду на языке могучих викингов - транслите. Эту
историю мы с ним вместе перевели на русский, и вот что получилось. Древние викинги использовали
майский устный жаргон, поэтому оригинальная орфография сохранена без изменений. Итак.
Помимо простых проекционных инструментов нанесения UV-координат (Planar,
Cylindrical, Spherical), на прилавке AAAYA можно найти и пару инструментов, которые включают в себя,
казалось бы, некоторые элементы шаманства - Automatic Mapping, BestPlaneTexturingTool и Crea-
478
Книга Сергея Цыпцына
№
teUVsBasedOnCamera. На самом деле, все они суть некоторые автоматизированные случаи того
самого Планар Маппинга , причем применение двух последних используется для достижения
специфического результата, который не представляет для начинающего пользователя великого
интереса, а о третьем инструменте - автомаппинге разговор будет дополнительный.
Какой из инструментов и в какой последовательности применить, зависит и от налагаемых
на объект текстур и от геометрии, которую нужно "развернуть" в Texture Editor так, чтоб искажения
текстуры на нем были минимальными.
Например, требуется замапитъ "шнягу", которую ради прогресса назовем "пивной
кружкой". Файл сцены pivo_start.ma.
Как видно, от изначального цилиндрического маппинга, после операций Bevel и Extrude,
ничего толкового не осталось
Поэтому придется его мапить заново, а чтобы это сделать, нужно увидеть, из каких
проекций наша "шняга" состоит. В данном случае это два объекта - корпус и ручка, и каждый из
них требует индивидуального подхода.
Начнем с корпуса, так как с ним все просто: цилиндр, он и в Арктике - цилиндр. Выбираем
в Texture Editor и отодвигаем все ювишки подальше от сакрального квадрата [0-1].
Текстурирование
479
Выбираем все грани корпуса кружки и валим на них Cylindrical Mapping, после чего у нас
на экране появляется манипулятор проекции.
Манипулируем им так, чтоб проекция заняла свободное место в Texture Editor.
Видно, что проекция удачно справилась со стенками, но донышко получилось не очень
красивым - очевидно, поскольку оно плоское. Придется применять Planar Mapping (логично,
однако). Тянем текущую выкройку куда-нибудь от греха (то есть от квадрата [0..1]) подальше.
Выбираем края кружки и донышко (изнутри тоже) и бросаем на все это планарную проекцию
сверху.
480
Книга Сергея Цыпцына
ш
Блеск! Проекции на корпусе как-то раскиданы. Но сейчас их надо как-то подогнать по
размерам, и желательно уменьшить количество швов, что зависит от текстур.
Предположим, что наружная стенка будет делаться неровной с помощью дисплеисмента, а
внутренняя - гладкой, к тому же на донышке должен быть лейбл стеклолитеиного завода, и, чтоб
жизнь не казалась совсем сладкой, все это должно быть на одной текстуре.
Опять выбираем все грани корпуса (заметьте - в Texture Editor сейчас это делается одним
движением) и выполняем Layout UVs.
В результате чего получается красивая (но не волшебная, к сожалению) UV-раскладка.
Теперь мыслим по-партизански.
1. У нас, помимо корпуса, есть еще ручка, она сравнительно небольшая и без особых
текстур, но забывать про нее не следует - запомним, что ей надо примерно 1/10 всего UV-
пространства.
2. Лейбл завода ажурный, значит текстура в этом месте будет занимать больше пикселей:
выделяем под донышко примерно 1/4 - 1/5 UV-пространства.
3. Наружная стенка тоже не мала, поэтому ей бы тоже лишние пиксели не помешали,
дадим ей примерно 1/2 всего UV-крадрата.
4. Внутренняя стенка, края и дно гладкие, обойдутся малым - их потом разместим, по
свободным местам.
Вперед! Сжимаем, двигаем и вдруг .... засада! Некуда поставит круглые края кружки -
места много занимают, причем без толку.
Текстурирование
481
Выход есть - развернем их и пришьем к внутренней части стенок.
Для этого пододвигаем их к ювишкам внутренней части стенки и уменьшаем в размерах до
тех пор, пока длина внешних ребер на краях не совпадет по длине с ребрами стенки.
Теперь отодвигаем эти ювишки в безопасное место. Выбираем вместо них ребра и кричим:
Cut UVs. Это важно, чтобы превратить все грани круглого края кружки в отдельные маленькие
лоскутки, которые можно теперь пришивать по отдельности, куда угодно.
После этого выбираем ребра, к которым должны пришиваться свежепорезанные края
кружки. Обратите внимание, что выбираем мы не только горизонтальные граничные ребра, но и
«зацепляем» внутренние вертикальные. Ничего страшного: сшивка будет происходит только по
граничным ребрам.
482
Книга Сергея Цыпцына
Теперь, затаив дыхание в ожидании чуда, шепчем: Move And SewUVs, после чего
действительно происходит маленькое чудо!
Разрезанные ребра края перескакивают с окружности на границу боковой поверхности.
Этот трюк надо повторить еще несколько раз.
При этом мы сшиваем не только крайние ребра, но и короткие поперечные ребра,
разрезанные операцией Cut UVs.
Текстурирование
483
Ha углах надо навести блеск с помощью Align UVs.
Оставшееся свободное место заполняем внутренним дном и позже туда добавим и ручку кружки.
Так как ручка неправильной «органической» формы, она не вписывается ни в один из
примитивов для стандартных проекций. "Ну, ладно", - думает наивный пользователь, "брошу
я на него просто Планар сбоку, и все дела!", и мышью тянется к заветной кнопке. Но тут в
помещение вбегает начальник (режиссер, аниматор, налоговый инспектор) и с визгом сообщает
от том, что хочет видеть на ручке обвитую змейку (да-да, с изумрудным глазком), после чего
лицо пользователя бледнеет. Планар тут явно не потянет, придется резать и растаскивать
484
Книга Сергея Цыпцына
ювишки вручную, а вот растаскать 96 ювишек - это очень долго... Пользователю повезло, что он
родился на пороге третьего тысячелетия, поскольку заботливые программисты довели, наконец,
автоматический маппинг до ума. Как уже упоминалось, его автоматика состоит в том, что он за нас
делает следующие операции:
1. Распределяет несколько автоматически сориентированных, планарных проекций вокруг
выбранных граней или самого объекта.
2. В зависимости от направления нормали каждой грани, распределяет, к какой из этих
проекций данная грань будет принадлежать, чем убивает сразу двух пасхальных кроликов, так
как вне зависимости от сложности модели, раскидывает все пересекающиеся ювишки и, если
надо, зеркально отражает их, при этом приблизительно сохраняется соотношение между длиной
и шириной каждого куска.
3. Собирает все кусочки в одну кучу и раскладывая их по величине в рамках квадрата [0-1].
Воодушевленный таким рассказом, пользователь, брызгая слюной, в окне моделирования
выбирает все грани ручки кружки, наваливает на них автоматический маппинг, и ... с тихим
ужасом констатирует, что ожидаемого чуда не произошло.
Поспешу успокоить пользователя: на самом деде, все в порядке.
Не теряя выбранных граней, в Texture Editor говорим Select=>Convert Selection То UVs и
опять отводим выбранные ювишки прочь от греха (то есть от квадрата [0-1]), где и будем над ними
издеваться - процесс, чем-то похожий на манипуляции с краем кружки, описанными ранее.
Выбираем все ребра ручки и истошно зовем Cut UVs (ломать - не строить!).
Текстурирование
485
ШЖУ.
Теперь надо все это сшить, а внутренний партизан тут как тут и говорит нам, что неплохо
было бы разместить шов на внутренней поверхности ручки, где стыковка текстуры будет менее
заметна.
Нет проблем - в окне Side выбираем все продольные ребра, а потом в перспективе снимаем
выделение с тех ребер, где будет проходит шов.
Теперь кликаем на Move And Sew UVs, после чего получаем набор по сути цилиндрических
проекций ручки, которые нужно грамотно сшить вместе.
Для этого подыскиваем место с наименьшим изгибом - то есть середину ручки.
Отводим в сторону и вращаем ювишки этих сегментов по возможности вертикально.
486
Книга Сергея Цыпцына
Используем кнопки Align UVs для выравнивания места шва.
Выделяем ребра на шве и говорим Move And Sew UVs.
Теперь таким же образом равняем и добавляем последующие сегменты, а с конусами
ручки поступаем аналогично тому, как поступали с краем корпуса кружки.
После неких потуг наша UV-раскладка приобретает законченный вид:
Текстурирование
487
Теперь дело стало за текстурщиком (или - за утомленным пользователем), который, по
мере необходимости, может смодифицировать эти UV-координаты, но главную работу по развертке
ювишек и их логическому раскладу пользователь все же совершил. Сам. Нервно курим. Конец
истории.
Инструментальный хит-парад
По аналогии с инструментами для полигонального моделирования приведу
хитпарад использования различных UV-операций в процессе работы, полученный в результате
социологического опроса мастеров UV-дзен.
Planar Mapping - стоит особняком: с него все начинается, и без него не сдвинуться с
места.
Automatic Mapping - либо используется интенсивно, либо с возмущением отвергается: в
зависимости от темперамента и принадлежности к той или иной майской группировке.
Абсолютным хитом является сладкая парочка Cut UVs и Move and Sew UVs. Это - основные рабочие
лошади UV-портного.
Layout UVs -помогает довольно ловко растаскивать перекрывающиеся лоскуты (shells) по
площади квадрата [0-1] (к тому же он совершенствуется от версии к версии). Однако не льстите
себе результатами Layout UVs (он же используется в автомаппинге), так как лоскуты из ювишек
он упорядочивает по их площади (UV-bounding box), а это чревато потерей драгоценного UV-
пространства. Поэтому потратьте полчаса на то, чтобы пришить мелкие осколки ювишек к большим
кускам, и уплотните вручную расстояние между такими кусками, начиная с одного угла, а уж
потом делайте Normalize UVs.
Normalize UVs - чисто технический инструмент. Не забывайте включить в его Option Box
опцию Preserve Aspect Ratio, чтобы не провоцировать искажения пропорций.
Дебютант хит-парада, инструмент Lattice Tool, стремительно поднялся в верхнюю часть
списка сразу после своего появления в MAYA. Он действительно позволяет экономить массу
времени, заменяя многократное ручное перетаскивание.
FlipUVs и Align UVs идут в хит параде друг за другом. Для их использования беспредельно
удобны кнопки на полке в Texture Editor.
Конвертирование выбора - либо с помощью меню Select и операций Convert Selection То,
либо с помощью Ctrl и правой кнопки мыши - это постоянный трюк, а возможность конвертировать
выбранные ювишки в Shell была признана хитом сезона.
Банальная возможность вращать выбранные ювишки на заданный угол (Rotate UVs)
появилась в MAYA не сразу, однако сразу попала в хит-парад. Раньше мне приходилось писать
скрипты для этого по заказу мастеров UV-дзен.
Возможность сшивать ювишки, не двигая соседей (Sew UVs), используется - хотя и не так
часто как Move and Sew UVs.
«Волшебная» операция RelaxUVs, конечно, хороша и зрелищна, однако применять ее
следует с осторожностью. Всегда контролируйте результат ее работы на дежурных шашечках. По
умолчанию в Option Box установлена опция Edge Weights=Uniform, которая стремится привести
все ребра к одинаковой длине. Переключив ее в World Space, вы получите гораздо более
«интеллигентный» результат, лучше сохраняющий оригинальные пропорции.
К разряду довольно редких операций можно отнести Delete UVs, Merge UVs, Grid UVs.
Остальные инструменты - типа CycleUVs(2), UnitizeUVs(1&2), MapUvBorder(2), StraightenU-
vBorder(2), GridUVs(1&2), MergeUVs(1) - используются в довольно редких случаях и предназначены
для конкретных, нечасто встречающихся ситуаций.
488
Книга Сергея Цыпцына
Еще немного о швах. Нет... много о швах!
Важнейшим из искусств является умение правильно расставить текстурные границы, то
есть швы на модели. Поэтому как только пользователь замоделил какую-нибудь "шнягу" и открыл
Texture Editor, чтобы ее расшивать, первое, что он должен сделать - это закрыть Texture Editor и
снова посмотреть на модель. И начать ее анализировать.
Логика, применяемая при расшивке модели, та же, что и при ее моделировании.
Плясать следует от смысла всей затеи и от самой природы, то есть от устройства объекта.
Обратимся к природе-матушке.
Опыт наблюдений за окружающим материальным миром (а именно он, чаще всего,
становится предметом исследований и издевательств трехмерщиков) подсказывает нам, что
проблема полного устранения швов, похоже, не решена даже самим Создателем. Единственное
место, где швы отсутствуют - это книжки по математике, которые описывают всякие красивые
и элегантные гиперболические выкрутасы, которые, для пущей красоты, еще и раскрашивают в
цвета электрик всех оттенков. Но если вы посмотрите на живую природу (или на то, что раньше
ею было), картина будет совсем иной.
Достаточно пойти в любой «музей сушеных зверей» (copyright на это определение у
Виолеты Гаямовой - так она называет зоологический, палеонтологический, краеведческий и
прочие места, где есть шкурки несчастных зверушек), и вы увидите, что каждая шкурка была
добыта путем многочисленных надрезов: вытащить содержимое льва или крокодила из них самих,
просто засунув руку им, к примеру, в пасть, ухватившись, скажем, за основание языка - а не то и,
извините за натурализм, глубже - и как следует потянув (да так, чтобы при этом нигде и ничего не
порвалось), еще не удавалось никому!
Наверное, самыми первыми и ранними UV-расшивщиками были охотники и чучельники. Вот
к кому мы должны обращаться за опытом, а уж они вам подтвердят: да будь вы самым талантливым
на свете таксидермистом, а без надрезов и швов - не обойтись.
Ну, раз уж швы - неизбежное зло, унывать не стоит. Главное, научиться эти самые швы
умело подать (как-то не хочется писать: «прятать»). И в самом деле: швы, которые понасоздавала
сама природа, участвуют в создании красоты, так что она, красота, от этих швов (то бишь, от
природы) неотделима.
Взгляните на собственную ладонь. Что вы увидите? А увидите вы яркий пример того,
как природа и эволюция, решая сразу несколько задач (по обеспечению функциональности,
терморегуляции и мало-мальской эстетики), справилась с этим только за счет того, что соорудила
кучу складок, морщинок и швов между участками кожи на ладони. Этим рисунком мы же еще
и восхищаемся, всматриваясь в него во время гадания, выискивая какой-то, там, смысл. Если
посчитать, сколько денег заработали все гадалки мира только на складках руки, - поневоле
заинтересуешься UV-координатами!..
Итак, тезис таков: складки и швы - это хорошо! А правильно размещенные складки - еще
лучше. Вы думаете, я вас буду сейчас уговаривать стать патологоанатомами и таксидермистами и
учиться скрупулезно воспроизводить все, что создано для вас природой? Да ничего подобного!
Компьютерная графика предоставляет нам уникальные возможности по имитации этого всего
- чего угодно. И вместо того, чтобы делать все тютелька в тютельку лучше научиться делать все
«а-ля.... Реальность». Тем более, что не всегда речь идет о воспроизведении реальности, а даже
наоборот - о создании карикатуры и гротеска. Теперь ближе к делу.
Хорошие новости таковы: любой, даже самый сложный по форме объект может быть
представлен как набор более простых по форме предметов. А значит, если взять изображение
любой лошадки или собачки, то все это нагромождение элегантнейшей красоты, которую,
казалось бы, невозможно описать никакими формулами, на самом деле можно свести к набору
параллелепипедов, кубиков и шариков, которые просто-напросто проникают друг в друга под
Текстурирование
489
ШМА!
разными углами, громоздятся друг на друге и, будучи многократно и умело сглажены, образуют
форму коня, собачки, джульбарса и пр.
А вот плохие новости: умению разглядеть и представить лошадь или человека в форме
набора простых по форме тел учат по четыре-пять лет. Например, в классе классического рисунка,
по сорок академических часов на модель. Наброски - каждый день, Штудии, штудии, штудии!
Надежда гаснет...
Но я пишу это отнюдь не для того, чтобы поиздеваться над читателем - нет, чтобы показать
важность и полезность художественного образования для таких задач, как моделирование и
текстурирование.
О чем это мы? Ага, о швах. Итак: «бьем» сложный объект на сумму простых, а границы
между этими простыми участками и будут вашими швами.
В идеале, если вы с самого начала правильно вели процесс моделирования, то есть аккуратно
формировали объем вашего объекта, тогда сами эти более простые объемы будут заложены в
вашей модели с самого начала и границы между ними будут получены автоматически.
В реальности же, конечно, такая идеально-райская ситуация получается редко, поэтому часто
нужно добавить-поправить пару ребер, по которым потом будет расшита модель вручную.
Откройте сцену twoDucks.ma. В ней находятся две полуутки. Одну из них «довел» до ума (то
есть до состояния максимально удобного для текстурирования) мастер UV-дзен Сергей Луценко.
Найдите десять отличий и попытайтесь понять, зачем эти коррективы были сделаны.
Здесь мы возвращаемся к тезису, упомянутому перед началом этой эмоциональной тирады:
текстурные швы надо планировать заранее. Еще на стадии моделирования. Можно выделить три
часто встречающихся подхода к проблеме швов и склеек.
1) Подход «прикладной-первобытный» (он же: «думаем и делаем»): шьем все, что можно,
а где невозможно - режем. Это означает: максимально уменьшить количество швов, но так, чтобы
при этом налагаемая текстура сильно не страдала. Страдает она обычно от того, что конкретному
участку геометрии не выделили достаточно места в UV-пространстве -(такое случается, например,
при использовании операции Extrude, где текстура на боках размазывается). Править такие места
нужно с помощью Relax UVs (это неизбежно искажает текстуру, но избавляет от лишних швов)
или посредством отрезания экструдированных UV-участков, ради их дальнейшего размещения и
маппинга в свободной части UV-пространства.
2) Подход «простой-эмоциональный» (он же: «делаем, почти не думая»): шьем там, где
одно, а режем там, где разное. Это означает, что швы целесообразно располагать на острых гранях
или там, где встречаются два разных материала. Например, если взять комнату, то плоскости
490
Книга Сергея Цыпцына
№
ее стен имеет смысл сшить вместе, а резать по углам. Если какой-нибудь кафель или плинтус
отделяется реальной геометрией, то это верный признак - режьте там. Особенно это относится
к игровым моделям, где таким маппингом достигаются острые переходы от одного материала к
другому, даже при небольших размерах текстур, склонных к фильтрации. Так что перед началом
текстурирования надо обязательно понять, сколько материалов будет «носить» объект.
3) Подход «сложный-интеллектуальный» (он же: «делаем, надолго задумываясь»): шьем
там, где видно, а режем, где не видно. В реальном примере это означает, что при маппинге
персонажа швы надо располагать на внутренних частях ног и рук, на затылке, словом, в тех местах,
которые чаше всего прикрываются другими частями тела, одеждой или волосяным покровом.
О том, как скрывать швы, мы поговорим чуть позже, а сейчас посмотрим на последнее
чудо UV-техники - автоматического таксидермиста. На новый инструмент - Unfold UVs.
Автоматический таксидермист. UnfoldUVs
Надо сказать, что проблемы текстурщиков и их каторжные условия труда волновали
мировую общественность довольно слабо. И только в 2005 году, после принятия комитетом по
правам человека соответствующей резолюции, производителей программного обеспечения словно
прорвало. Все, наконец-то, вспомнили, что на UV-раскладки уходит едва ли не больше времени,
чем на изготовление самих моделей. Практически во всех новых версиях трехмерных пакетов,
как по команде появились инструменты, призванные облегчить труд текстурщиков и продлить их
недолгую трудовую карьеру. MAYA ответила Чемберлену и конкурентам новой операцией - Unfold
UVs.
Следует также отметить и другие довольно популярные инструменты для автоматического
UV-развертывания. Это прежде всего UV Unwrap, встроенный в пакет Modo. Штука потрясающая,
заставляющая бывалых текстурщиков падать в глубокий обморок и девальвирующая их упорный
труд. Теперь ведь никто не мешает вам втянуть вашу майскую модель в Modo, содрать с нее UV-
шкуру и вернуть обратно в MAYA, через формат obj, для дальнейшей доводки в привычном Texture
Editor.
Кроме этого, набирает популярность плагин для MAYA под названием Pelting Tool (http://
sunitparekh.com/pelting/). Он использует динамический подход к расшивке и, грубо говоря,
представляет ювишки как сетку из частиц, соединенных пружинами, которые в процессе симуляции
натягиваются на каркас нужной формы, разворачивая модель в плоскую раскладку.
Примечание. Пытливые умы могу сами поэкспериментировать с майской динамикой
применительно к UV-маппингу. Создайте из поверхности мягкое тело, соедините
частицы пружинами и заставьте их либо разлететься нужным образом, либо
наоборот, облепить другую модель, более простой формы. После этого можете
отмапить мягкое тело и перенести с него UV-координаты на исходную модель.
Коль скоро мы с вами здесь понимаем MAYA, придется нам пощупать ее нового зверя и
посмотреть, как он сдирает шкуры с несчастных моделей.
Откройте файл duckUVunfoldStart.ma.
Я специально подрезал птичке крылья, чтобы они не путались под ногами у нашей мыши.
Все равно крылья вы будете мапить отдельно, хотя экстремальные умы могут впоследствии
повторить трюк с лапами. Я также санировал пичуге полость рта - из тех же соображений: чтобы
не мешала упражняться.
В Texture Editor видно, что на животное накинут планарный маппинг в Y-направлении,
сверху вниз.
Текстурирование
491
Идея Unfold UVs состоит в том, что пользователь намечает текстурные швы на модели,
делая как бы надрезы на шкуре, а АЛАУА затем пытается развернуть шкуру, используя эти надрезы
и пытаясь сохранить пропорции граней.
Основное условие для начальной работы - наличие хоть какого-то маппинга на нужном
участке модели. Вы, конечно, можете набросить, в качестве начального, и автоматический маппинг,
однако имейте в виду: АЛАУА «пляшет» от первоначального варианта, а решение довольно сильно
от него зависит. Поэтому старайтесь делать его хоть как-то похожим на желаемый результат.
В нашем случае, требование еще жестче: у нас есть только половина, и мы хотим позднее сшить
модель и шов по верхнему краю вдоль спины, поэтому желательно сразу получить этот шов в виде
прямой вертикальной или горизонтальной линии.
По непонятной мне причине, все примеры на использование Unfold UVs сопровождаются
полными симметричными моделями, хотя в жизни половинки поверхности удерживаются
несшитыми до последнего. Кроме того, время работы и количество вычислений производимых
Unfold UVs напрямую зависит от количества точек, поэтому, работая с половиной, мы будем просто
экономить время. Для любителей полнотельных моделей я приведу пример использования сшитой
утки.
Итак, у нас есть первоначальная раскладка и мы хотим развернуть ее в один «хороший»
лоскут. Выберите все ювишки и откройте Option Box операции Unfold UVs.
Включите там галку Keep History. Это сделает возможным менять варианты решений позже, через
атрибуты соответствующей ноды. По умолчанию эта галка выключена, так как Unfold UVs требует
приличного времени для вычислений, и изменение атрибутов ноды будет вызвать полный пересчет
этих вычислений. Однако для экспериментов просто необходимо оставить историю.
492 Книга Сергея Цыпцына
Нажмите на кнопку Apply и полюбуйтесь результатом. В принципе результат
удовлетворительный - MAYA действительно развернула выкройку для тела в некий лоскут, который
можно вручную довести до нужного состояния.
Самое удивительное, что шашечки на поверхности выглядят более чем пристойно, особенно
если повернуть немного ювишки в Texture Editor.
Если разыскать в Attribute Editor ноду polyOptllvsl, то можно пошевелить ее атрибуты.
Общий порядок шевеления таков.
Сначала шевелите атрибут Solver Weighting. Нулевое значение задает локальный метод
решения, основанный на анализе соотношения площадей граней в пространстве и на UV-плоскости.
Этот метод быстрый, не учитывает общую форму объекта и часто «сгибает» выкройку дугой. Если
Solver Weighting=1, используется глобальный метод, учитывающий общие пропорции объекта.
Он медленный и часто ломает границы текстурных областей, но его способность анализировать
форму поверхности может быть использована во благо. Истина, как правило, лежит посередине, и
если Solver Weighting больше нуля, но меньше единицы, то используется усредненное решение.
Задайте Solver Weighting=0.1, затем 0.2, остановитесь на 0.5.
Оцените, как утка вытянулась и приблизилась к своим оригинальным пропорциям.
Текстурирование
493
Можете поиграть с парадоксально названным атрибутом Global Method Blend. Он определяет,
что имеет больший приоритет при поиске решения: площадь граней или длина ребер.
Примечание. Для меня всегда было загадкой, почему имена атрибутов в истории объекта
отличаются - порой радикально - от , соответствующих им параметров в Option Box.
Далее обычно используется следующий трюк. Найдя удовлетворительную форму границы
развертки с помощью Solver Weighting, можно зафиксировать границу, а внутренние ювишки опять
подвергнуть разворачиванию с помощью Unfold UVs.
Выберите только ювишки на границах текстуры. Это можно сделать, выбрав их все, и
сконвертировать выбор to Shell Border.
«Развыберите» ювишки на краях для лап и крыльев, чтобы позволить им двигаться.
А теперь включите в Option Box операции Unfold UVs галку Pin Selected, чтобы не позволять
выбранным ювишкам на границе двигаться вместе с остальной сеткой.
В принципе можно было бы включить галку Pin UV Border, но это зафиксировало бы также
края для лап и крыльев, а это не входит в наш коварный план.
Нажмите Apply и отметьте, как дополнительно разровнялась сетка.
Далее вы можете с помощью операции Relax UVs дополнительно расслабить область лап
(используйте Edge Weights=Uniform и Pin Unselected UVs).
494
Книга Сергея Цыпцына
Лапы в данном случае как бы «свернуты» внутрь отверстия. Возможно, что рисовать
текстуру на таких, «радиальных» лапах будет неудобно, и мы с этим скоро разберемся. Но сейчас
вспомним о наших планах сделать симметричную выкройку и поймем, что полученный «окорок»
хорош только для половинки курицы.
Радикально переделаем сам подход. Коль скоро есть возможность зафиксировать
выбранные ювишки, вернемся к планарной проекции и сделаем гениальный ход.
Либо откройте заново исходный файл duckUVunfoldStart.ma, либо удалите историю и бросьте на
бескрылую тварь горизонтальную планарную проекцию.
Теперь надо выделить все ювишки вдоль верхнего шва на спине. Это просто сделать,
выбрав соответствующие ребра (для которых заготовлен Quick Select Set с именем UpBorder) и
сконвертировав выбор в ювишки.
Далее в Option Box для Unfold UVs надо не забыть про галку Pin Selected, чтобы закрепить
выбранные ювишки в горизонтальном положении.
Жмите Apply. Волшебно!! Попадание с первого раза!
Можете «доработать» форму, редактируя атрибут Solver Weighting в Attribute Editor.
Для экспериментальных целей задайте Solver Weighting=0.5.
Текстурирование
495
Небольшой косяк в области переднего края крыла можно подлатать вручную или с помощью
Relax UVs. Но лучше оставить это на потом. Так как сейчас мы разберемся с лапами.
Сразу оговорюсь, что лапы можно отрезать и тоже обработать Unfold UVs, но это будет домашним
заданием, а взрослые патологоанатомы снимают шкуру с клиента целиком, делая один-
единственный лоскут.
Наметим шов, по которому надо разрезать поверхность лапы, чтобы лапа «развернулась»
вместе с остальной частью выкройки.
Такой шов, очевидно, лучше расположить на задней поверхности лапы, подальше от
любопытных глаз.
Выберите ребра лапы и тушки, соединяющие два края поверхности.
Выполните Cut UVs.
Обратите внимание, что Unfold UVs пересчитывается заново, чтобы обновить дерево
истории. Удалите историю.
Выберите опять ребра вдоль спины и превратите их в ювишки.
Снова выполните Unfold UVs для по-новому разрезанной текстурной границы. Фантастика!
Утка развернулась в единый лоскут вместе с лапой и напоминает цыпленка «табака». Шов
в районе лапы отсутствует, а шашечки практически везде не растягиваются! Голова выглядит
прекрасно, а утка самодовольно!
496
Книга Сергея Цыпцына
Традиционно доработайте пропорции утки атрибутом Solver Weighting. Значение 0.5 хоть и
не является универсальным, но служит хорошей стартовой точкой.
Косячок в районе крыла можно легко поправить руками, придав выкройке отверстия
оригинальную форму.
Теперь нашу утку можно сшивать и красить.
Для тех, кто не ищет легких путей и желает видеть как Unfold UVs работает на целиковых
моделях, я советую быстро проделать следующие действия.
Удалите историю.
Выполните Mirror Geometry.
Задайте Merge Thresholds.01.
Бросьте планарную горизонтальную проекцию на всю тушу.
Разрежьте утку вдоль брюха, выбрав нужные ребра и выполнив Cut UVs.
Разрежьте задние края обеих лап, как было показано выше.
Текстурирование
497
Выберите ребра вдоль спины и превратите их в ювишки.
Выполните Unfold UVs с опцией Pin Selected.
Получите симметричную развертку утки.
Используйте Attribute Editor и атрибут Solver Weighting для выруливания пропорций.
Обратите внимание на то, что вычисления при изменении Solver Weighting идут медленнее,
чем в «половинчатом» случае. Хотя результат идентичный.
Можно сказать, что применение Unfold UVs - процесс до безобразия творческий. Вы
можете получать промежуточные результаты, делать дополнительные надрезы или сшивки, снова
повторять процесс, фиксировать углы или границы, повторять процесс еще раз, играть с Solver
Weighting, добавлять Relax UVs, и так далее - до полной самореализации.
Один из трюков для несимметричных моделей - применение Unfold UVs с ненулевым Solver
Weighting для выравния сгиба, а затем фиксирование границ опцией Pin Selected и повтор Unfold
UVs с нулевым Solver Weighting.
Для симметричных моделей основной трюк - фиксация ювишек, находящихся на оси
симметрии, перед выполнением Unfold UVs.
Главное, это удачно разрезать модель перед развертыванием, так, чтобы поверхность
действительно могла развернуться. И не падайте духом, увидев первый вариант, а лучше шевелите
Solver Weighting.
Попробуйте развернуть ручку пивной кружки древних викингов. Секрет состоит в создании
не одного, а двух швов. Выравнивайте границы, фиксируйте их, не теряйте духа.
498
Книга Сергея Цыпцына
Как замести следы. И скрыть швы
Очевидно, что совсем обойтись без текстурных швов на поверхности объекта не удастся.
Конечно, можно очень сильно упереться и пришить «все ко всему», но рисовать по такой выкройке
будет неудобно.
Визуальные швы возникают, понятное дело, на тех ребрах, которые служат границами
текстурных кусков в Texture Editor, и в нашем примере это - место крепления крыла и тушки.
Рассмотрим методы сокрытия этих безобразий.
Как уже упоминалось, надо стараться делать UV-выкройку так, чтобы швы проходили в
наименее заметных местах.
Если вы знаете, что какие-то участки будут прикрыты одеждой или мехом, делайте швы
там. И то и то ясно и ежу.
В случае с уткой (если это только не меховой, зимний, шипованный селезень) ни одежды
ни меха не предвидится, так что придется выкручиваться.
Первое, что надо сделать - посмотреть, а будет ли заметен шов. Для этого, как ни
прискорбно, имеет смысл отрендерить пару кадров, причем с анимацией и учетом расположения
персонажа в кадре, в полном соответствии с гениальным замыслом режиссера. А там, глядишь,
может оказаться, что ничего делать со швами и не надо.
Текстурирование
499
Если все-таки принимается решение бороться со швом, слеудет избрать стратегию.
В том случае, если есть возможность подбирать текстуру, следует делать ее максимально размытой
и «невнятной» в области шва. Любые четкие узоры сразу будут вылезать наружу.
Если раскладка сделана достаточно ловко и pe6pa(edges) вдоль швов располагаются в
Texture Editor (и, следовательно, в Фотошопе) более или менее параллельно, то можно клонировать
кисти и всячески выкручиваться.
Также хорошим подспорьем могут служить трехмерные текстуры. Их можно приблизительно
подобрать по цвету и узору, «навалить» на всю модель целиком, а потом «испечь» в обычные
растровые текстуры, которые лягут точно по изготовленной UV-раскладке. Участки в районе швов,
можно использовать либо для клонирования, либо для дальнейшего рисования и «сращивания с
остальной текстурой.
Откройте например файл duckUV3dTexture.ma.
Там содержится утка, затекстурированная процедурными трехмерными текстурами.
Выберите утку, затем в HyperShade дополнительно выберите lambert2 и выполните операцию
Convert to Solid Texture (только не забудьте задать в Option Box размер и формат текстуры).
После этого трехмерная текстура превратится в обычную. Причем бесшовно лежащую на
всей поверхности. Вы можете тащить эту текстуру в Фотошоп и использовать ее, как вам угодно.
500
Книга Сергея Цыпцына
Любую растровую текстуру можно быстро превратить в трехмерную, наложив ее на объект
с помощью проекции. Следовательно, если у вас уже есть кусочек (образец, шаблон, фрагмент)
текстуры крыла в виде битмапа, вы можете спроектировать его на выбранные грани в районе
шва.
Затем можно выбрать поверхность и материал и выполнить Convert to Solid Texture. После
этого вы получите бесшовный фрагмент текстуры в районе шва, от которого можете дальше весело
плясать в Фотошопе.
Текстурирование
501
Если проектируете разные текстуры на разные участки поверхности, то после
конвертирования их в обычные растровые (непроекционные) текстуры, можно будет нарисовать
альфа-маску для того, чтобы переход между участками поверхности был плавным. А затем
собрать сконвертированные текстуры в Layered Texture, используя эту маску, которую, кстати,
очень удобно нарисовать (или хотя бы наметить) с помощью 3D Paint Tool. Впрочем, эта техника
чаще применяется в мультитекстуринге, о котором речь пойдет позже.
Кстати, о 3D Paint Tool! Он прекрасно умеет рисовать поперек или «через» шов. К сожалению,
кисти Paint Effects на шве безбожно «рвутся», а вот обычные кисти Artisan прекрасно работают.
Особенно в режиме Clone.
Существует еще масса трюков по скрытию швов, однако они относятся скорее к рисованию,
чем к MAYA. А вот о рисовании в MAYA стоит поговорить подробнее.
3D Paint Tool
Сразу скажу, что 3D Paint Tool вызывает у всех самые противоречивые ощущения. С одной
стороны, в нем не хватает самых элементарных функций, присущих программам для рисования.
С другой стороны, возможность рисовать кистями Paint Effects, корректная работа со швами и
другие забавные эффекты делают этот инструмент если не уникальным, то весьма интересным.
Часто он используется, как вспомогательное средство, позволяющее наметить или обозначить тот
или иной орнамент или образец прямо на поверхности. А последующее сохранение и развертка
этой текстуры позволяет довести ее вид до ума, где угодно.
Также часто он используется для рисования альфа-масок в местах перехода от одной
текстуры к другой на одной поверхности. Этот трюк активно применяется в мультитекстуринге.
502
Книга Сергея Цыпцына
№
Как следует из названия, его главным козырем является возможности рисования прямо на модели.
Из этого козыря проистекают некоторые требования.
Первое требование - у вас должна быть ОЧЕНЬ ХОРОШАЯ видеокарта! С максимальным
количеством видеопамяти. Если вы хотите рисовать и тут же видеть адекватный результат -
готовьте денежки. Если нет, ниже описан трюк, как их сэкономить.
Второе требование - на поверхности должны быть UV-координаты. Точнее говоря, на
поверхности должна лежать текстура, по которой мы рисуем, но есть возможность ее назначить
прямо в процессе рисования. Чтобы такой текстуре «лечь» на поверхность, нужен хоть какой-то UV-
маппинг. «Хоть какой-то» означает: чем он лучше , тем проще будет рисовать на поверхности.
Использование 3D Paint Tool в принципе несложно. Но есть несколько тонкостей, зная которые вы
избавите себя от мучительного поиска причин, почему ничего не работает.
Если не лень, откройте файл duck3dTexture.ma, чтобы на нем потренироваться.
Проще всего добраться до 3D Paint Tool можно, щелкнув правой кнопкой мыши над
поверхностью и выбрав в выпавшем меню Paint=>3D Paint (пытливые умы могут также разыскать
его в основном меню MAYA).
Выбрав инструмент, вы наверняка получите в Script Editor предупреждение типа:
Warning: file: C:/Program Files/Alias/Maya11.0/scripts/others/art3dPaintToolScript.mel line 46: Some
surfaces have no file texture assigned to the current attribute.
При этом MAYA поприветствует вас жирным кукишем в виде перечеркнутого курсора кисти.
Это означает, что вы собираетесь рисовать по поверхности, на которую не наложена никакая
текстура, и что MAYA просит вас это сделать.
Позвольте!.. - спросите вы. И будете по-своему правы: ведь на нашем чудовище уже явно
есть текстура! Однако пытливые умы могут сообразить, что данная текстура трехмерная и не
является растровым изображением, по которому можно возить кисточкой. Но если вы потянулись
конвертировать трехмерную текстуру в битмап, погодите: AAAYA это сделает за вас.
В настройках инструмента есть специальная кнопка Assign File Textures, и если вы думаете, что
первым делом стоит на нее нажать, то вы заблуждаетесь.
Первое, что необходимо понять, это на какой канал материала вы собираетесь назначить
растровую текстуру? Иначе говоря, чем вы собираетесь рисовать: цветом, прозрачностью, бампом
и т.д. Конечно, если вы прочли книжку «Фотошоп для чайников с двумя носами», то вы уверены,
что рисовать можно только цветом, однако взрослые, трехмерные мальчики знают, что красить
Текстурирование
503
можно любым атрибутом, вплоть до Reflectivity.
Поэтому смотрим, что AAAYA предлагает нам по умолчанию. Ага! Сюрприз! Очень даже может
быть, что MAYA предполагает, будто мы захотим разукрашивать диффузный канал материала. (На
самом же деле это зависит от того, как мы рисовали в последний раз.)
Поэтому первое, что надо сделать, это установить нужный атрибут для покраски и тем
самым задать, на какой канал будет назначаться текстура.
Установите Attribute to Paint=Color.
И вот только теперь нажмите кнопку Assign/Edit Textures.
Задайте разрешение текстуры и нажмите нужную кноку.
При этом, если у вас на канале Color были какие-нибудь нерастровые текстуры, они
«спекутся» в битмап нужного размера, по которому вы и будете рисовать. Это дает возможность
сохранить текущий узор на поверхности.
Теперь вы можете резвиться, как вам угодно, меняя цвет, форму, прозрачность кисти.
Вы можете рисовать кистями Paint Effects, причем для них действуют свои режимы: Paint,
Blur и Smear. Имейте в виду несколько вещей.
Режимы смешивания (Blend Mode), аналогичные фотошопным, действуют только для
артизановских обычных кисточек.
Как и положено в рисовальной программе, текстура сохраняется, когда вы этого захотите,
то есть когда нажмете кнопку Save Textures. Вернуться к последнему сохраненному варианту
можно, нажав Reload Textures.
Есть две полезные галки. Одна из них, Save Textures от Stroke, сохраняет файловую
504
Книга Сергея Цыпцына
№
текстуру после каждого штриха. Это полезно, если вы решили сэкономить на видеокарте, и MAYA,
соответственно, катастрофически валится на бок в процессе рисования.
Что же тогда делает другая галка - Update on Stroke? Она обновляет файловую текстуру в
памяти, не сбрасывая ее на диск. Это опять же полезно, когда у вас настолько дешевая видеокарта,
что она не может толком отобразить цветовой канал, не говоря уж про бамп. В этом случае вы
можете применить хитрый трюк.
Просчитайте изображение с помощью IPR.
Задайте нужную область обновления в Render View.
Включите галку Update on Stroke и рисуйте по поверхности. После каждого обновления IPR
будет обновлять картинку. При этом текстура не будет сохраняться на диск, пока вы не нажмете
кнопку Save Textures или не включите галку Save Textures от Stroke.
Если у вас все же приличная видеокарта, имеет смысл включить в панели камеры режим
Shading=>High Quality Rendering. Это позволит вам видеть каналы бампа, хорошее освещение и
пр.
Если вы хотите использовать режим Erase, нужно выключить галку Save Textures on Stroke,
иначе МАУАне сможет восстанавливать изображение, сохраняемое постоянно. Чтобы зафиксировать
изображение, после которого MAYA будет запоминать штрихи для стирания, предназначена кнопка
Set Erase Image.
Помните, что в данный момент вы работаете с текстурой, а не со сценой. Сохраняйте ее,
когда считаете нужным.
Совет. При нажатии кнопки Save Textures MAYA пишет в Script Editor полный путь к
файлу. Как правило, это папка 3dPaintTextures текущего проекта.
Для работы со швами держите в уме еще несколько деталей.
Если в разделе Strokes включить галку Screen Projection, можно будет рисовать не только
обычными кисточками, но и кистями Paint Effects в районе текстурных швов, ведь в этом случае
штрихи не «натягиваются» на поверхность, а проектируются на нее.
Режим Clone чудовищно полезен, так как позволяет делать «безшовные швы». Однако
чтобы заставить его работать, нужно проявить смекалку.
Прежде всего, надо задать размер кисти, потом нужно нажать кнопку Set Clone Source,
а затем, недрогнувшей рукой, щелкнуть один раз там, откуда вы хотите снять образец для
клонирования узора.
Ничего не произойдет, MAYA не пискнет и не скажет: «Готово!». Однако у вас в руке,
точнее в курсоре, будет клон участка текстуры.
Далее вы можете рисовать по поверхности в одном из двух режимов, но это будет непросто.
Более предсказуем режим Static, в котором для размножения образца рисунка вам придется
неистово щелкать (а не красить) мышью там, где вы хотите красить. Попробуйте поизменять
размер кисти во время безумного щелканья - этим сэкономите немного времени.
Текстурирование
505
ШДЛУИ
В режиме Dynamic после первого щелчка, определяющего клонируемый участок, второй
щелчок (без отпускания) определяет (и запоминает) отступ от первого щелчка и дальнейшее
рисование будет воспроизводить не только клонированный участок, но и область вокруг него.
Причем при дальнейшем рисовании будет использован запомненный отступ, и клонироваться
будет не оригинальный участок, взятый первым щелчком после нажатия кнопки Set Clone Source,
а участок, отстоящий на запомненное растояние от курсора кисти в данный момент.
Галка Extend Seam Color позволяет дополнительно закрашивать область за границей
текстурных координат. Если она выключена, раскрашиваться будут области только внутри UV-
раскладки, и это очевидно. Если эту галку включить, MAYA сама будет добавлять немного цвета за
границу шва (или вокруг него). Это хорошо видно, если открыть параллельно Texture Editor и не
забыть про галку Update on Stroke.
В нашем случае на всей поверхности уже была «испечена» текстура, поэтому при
506
Книга Сергея Цыпцына
№
включении этой галки и первого же мазка после этого, MAYA залила все не покрытое UV-раскладкой
пространство в серый цвет, экстраполируя серую текстуру за границы текстурных швов.
В разделе Stroke настроек 3D Paint Tool есть параметры для симметричного рисования, они тоже
могут быть полезны. Так как 3D Paint Tool часто используется для рисования масок, не забывайте
поиграть с прозрачностью кисти, а также не упустите из виду режим Blur.
Мультитекстуринг
Мультитекстуринг - это такое модное слово, которым можно пугать маленьких детей и
удивлять взрослых девочек. Когда произносится это заклинание, обычно имеется в виду одна из
двух трактовок этого метода.
В первом случае имеется в виду возможность создания на одной поверхности нескольких
наборов UV-координат (UV sets). После чего разные текстуры могут ложиться на поверхность по-
разному: каждая в соответствии со своей UV-раскладкой или, как говорят, UV-сетом.
Во втором случае речь идет о более конкретном применении этого метода, когда две
текстуры, имеющие разные UV-сеты, смешиваются с помощью Layered Texture, а граница между
ними задается мягкой альфа-маской, нарисованной отдельно. Об этом трюке мы поговорим
отдельно, а сейчас посмотрим, для чего нужны несколько UV-сетов.
В самом деле} на первый взгляд, если вы можете нарисовать текстуру цвета, то по той
же UV-раскладке вы можете нарисовать и текстуру бампа или прозрачности. Однако все не так
просто.
Часто бывают ситуации, когда текстура цвета натягивается на всю поверхность целиком,
а текстура бампа представляет собой, например, небольшую глубокую царапину или шрам,
расположенный на небольшом участке поверхности. Чтобы нарисовать такой шрам в виде
прямой линии, вам наверняка придется исхитряться, так как UV-раскладка обычно не является
прямоугольной сеткой. Вам просто захочется нарисовать такой шрам «как есть» и бросить его
на поверхность планарным маппингом в нужном месте. Но в этом месте уже есть маппинг для
текстуры цвета. Вот тут-то и пригодится возможность иметь несколько UV-сетов.
Другой пример - это всякие надписи, этикетки, татуировки, когда нужно поверх имеющейся
текстуры цвета, положить еще один или несколько дополнительных рисунков. В этом случае
текстуры смешиваются с помощью Layered Texture, но каждая из них ложится на поверхность
с соответствии со своим UV-сетом. Очевидно, что не очень просто нарисовать прямоугольную
этикетку на текстуре, если UV-раскладка не является прямоугольником.
Третий пример - это мех, который терпеть не может глобальных планарных проекций и
требует, чтобы UV-координаты не перекрывались и находились в сакральном квадрате, что, в
общем случае, не всегда выполняется. Поэтому часто для меха создается свой UV-сет, по которому
он нормально кладется и расчесывается, а текстуры рисуются по другим UV-раскладкам.
Более того, все трюки и инструменты для рисования атрибутами по поверхности, требуют
для себя UV-раскладки, и не факт, что сделанная вами развертка им понравится. Примерами могут
быть экспортирование весов скининга, создание системы волос, рисование карт для атрибутов
волос и т.д. Любое рисование атрибутами требует непересекающихся UV-координат.
Но если есть несколько UV-сетов и несколько текстур, то должен быть инструмент для
связывания или задания соответствий между UV-сетами и текстурами. Этот инструмент - а
точнее, окно - находится в меню Window=>Relationship Editors=>UV Linking. Принцип его работы до
безобразия прост и напоминает работу с Connection Editor, однако мы глянем на него на несложном
примере.
Создайте футбольный мяч.
Для этого в меню Create есть специальный примитив Soccer Ball.
Откройте Texture Editor и полюбуйтесь на UV-координаты.
Для пущей выразительности назначьте текстуру ball.iff на канал Color материала Lambertl.
А теперь представьте, что это не простой мяч, а с автографом Марадоны для фанатов
«Спартака».
Текстурирование
507
То есть у вас есть образец его подписи, и вы хотите ее подделать и положить на
определенный участок мяча.
Если расписаться с помощью 3D Paint Tool в произвольном месте, становится понятно, что
нарисовать подпись прямо на текстуре в Фотошопе будет непросто.
Гораздо проще сделать новый набор UV-координат, например, используя направление
взгляда из камеры на нужный участок, и назначить текстуру подписи в соответствии с этим
набором.
Займемся этим.
Сначала сделаем новый UV-сет.
Откройте Option Box операции Create Empty UV Set и введите имя SpartakUV.
Нажмите Create. Ничего визуального не произойдет.
Теперь необходимо переключиться в этот новый UV-сет. Он, очевидно, будет пустым, то
есть нам не будет никаких UV-координат.
Примечание. Вы всегда можете скопировать имеющуюся раскладку или ее часть в
новый (или другой) UV-cem. Для этого достаточно выбрать ювишки и выполнить
операцию Copy UVs to UV Set.
Бескомпромиссно удобно переключаться между UV-сетами с помощью правой
кнопки мыши, нажатой над поверхностью, и меню UV Sets.
Переключитесь в новый сет SpartakUV.
508
Книга Сергея Цыпцына
Обратите внимание, что в Texture Editor исчезли все UV-координаты.
Создадим их для этого UV-сета.
Выберите грани, на которые вы хотите наложить автограф.
Выполните операцию Create UVs Based on Camera.
В Texture Editor появится отличная развертка. Дело за малым: накидать текстуры.
Для начала назначьте текстуру с надписью в канал Incandescence, чтобы проверить, как
все работает. Этот канал - хорошая площадка для тестирования.
Файл текстуры называется Spartak.tiff.
Упс! Несмотря на то, что мы, вроде как, работали в новом UV-сете, текстура легла на
первый UV-сет, который традиционно дивно называется тар1.
Перекинем ее на SpartakUV.
Пользуясь могучей правой кнопкой мыши, вызовите окно UV Linking.
Дальше, пользуясь здравым смыслом, присоедините текстуру file2 (содержащую spartak.
tiff) к UV-сету SpartakUV.
Текстурирование
509
Таким образом, мы раскидали текстуры по UV-сетам.
Теперь соберем их в одну слоеную текстуру, которую повесим на цвет.
Отдерите текстуры filel и file2 от их каналов.
Назначьте на цвет Layered Texture.
Откройте HyperShade и перетащите оттуда текстуры filel и file2 в Attribute Editor, в поле
Layered Texture Atributes.
Расположите их так (средней кнопкой), чтобы текстура Ше2 была левее, чем filel, а
зеленую, дефолтную, текстурку убейте.
Судя по окну камеры, наш UV Linking слетел напрочь. Мило.
Однако если вы выключите High Quality Rendering или просто просчитаете картинку, то
увидите, что все в порядке: UV-связи на месте. Теперь, двигая ювишки в Texture Editor, вы можете
располагать свою надпись, как угодно.
Можете бросить текстуру file2 также на канал бампа, чтобы насладиться мультитекстурингом
по полной программе. Однако если вы повернете мяч и просчитаете картинку немного сбоку,
то обнаружите, что задние грани, на которых нет UV-координат дпя второго UV-сета, выглядят
гораздо светлее.
510
Книга Сергея Цыпцына
[%
Это связано с тем, что текстура с надписью накладывается не на все грани, а только на те,
которые были выбраны при создании планарного маппинга для UV-сета spartakUV.
По умолчанию на всех остальных гранях эта текстура будет показана серым цветом,
который при накладывании на красно-синюю текстуру сверху даст наблюдаемое осветление.
Чтобы исправить эту ситуацию, надо открыть Attribute Editor для текстуры file2 и сделать
атрибут Default Color черным. Это определит, что в всех областях, где нет текстурных координат,
текстура будет просчитываться, как черный цвет.
Откройте также Attribute Editor для Layered Texture и поиграйте с параметрами смешивания
слоев Blend Mode, аналогичными фотошопным. Учтите, что они влияют на то, как данный слой
накладывается на слои, расположенные справа от него в Attribute Editor. Иначе говоря, слои слева
выше, чем слои справа.
Мультитекстуринг как средство борьбы со швами
Если вспомнить наше пернатое чудовище, можно попробовать применить мультитекстуринг
как средство замаскировать швы на поверхности. В самом делеу можно перенести раскладку
крыльев в отдельный UV-сет, затем нарисовать разные текстуры для тушки и крыльев, смешать их
в Layered Texture, нарисовать маску перехода и ... И тут возникает логическая засада. Раскладки
для крыльев и тушки, сделанные нами, предназначены для непересекающихся граней. Иначе
говоря, участок крыльев не пересекается с участком тушки, поэтому просто невозможно сделать
так, чтобы одна текстура плавно переходила в другую в районе шва.
Вывод: для мультитекстуринга надо делать пересекающиеся раскладки в разных UV-сетах.
Откройте файл duckUVhalfOK.ma.
Выберите все грани крыла (это легко сделать, выбрав в Texture Editor ювишки крыла и сконверировав
выбор в грани). Добавьте к ним соседние грани, на спине, в районе крепления крыла.
Скопируйте ювишки выбранных граней в новый UV-сет, названный wingUV:
Copy UVs to UV Set=>Copy into New UV Set.
Теперь вы находитесь к новом UV-сете.
Пришейте грани спины к раскладке крыла.
Текстурирование
511
Теперь мы имеем UV-раскладку утки, где ювишки для крыла и тушки разнесены по разным
UV-сетам и имеют пересекающиеся грани.
Сохраните файл как duckUVmultitex.ma.
Для тренировки назначим две сильно разные текстуры на тушку и крылья, а точнее -
смешаем их в Layered Texture.
Назначьте на канал цвета материала lambertl текстуру Layered Texture.
Перетащите в нее из HyperShade уже имеющийся checker, а также создайте и перетащите
туда же fractal. Пусть fractal будет слева, a checker справа.
Сейчас обе текстуры используют UV-сет тар1.
Присоедините текстуру fractal к UV-сету wingUV.
512
Книга Сергея Цыпцына
Теперь видно, что fractal лежит на крыле, a checker просвечивает из-под него, в тех
местах, где нет UV-координат в UV-сете wingUV.
И, наконец, немного магии. Рисуем маску перехода между текстурами.
Выберите утку и позовите 3D Paint Tool.
Выберите канал Transparency для рисования новой текстуры. Выбор канала произволен,
потом мы просто отсоединим эту текстуру и используем ее в качестве альфа-канала для текстуры
fractal.
Назначьте новую текстуру, нажав Assign /Edit Textures.
Вся поверхность почернеет.
В принципе нам все равно, какой UV-сет использует текстура прозрачности. По умолчанию
она присоединяется к основному сету тар1. Нам важно нарисовать белую маску с мягкими
краями на поверхности - там, где должна быть видна текстура крыла, то есть fractal. Однако
чтобы минимизировать покраску и заодно узнать любопытные особенности мультитекстуринга,
перекинем текстуру, которой мы сейчас рисуем в UV-сет wingUV.
Присоедините текстуру filel к UV-сету wingUV.
Почернеет только крыло и кусочек спины, так как в этом UV-сете есть UV-координаты
только для этой области.
Polygons Subdivs View Select Tool Smage Рапй!»
Options Haip
Выйдите из 3D Paint Tool и зайдите в него опять, чтобы обновить разрешенную область
закрашивания. Залейте крыло белым цветом, используя кнопку Flood. Затем нарисуйте на спине
черные полосы по краям границы, а дальше, используя режим Blur, сделайте мягкий переход
между черным и белым цветом.
Нажмите кнопку Save Textures.
Откройте Attribute Editor для материала lambertl.
Отсоедините текстуру filel от канала прозрачности.
Откройте закладку для Layered Texture.
Текстурирование
513
шшш
Перетащите из HyperShade нарисованную текстуру filel на канал Alpha для слоя fractal в
Layered Texture.
Если ваша видеокарта достаточно крута, чтобы отобразить всю эту вакханалию, то вам
повезло. Менее везучие текстурщики могут просто отрендерить изображение.
Возможно, с первого раза вы еще не «попадете», но вооружившись передовой технологией,
сможете докрасить маску перехода. Как видите, fractal и checker мягко смешиваются на спине.
Если это будут более похожие текстуры, вряд ли кто-нибудь заметит шов.
Остается несколько моментов.
Явно видно, что на шее шашки несколько темнее, чем в области перехода. Тут уместно
вспомнить, что мы нарисовали маску filel для UV-сета wingUV, который покрывает только область
крыльев, следовательно на области шеи, этой текстуры просто нет, она там «не лежит». Там же
«не лежит» и fractal, присоединенный также к wingUV. Здесь еще более уместно будет вспомнить,
что у каждой текстуры есть атрибут Default Color, задающий цвет, в который окрашивается
поверхность там, где текстура «не покрывает» поверхность, например из-за отсутствия UV-
координат. Следовательно, на шее «из-под» фрактала «вылез» серый дефолтный цвет, который
наша маска filel не отрезает, поскольку она туда просто «не дотягивается». Маска filel тоже
представляет собой серый цвет в области шеи. У нас есть три выхода из сложившейся ситуации.
Первый состоит в том, чтобы назначить текстуру для тела, то есть checker, на атрибут Default Color
для fractal.
Второй, более элегантный способ состоит в том, чтобы Default Color для текстуры filel
назначить черный цвет, сделав, тем самым, маску черной везде, где бы она ни лежала. Это
отрежет серый цвет, торчащий из-под фрактала.
514
Книга Сергея Цыпцына
А какой же третий способ? Он плавно переходит в универсальный совет для
мультитекстуринга.
Совет. При создании раскладок для разных UV-cemoe старайтесь, чтобы в каждом
из них UV-координаты были созданы для всей поверхности, иначе в «дырках»
полезет серый цвет. Причем на тех участках (гранях), которые не видны под
маской, маппинг может быть какой угодно, лишь бы был.
Если вам не лень, можете быстро проделать следующий эксперимент в порядке борьбы с
серым цветом.
В UV-сете wingUV выберите все ювишки.
Превратите их в выбранные грани.
Прямо на поверхности, инвертируйте выбор граней, выбрав, тем самым, не замапленные
грани. Набросьте на них планарный маппинг.
Стяните их в точку, пользуясь Align UVs.
Разместите эту точку в области, где нарисована черная маска.
Шашки станут нужного цвета.
Мультитекстуринг с масками перехода часто используется в ситуациях, когда на соседних
участках поверхности используется принципиально разный маппинг, например в области плеча.
Еще одним примером может служить использование фотографий в качестве текстур. Представьте,
что вы смоделировали голову по двум фотографиям: в фас и в профиль. Чтобы использовать
эти изображения как текстуры можно сделать два UV-сета, в одном из которых будет планарная
проекция в фас, а в другом - в профиль. Соответственно, в Layered Texture должны быть смешаны
эти две текстуры, подсоединенные к своим UV-сетам. А дальше остается хитро нарисовать маску «по
диагонали», чтобы фас плавно переходил в профиль. Вот это уже будет настоящее шаманство.
Текстурирование
515
шшш
Для тех, кто случайно не в курсе.
Если вы стали крутым трехмерщиком совсем недавно, то можете еще быть не в курсе,
что разрешается назначать разные материалы на разные грани одной и той же поверхности.
Достаточно их выбрать, а потом выполнить в HyperShade команду Assign Material to Selection.
Соответственно, на разных гранях могут быть не только разные текстуры, но и разное освещение.
Поэтому не обязательно пилить поверхность на куски (то есть на более мелкие объекты) , чтобы
затекстурировать разные участки по-разному.
«Оверлампинг»
Приходит маленький двухмерщик к большому трехмерщику и спрашивает: «Дядя, а что
такое оверлампинг?!». На что последний отвечает, горестно таращась в монитор: «Это, брат,
такая штука, когда добавляешь-добавляешь источники света, а текстура от этого лучше не
становится...»
Шутка! То есть, на самом деле, опечатка! Реально, конечно, речь идет об оверлапинге
(overlapping). То есть о ситуациях, когда UV-координаты поверхности пересекаются между собой
в Texture Editor. Точнее говоря, когда пересекаются куски (shells) одной UV-раскладки в рамках
одного UV-сета.
Как правило, в подавляющем большинстве источников информации эта ситуация заклеймена
как чудовищная, зловредная и антигуманная. Однако все не так радикально плохо.
Во-первых, если на разных гранях будет лежать разный материал и, соответственно,
разные текстуры, то эти грани вполне могут иметь пересекающиеся UV-координаты в Texture
Editor: ведь они текстурируются независимо.
Во-вторых, при симметричном текстурировании UV-раскладки зеркальных половин
находятся в одном и том же месте и, следовательно, стопроцентно пересекаются, причем эта
ситуация используется во благо и не приносит вреда.
В-третьих, мы сейчас разберем конкретный пример, когда пересечение UV-координат
позволяет ускорить рендеринг, но сначала поговорим, в каких ситуациях все-таки стоит избегать
оверлампинга - пардон!, оверлапинга.
Самый очевидный пример - это 3D Paint Tool. Если вы хотите хоть что-то нарисовать с его
помощью, куски вашей UV-раскладки не должны пересекаться. Иначе вы будете в одном месте
рисовать, а ваши безумные мазки появятся совсем в другом.
Другой небанальный пример - это мех или волосы. Эти UV-рэкетиры требуют
непересекающегося маппинга, расположенного в UV-квадрате [0-1]. Причем они не отказываются
создавать щетинистый покров, однако работать с ним - и уж тем более - красить его свойства
будет невозможно. Поэтому если вы собираетесь красить не только обычные текстуры, но и просто
карты атрибутов, вам понадобится непересекающийся маппинг.
Если вы собираетесь экспортировать карты каких-нибудь весов, например скининга, вам
также понадобится «хороший» маппинг на поверхности.
При создании Paint Effects на полигональной поверхности, путем рисования по ней,
штрихи будут создаваться совсем не там, где вы их ожидаете увидеть. Попробуйте сами: бросьте
на полисферу планарный маппинг, сделайте ее Make Paintable и попробуйте посадить на ней
травку.
В принципе, для вышеупомянутых целей зачастую годится и автоматический маппинг: ведь
он порождает хоть и многочисленные, но не пересекающиеся куски. Однако для работы с мехом
нужно будет учитывать еще и ориентацию кусков.
А теперь поговорим о пользе оверлапинга, известного также под названием овермаппинг,
да простят меня любители изящной русской словесности.
516
Книга Сергея Цыпцына
Овермаппинг. Экономия экономия времени и нервов
Здесь я приведу пример, который прислал мне мастер UV-дзен Сергей Луценко. Пример
выдернут из реального производства и показывает, что к процессу текстурирования надо подходить
не только творчески, но и аккуратно, принимая во внимание множество деталей, на первый взгляд
незаметных или неважных.
Для примера использована модель аудиоколонки, скромной участницы одного из эпизодов
мультфильма «Элька». Майская сцена с моделью и текстурами находится в файле kolonka.mb.
(Автор модели - Сергей Луценко, автор текстур - /1ена Зацепина.)
С топологической стороны объект, сам по себе, не Бог весть какой. Модель, соответственно,
тоже несложная. Но для иллюстрации метода подходит идеально.
Итак, что мы имеем? По сути ящик о четырех сторонах. Пусть и несколько необычной
формы. С полукруглыми вздутиями, скосом в верхней части и углублением лицевой панели. На
лицевой панели разместились «накладные детали» - выходы «спикеров», нечто вроде сабвуфера
внизу и декоративные гайки.
Первое, что мы должны сделать, это определить, сколько файлов текстур нам нужно, чтобы
все это раскрасить и зашейдить? Естественно их будет столько, сколько UV-кусков мы произведем.
А сколько их произвести?
Ведь можно все выкройки уместить на один лист. И у нас получится нечто вроде набора
непересекающихся деталей.
Текстурирование 517
Lii.OJ.iJ
Правильно ли это? Однозначного ответа здесь нет и быть не может. Все зависит от
ситуации. В нашем случае ситуация такова. Эта модель - участник большой и сложной сцены, в
которой присутствуют много других предметов, и очень сложных и очень простых, но в огромном
количестве (например, целая гора простых полигональных кубов, но которых - очень много).
Сколько предметов будут присутствовать в кадре единовременно, на момент моделирования
объекта известно не было. Схема расположения камеры не была еще готова. И про движение
камеры тоже ничего не было известно. Но мы рассчитывали, что могут возникнуть случаи, когда
в кадре присутствуют одновременно все объекты.
Это означало бы, что нагрузка на текстурную память MAYA может возрастать многократно!
А с этим делом у нее всегда проблемы. И, значит, наша задача помочь программе управиться с
таким большим объемом текстур. А как это можно сделать?
Известно (и проверено экспериментально), что MAYA быстрее считает сцену, в которой
есть две текстурки по 1000x1000 пикселей каждая, чем сцену с одной текстурой в 2000x2000.
(Кстати, это - самое ценное замечание, следующее из данного примера.)
Более того, в нашем конкретном примере сама колонка состоит из деталей, которые
разительно отличаются друг от друга по размерам. Сравните хотя бы размер корпуса и гаек. То
есть все детали можно условно разделить на группы, в зависимости от размера. Групп будет
шесть:
1. Корпус.
2. Опять корпус. Так как на него приходится две группы.
3. Внешняя часть спикеров
4. Сердцевина спикеров
5. Выкройка сабвуфера и внешняя часть овального спикера
6. Гайки
Это условное деление можно представить в Texture Editor как пять областей (рисунки взяты
из папки Kolonka).
Можно было, конечно, свести число групп до пяти, объединив все внешние части спикеров
в одну раскладку. Ну, да ладно. Шесть так шесть.
Шесть групп объектов означают шесть листов UV-выкроек.
UV-листом назовем набор выкроек, умещающихся в пространстве UV-квадрата (в пределах
от 0 до 1), который создается с помощью команды UV Snapshot.
Перед тем, как закончить первую, «осмыслительную» часть анализа модели, до ее
518
Книга Сергея Цыпцына
№
обмапливания, назову еще одно соображение, которого следует придерживаться. Причем
всегда.
Это крупность предметов в кадре при финальном рендеринге. Она влияет на размер
создаваемых файловых текстур.
Если предмет попадает на передний план и виден во всех деталях, размер выкройки
должен «выдерживать» такое увеличение. Другими словами, размер выкройки детали должен
обеспечивать качественный просчет без того, чтобы ЛЛАУАне пришлось производить доинтерполяцию
недостающих пикселей.
Вернемся к нашему кино. Разрешение кадра у нас составляет 1920x1080 пикселей.
Было известно, что никто не станет наезжать камерой на гайку, так, чтобы она занимала даже
пол кадра (не говоря уже обо всем кадре). Хорошо, если камера захватит крупным планом саму
колонку. И то вряд ли. Но на всякий случай мы подготовимся к «крупняку».
Предположим, что колонка будет иметь в кадре крупность «в полный рост».
Видно, что корпус использует всю высоту кадра и даже слегка выходит за его пределы. А
гайки при финальном рендеринге займут хорошо если 50 пикселей картинной плоскости кадра.
Спикеры тоже покрывают небольшую площадь.
Значит, выкройка для корпуса должна иметь большее разрешение, чем для других деталей.
И оно должно быть несколько больше, чем высота кадра. Скажем около 1200 пикселей на все про
все. А для гаек, если мы их всех разместим на одном листе, размер выкройки не стоит делать
большим, чем 200 на 200 пикселей.
Если бы у нас был «дешевый» видеопроект или игрушка, то для гаек мы бы не стали делать
каждую выкройку отдельно, а создали бы одну выкройку на всех, и она была бы еще меньше.
Теперь подбираем размер листов для всех деталей колонки, то есть шесть листов выкроек будут
иметь разные размеры.
На этой стадии анализа модели в расчет берется следующее:
1. Композиция кадра - то есть размер модели на экране.
2. Сложность деталировки, или «иерархия размеров», которые определят впоследствии
количество UV-листов.
3. Количество текстурной памяти, которое весь этот набор отъест у MAYA. Или MAYA отъест
у него.
Вроде все. С анализом покончено. Теперь начинается рутина, в которой ничего сложного
нет.
С точки зрения моделирования и маппинга колонка не представляют из себя ничего
Текстурирование
519
интересного. Все накладные детали - по сути полусферы - были обмаплены простым планаром.
Ну, с легким, последующим Relax UVs.
Потом все это было загнано в UV-листы.
520
Книга Сергея Цыпцына
Кстати, в ходе этой работы были найдены невыявленные ранее, легкие «косяки». И хорошо,
что они были. Есть повод обратить на них внимание.
Взглянем на гайку. Выкройка и деталь, вроде бы, выглядят прилично.
Но более подробный анализ выявил лишнюю грань, которая скрыта внутри тела гайки. В
кадре она не видна, покрашена не будет, а значит - никому не нужна.
Убив ее, «облегчаем» модель, работу - программе, а свою душу - от греха...
Поэтому, не надо забывать следить за топологической чистотой своих моделей. А улучшение
модели продолжается и на стадии UV-маппинга.
Текстурирование
521
шиш
С накладными деталями все понятно. Их отмапили планаром. Уложили в четыре листа,
дав им соответствующие названия, чтобы потом их легко было идентифицировать. Выкройки друг
друга не перекрывают. То есть являются стандартными.
Теперь берем корпус.
Мы уже говорили, что, невзирая на все загибоны в его форме, по сути это - коробка с
четырьмя сторонами: две лицевых (плюс вдавленная часть) и две боковых. А значит мы легко
можем позволить себе обмапить их тем же планаром.
Последим только за тем, чтобы выкройка всегда лежала к нам как бы лицевой стороной,
а не обложкой. То есть в выкройке левой боковушки перед будет смотреть влево, а в правой,
соответственно, вправо.
Так текстуровщику легче будет воспринимать модель и красить ее.
522
Книга Сергея Цыпцына
Мапим стороны, как обычно, поочередно, выбирая грани сторон и набрасывая планары.
Двигаем все это в разные стороны, чтобы пока ничто не мешало друг другу.
И получаем стройную шеренгу из выкроек.
Текстурирование
523
ШШШ
На желтый цвет модели не обращайте внимания. Это очередной милый OpenGL-ный глюк
MAYA 6.5. Подходим к последнему моменту создания UV-листа для корпуса.
Вопрос: Могли бы мы оставить выкройку в уже готовом виде?
Ответ: Формально говоря - ДА! В принципе нам ничего не мешает иметь на одном листе не
перекрывающие друг друга выкройки сторон корпуса.
Но каким тогда должен быть размер листа при такой раскладке?
Вспоминаем наши рассуждения. По 1200 пикселей должно приходится на пространство,
занимаемое высотой выкройки. Но кому тогда нужно пространство над полученными кусками в
верхней половине квадрата?
Слышу крики особо продвинутых читателей: «А почему нельзя было заполнить оставшееся
пространство выкройками всех остальных накладных деталей. Например вот так.»
Тут самый раз вспомнить тезис о том, что две по тысяче рендерятся быстрее, чем одна по
две. И это правило продолжает работать в случае с колонкой.
524
Книга Сергея Цыпцына
Поэтому возвращаемся к выкройке корпуса и принимаем наглое решение.
Увеличиваем (равномерно по обоим направлениям, чтобы не терять пропорции!) размер
выкроек и размещаем их друг поверх друга так, чтобы они заполнили весь квадрат.
Теперь надо разобраться с тем, как разделить эту мешанину на листы выкройки и, самое
главное, как этим пользоваться потом при наложении текстур.
А очень просто! У нас будет два листа ювишек. Один лист с выкройками боковых сторон.
И один лист для граней, составляющих фасад и тыл модели.
Разделение производится по очень прозрачной методике, основанной на том, что
команда UV snapshot, с помощью которой производится снимок выкройки, работает не только при
выделенной в камере модели, но также и для отдельных выделенных граней.
Так это же нам и требуется! На одной выкройке нам нужны грани боковушек колонки, а на
другой - только фронтальные и задние (не хотелось их так обзывать) грани.
Выделять грани можно всеми доступными способами, включая традиционное «ползание»
по модели в панели камеры.
Но мы же собираемся стать совсем взрослыми мальчикам. И поэтому пойдем другим путем
- а заодно познакомимся с тем, каким удобным средством может выступать Texture Editor в плане
выбора компонентов объекта.
Начнем отделять фасадные и тыловые грани. В окне Texture Editor выделяем на выкройке
по одной-две UV вершины на каждой выкройке.
Затем выполняем в Texture Editor супер-команду Select=>Select Shell.
Текстурирование
525
И получаем такую картину (внизу) - все ювишки, принадлежащие выкройке нужных нам
граней, на ней выделены.
Теперь надо это превратить в грани. Ничего не трогаем.
Выделения ювишек не снимаем.
В том же меню Select выбираем Convert Selection to Faces.
И все нужные грани оказываются выбранными.
Теперь надо сделать снимок выкройки
Внимание! Ничего не трогайте руками. Выделение граней должно быть еще активно!
Используем команду UV Snapshot.
526
Книга Сергея Цыпцына
Выскакивает окошко, в котором задаем вменяемое имя для выкройки, чтобы текстурщик,
следующий за вами по технологической цепочке, мог потом понять, что это за деталь.
Цвет выкройки (Color Value) можно сделать ядовито зеленым. Потом, в Фотошопе, ее
можно продублировать дважды, и ее будет очень хорошо видно поверх любого цвета.
Одна выкройка готова. Теперь надо также быстро и ловко выбрать оставшуюся часть.
Для этого надо просто инвертировать выбор граней.
Нижняя грань (квадратное основание красить не будем) не нужна, поэтому снимаем с нее
выделение, чтобы не загромождала выкройку и не путала текстуровщика. В принципе ее можно
даже убить, но пока страшновато - а вдруг еще пригодится?
Текстурирование
527
Повторяем операцию UV Snapshot для выбранных граней.
Работа сделана. В результате имеем шесть листов выкроек, которые потом превратятся в
шесть файлов текстур. Эти текстуры будут наложены на разные объекты (накладные детали) и на
две разные порции граней колонки.
На грани корпуса приходятся две текстуры:
out_parts.tif и inner_part.tif, каждая по 1200x1200.
out_parts.tif 1200x1200
inner_parts.tif 1200x1200
На остальные части еще четыре более мелкие текстуры.
dinamik2.tif 550x550
subwoofer.tif 380x380
hearts.tif 250x250
gaiki.tif 150x150
Дальнейшее сравнение скорости рендеринга показало следующие результаты:
Шесть материалов с шестью текстурными картами различных размеров обеспечили просчет
крупного плана колонки за четырнадцать секунд против девятнадцати секунд при использовании
одной карты, но большего размера (2200x2200), предусматривавшей размещение всех деталей на
одном листе.
Незначительный выигрыш, скажете вы?
Когда в сцене таких колонок пять и плюс еще 600-800 объектов, все эти выигранные секунды
складываются и дают ощутимое сокращение общего времени просчета всех последовательностей
для эпизода.
528
Книга Сергея Цыпцына
Сделаем выводы.
Overlapping mapping - прогрессивный подход.
Его достоинства: помогает существенно экономить и рационально использовать UV
пространство модели.
Его недостатки: требует предварительного планирования работы и анализа модели.
В UV-маппинге нет канонических правил. Это дело живое и требует разных подходов в
различных ситуациях.
Например, если речь идет о прозрачных поверхностях, которые могут потребовать
нескольких текстурных карт и нескольких проходов рендеринга, лучше выносить их на отдельные
UV-листы, чтобы не смешивать их с другими выкройками.
Показанный здесь способ - всего лишь один из многих, поэтому приветствуются разные
подходы, наиболее удовлетворяющие производственным требованиям и личным предпочтениям.
UV-координаты и NURBS-поверхности
Потаскав за вершины в Texture Editor, вам возможно захочется сделать что-нибудь подобное
с UV-координатами сплаиновых поверхностей, представляющих собой, по умолчанию, идеальную
прямоугольную сетку. Такая возможность есть, однако использовать ее в реальном деле будет
довольно проблематично.
Выбрав сплайновую поверхность, вы можете открыть Texture Editor и, нажав там правую
кнопку мыши, включить опцию Edit NURBS UV Mode. А дальше резвиться обычным образом.
Текстурирование
529
1Ш1_У
Однако результат ваших резвых игрищ будет виден, в лучшем случае, только на экране.
Ни Render View, ни даже High Quality Shading не покажут вам результат редактирования UV-
координат.
Вопрос: Для чего тогда это нужно?
Ответ: Для продвинутых игровых движков, поддерживающих сплайновые поверхности и
укомплектованных хорошими программистами.
Точка.
Конец связи.
UV-координаты и сабдивы
С текстурированием сабдивов все достаточно просто. Сабдивы в подавляющем количестве
случаев получаются из полигональных моделей и во время конвертации благополучно наследуют
маппинг исходной полигональной поверхности. Поэтому общий (теоретический) подход таков:
моделируем объект в полигонах, текстурируем его, конвертируем в сабдив, правим маппинг на
сабдиве.
Однако некоторые радикальные любители сабдивов могут возмутиться таким
принудительным текстурированием перед конвертацией - ведь хочется окончательно завершить
форму модели, а уж потом браться за текстуры. Поэтому меняем подход на более практичный:
1. Моделируем до упора, переключаясь из полигонального режима в сабдив и обратно,
сколько душе угодно.
2. Закончив шедевр моделирования, переключаемся в полигональный режим, чтобы
видеть базовую полигональную сетку.
3. В этом режиме мапим и текстурируем полигональную сетку.
4. Включаем секретный атрибут.
5. Переключаемся в режим сабдива, наследуя маппинг.
6. Редактируем вручную окончательный маппинг на сабдиве.
Итак, весь секрет в том, что когда вы переключаетесь в полигональный режим
редактирования сабдива, в истории объекта возникает нода типа polyToSubdiv. У этой ноды есть
секретный атрибут UV treatment («UV-трактовка»). Который по умолчанию установлен в Keep Subd
UVs. А это означает, что UV-координаты сабдива не зависят от маппинга его базовой полигональной
сетки.
530
Книга Сергея Цыпцына
№
Если же установить этот атрибут в Inherit UVs from Poly, то сабдив унаследует весь UV-
маппинг со своей полигональной сетки. Напомню, что нода polyToSubdiv доступна, только когда
мы переключились в режим Polygon.
Еще один секрет состоит в том, что атрибут UV treatment устанавливает в Keep Subd UVs
каждый раз, когда вы переключаетесь в режим Polygon. Поэтому каждый раз после этого надо не
забыть разыскать ноду polyToSubdiv и установить там UV treatment=lnherit UVs from Poly (если вы,
конечно, занимаетесь при этом маппингом сабдива, а не просто моделированием).
Итак, с основными принципами маппинга сабдива все понятно. Используем знакомые
инструменты для маппинга полигонов, а сабдив счастливо наследует маппинг.
Рассмотрим некоторые тонкости.
Если вы сделали довольно изощренную модель, таская за вершины сабдива и редактируя
разные уровни, то при наследовании сабдивом маппинга с полигона могут иногда возникать разные
«косяки», особенно в областях редактирования точек на верхних уровнях сабдива. Поэтому для
сабдивов предусмотрена возможность редактировать ювишки индивидуально, то есть в режиме
сабдива.
Трудно назвать имеющиеся операции для работы с UV-координатами сабдивов иначе, как
куцым набором инструментов для маппинга. Их можно поискать в в Texture Editor, в меню Subdivs,
и в основном меню Subdiv Surfaces=>Texture. Однако при зрелом размышлении можно понять, что
этого достаточно.
Планарным и автоматическим маппингом редко кто пользуется, так как аналогичные
операции используются для базовой полигональной сетки, а потом наследуются на сабдив.
Самое главное, что есть сладкая парочка Cut UVs и Move and Sew UVs, вкупе с возможностью
перетаскивать ювишки вручную.
Вернемся, однако, к тонкостям.
Первая тонкость в том, что надо обязательно выбирать грани, перед тем как назначить
маппинг. Нельзя выбрать объект целиком и навалить на него планарный маппинг.
Вторая связана с тем, когда есть редактирование на верхних уровнях иерархии, то даже
если выбрана грань с нижнего уровня, маппинг накладывается на грани самого верхнего уровня,
на котором есть отредактированные вершины. Это довольно адекватно.
Текстурирование
531
После этого вы можете наблюдать довольно забавную картину в Texture Editor. Там
будут представлены UV-координаты граней с разных уровней. Их можно будет редактировать
одновременно.
Но напомню, что реально будут использоваться UV-координаты с самого верхнего
отредактированного уровня. Поэтому выбирайте ювишки только в Texture Editor, а не в окне
камеры.
Примечание. Имейте в виду, что если вы настроите ювишки в режиме сабдива, а
потом переключитесь в режим Polygon и включите UV treatment=lnherit UVs, то все
ваши отредактированные ювишки будут потеряны при переходе обратно в режим
сабдива, так как унаследуются с базовой полигональной сетки.
И последнее замечание по поводу текстурирования сабдивов.
Никаких UV-сетов! Для сабдивов они просто не предусмотрены.
532
Книга Сергея Цыпцына
Советы. Трюки. Угрозы. Меховая тема
Приведу немного практических советов по работе с UV-маппингом. Часть из них я получил
от одного из мастеров UV-дзен - Саши Коршунова.
Если возвратиться к меховой тебе, следует упомянуть, что назначения автоматического
маппинга на поверхность, как правило, недостаточно для последующей нормальной работы с
мехом. После выполнения Layout UVs, входящего в автоматический маппинг, куски выкройки
могут быть повернуты друг относительно друга весьма непредсказуемым образом. Более того,
даже создав, казалось бы, идеальную раскладку персонажа для рисования текстуры, вы можете
обнаружить, что она не подходит для меха. Все дело в причесывании, точнее в использовании
рисования атрибутами меха для причесывания.
Откройте, например, файл ratUV.ma, содержащий модель пасюка, на которого только что
назначили мех.
UV-координаты у него просто волшебные, так как он готов к текстурированию. (Автор этого
чуда - Саша Коршунов.)
Теперь, если вы захотите причесать персонаж одним движением мыши, используя Paint
Attributes Fur Tool, ворсинки наверняка полезут в разные стороны в тех областях, где находятся
текстурные швы. Приглядевшись, вы увидите, что уклон разных участков меха точно соответствует
лоскутам из ювишек, если посмотреть раскладку объекта в Texture Editor.
Текстурирование
533
1Ш1У
Соответственно, вам надо всего лишь аккуратно и адекватно повернуть и расположить
ювишки в Texture Editor.
Кроме того, следите, чтоб ювишки не касались границ квадрата [0-1], так как карты
атрибутов меха повторяются, и поэтому на крайние верхние ювишки может повлиять цвет текстуры
снизу (это связано с фильтрацией текстур). Просто немного сожмите все ювишки в переделах
квадрата.
Советы. Трюки. Угрозы. Универсальный трансфер
Таскание ювишек руками с Texture Editor напоминает плоское моделирование, только с
более ограниченным набором инструментов. Довольно распространенный трюк состоит в том,
что проще перемоделировать трехмерную модель для более простого маппинга, чем пытаться
«перемоделировать» сам маппинг в Texture Editor. Для этого просто делается копия объекта,
из которой делается форма, более удобная для UV-маппинга, чем исходный объект. А затем
применяется команда Polygons=>Transfer для переносам UV-координат с объекта на объект.
Приведу некоторые способы быстрого перемоделирования.
Это прежде всего операция Average Vertices и использование режима Smooth в Sculpt
Geometry Tool.
Если у вас есть, например, голова (файл headUV.ma), вы можете сделать ее копию. И
выполнить операцию Average Vertices нужное количество раз.
534
Книга Сергея Цыпцына
№
Полученную «амебу» гораздо проще замапить, используя тот же самый сферический
маппинг или Unfold UVs.
Далее достаточно выбрать головы в нужном порядке и выполнить Transfer.
Потом можно удалить жертву усреднения и историю на оригинале.
Другой пример удачного перемоделирования и применения Transfer представляет собой
текстурирование всяких изогнутых трубок, ручек, спиралей, рогов, щупалец и других неудачно (с
точки зрения текстурирования) смоделированных конечностей.
Можете открыть файл homUV.ma и полюбоваться на инородную спираль. Форма у нее -
не подарок для текстурщика, да и наверняка потребуется изощренный дисплеисмент. Поэтому
проще ее скопировать, разогнуть в прямой равномерный «рожок-конус», замапить и перенести
UV-координаты обратно на оригинал.
Разгибать можно массой способов. В данном случае, берем в руки Joint Tool, вставляем
кости, а дальше - без комментариев, только по нижеследующим картинкам:
Текстурирование
535
536
Книга Сергея Цыпцына
Текстурирование
537
Проиллюстрированный способ «разгибания», конечно, не единственный. Просто кости
являются очень «гибким» деформером.
Советы. Трюки. Угрозы. Текстурирование после сетапа
Предположим, так случилось, что ваш объект отсетаплен (то есть имеет скелет, привязку
поверхности к костям и т.д) и есть необходимость его перемапить. Подумать страшно: снять скин,
сделать перемапливание, заново скинить. Конечно, всегда можно сохратить веса сетапа и прочее,
однако не всегда сетап заключается в привязке к костям, могут быть и латтисы, и кластеры, и
нелинейные деформеры, да мало ли что еще...
Тут на помощь приходит знание «подкожного» устройства майского скининга.
В файле skinUV.ma находится персонаж, которого «забыли» отмапить.
538
Книга Сергея Цыпцына
И что же делать? Выбрать поверхность и просто применить метод пристального взгляда к
Attribute Editor или Hypergraph.
Там можно найти секретную ноду ourCharacterShapelOrig (ищите все, что заканчивается на
Orig). Она сохраняет в себе первоначальную форму поверхности персонажа до всех деформаций.
Чтобы ее показать, надо в Attribute Editor, в закладке Object Display, снять галку Intermediate
Object.
А дальше все просто.
Надо изготовить копию персонажа.
Замапить ее нужным образом.
А затем перенести маппинг с копии на ноду ourCharacterShapelOrig. Для этого выбирать ее
нужно не на экране, а в Outliner или Hypergraph - именно как ноду типа Shape.
Советы. Трюки. Угрозы. Последние штрихи
И еще немного советов по облечению экологически вредного труда текстурщиков всего
мира. Обратите внимание на изначальный маппинг полигональных примитивов: он близок к идеалу
и может, в некоторых случаях, освободить от нудного перетаскивания, шитья и резки.
Враг текстуршика - это инструмент Bevel: это попросту недоделка программистов, кочующая
из версии в версию.
Учтите, что при использовании Anisotropic материала (без всяких текстур), каждый
использованный вами полигональный инструмент может быт использован против вас при
рендеринге, именно из-за ювишек (см. anisotropicUV.ma).
Текстурирование
539
Даже если использовать автомаппинг и сконвертировать карту из 30-текстуры, то все
равно там желательно «прибраться» во имя сокращения размера текстуры, не теряя ее качества,
mental ray обычно ругается, если ваши объекты не имеют UV-координат, а иногда и вовсе
отказывается рендерить поверхности.
Познайте сакральные кнопки, размещенные на полке в Texture Editor - большинство из
них сильно облегчают жизнь и резко ускоряют работу. Приучите себя пользоваться в Texture
Editor правой кнопкой с комбинациями Shift и Ctrl: это радикально ускоряет процесс выбора нужных
ювишек.
У некоторых пользователей в голове образуется каша из UV-координат, проекций текстур,
проекций текстурных координат, а также ноды place2dTexture. Еще раз напомню, что накладывание
текстур в виде проекции не нуждается ни в каких UV-координатах. Текстуры просто проектируются
на поверхность различными способами, в том числе из камеры, а текстурные координаты создаются
как бы «на лету», в соответствии с типом проекции текстуры.
Похожим образом проектируются и текстурные координаты, по которым потом будут
натягиваться текстуры нормальным (не проекционным) способом. Для этого используются
различные виды маппинга из меню Polygon UVs.
Вне зависимости, накладывается ли текстура как проекция или натягивается нормальным
образом, вместе с нею, по умолчанию, создается нода place2dTexture. Можно себе представить,
что она вставляется между UV-координатами и самой текстурой. Она определяет дополнительную
прямоугольную область в UV-пространстве (можно также сказать: в Texture Editor), в которой
располагается текстура. По умолчанию эта область совпадает с квадратом UV[0-1]. Вы можете
ассоциировать эту ноду с прямоугольником в Texture Editor, где находится текстура.
С помощью первой половины атрибутов этой ноды можно повернуть или растянуть этот
прямоугольник и, следовательно, текстуру. А вот вторая часть атрибутов относится к тому, как
текстура располагается внутри этого прямоугольника. Например, атрибут RotateUV поворачивает
текстуру внутри прямоугольника, не поворачивая сам прямоугольник, а атрибут Rotate Frame
вращает сам прямоугольник.
540
Книга Сергея Цыпцына
№
Эту ноду можно удалить, от этого текстура не пропадет с поверхности, но будет
накладываться с параметрами по умолчанию, без всяких вращений, повторений и т.д.
Мастера UV-дзен
Здесь я хочу поблагодарить мастеров UV-дзен помогавших мне с главой про текстурирование.
Это Сергей /1уценко, Ниле Блумберг, Алекс Киянцев, Саша Black Коршунов, Ян Зубарев.
Текстурирование
541
542
Книга Сергея Цыпцына
АНИМАЦИЯ
Анимация
Прежде чем говорить про анимацию, я, как обычно, хотел бы определиться в терминах.
Но не в компьютерных и не в «майских». Давайте разберемся, что такое анимация и кто такие
аниматоры.
Аниматоры в традиционном понимании - это люди, производящие анимацию. Если
говорить про трехмерную графику, можно сказать: это люди, владеющие искусством правильной
расстановки ключей. Они знают все про то, каким должно быть «правильное» движение, и все,
что от них требуется, это выдавать некоторую норму анимации в день, то есть уметь расставлять
ключи и править анимационные кривые. В этом смысле технически от аниматора требуется совсем
немногое: главное, чтобы он владел магией создания движения, а под анимацией в этом случае
понимается просто процесс расстановки ключей на уже подготовленного персонажа.
Однако если посмотреть на слово «анимация» с точки зрения MAYA, как на совокупность
инструментов и методов для подготовки, настройки и оживления персонажа, то обнаружится,
что этот термин обозначает совсем другой, более широкий класс задач, относящийся больше к
технологиям, чем к искусству. Аниматор, в этом смысле, человек ответственный не только за
движение, но и за настройку и подготовку объектов к анимации, организацию наиболее удобной
среды для постановки анимации, добавление персонажу новых «способностей» и еще за массу
вещей.
Поэтому когда вы произносите модное словосочетание типа «анимация в AAAYA», следует
сразу уточнять, что вы имеете в виду.
Я предпочитаю называть аниматорами тех одаренных людей, которые собственно создают
движение. Как правило, для них уже сделан хорошо настроенный персонаж и их совершенно не
заботит его внутреннее техническое устройство. Главное - что умеет делать персонаж, то есть
то, как он может двигаться. Все, что должен делать такой аниматор - это расставлять ключи,
изменять тип интерполяции, управлять камерой и, возможно, уметь работать с анимационными
клипами. Ну, конечно, сохранять сцену. А вот отвлекать аниматора на изменение кода expressions
или изменение иерархии скелетона, с моей точки зрения, неэффективно и бессмысленно.
Для того, чтобы создавать и настраивать персонажа, копаться в его внутренностях,
обучать его делать новые движения, обеспечивать его целостность и «работоспособность»,
нужны несколько другие люди. Их называют различными именами: настройщики персонажей,
технические аниматоры, «сетапщики» (от setup), технические директора и пр. В их обязанности
входит настраивать веса констрейнов, менять тип инверсной кинематики, писать формулы
expressions, задавать зависимость деформаций от движения, добавлять новые атрибуты, настраивать
мышечные сокращения и морфинг. Как видите, скучать им не приходится.
Конечно, если вы сам себе режиссер (а как я подозреваю, большинство читателей
относится к этой категории), то вы должны уметь делать все на свете, то есть быть и аниматором
и техническим директором. Проблема, однако, в том, что хороших аниматоров со знанием
программирования, равно как и толковых технарей, владеющих искусством анимации, в природе
встречается довольно мало и все они на вес золота. Это не означает, что я отговариваю вас
заниматься анимацией. Просто вы должны хорошо понимать свои сильные и слабые стороны и не
смешивать анимацию и настройку персонажей.
Примечание. В некоторых студиях используется радикальный и довольно
эффективный подход: за компьютером сидят два (!) человека. Один - классический
аниматор старой закалки, который, глядя на экран, говорит, что делать:
насколько и куда надо передвинуть объект в нужном кадре. Второй участник
тандема - назовем его «оператор» - быстро выполняет гениальные указания.
Можно проследить некоторую историческую тенденцию, связанную с анимацией персонажей
в MAYA. Изначально MAYA представляла собой совершенно разрозненный конструктор для сборки
544
Книга Сергея Цыпцына
№
персонажей, не имеющий даже минимальных заготовок для повседневного использования.
Пользователи (особенно избалованные пакетом Character Studio) просто терялись в зарослях,
среди всех этих, многочисленных инструментов, операций, понятий и технологий. Однако в
последнее время появляется все больше решений, представляющих модель антропоморфного
персонажа, полностью готового к использованию. Пока что эти решения - типа Advanced Skeleton
(http://www.animationstudios.com.au/) или aniMan (http://www.manus3d.be/ ) - не встроены в
AAAYA, однако мне кажется: все более осязаемая потребность иметь некий аналог Character Studio
для AAAYA приведет к тому, что в составе AAAYA появится что-то типа «супер персонажа на все случае
жизни». (Пока я писал книгу, компания Alias успела приобрести компанию Kaydara, а в седьмой
версии ААауа появилась Full Body IK - готовое решение для управления персонажем).
Подробнее о персонажной анимации, настройке персонажей и готовых решениях поговорим
позже, а сейчас я бы хотел обозначить, что вы найдете и чего не найдете в главах про анимацию.
Весь соответствующий материал посвящен технической анимации, то есть пониманию того, как
в AAAYA устроены инструменты для подготовки и производства различных типов анимации. И если
собственно «производство анимации» описывается в разделе, посвященном работе с Graph Editor,
а также в рубриках посвященных нелинейной и процедурной анимации, то «подготовка анимации»
включает в себя массу материала, от деформеров до скининга, предназначенного в основном для
«сетапщиков».
Примечание. «Сетапщик» - тот, кто отвечает за настройку (setup) персонажа:
изготовление скелетона, скининг, контрольные объекты, динамические атрибуты,
мышечные деформации и пр.
Я не буду касаться художественных аспектов постановки анимации, это не в моей
компетенции. Об этом написаны отличные книги и обсуждение этих вопросов выходит за рамки
книги «Понимая AAAYA». Я также не буду описывать процесс подготовки анимации (изготовление
раскадровок, аниматика и прочие вещи), предполагая, что вы прекрасно знаете о том, как это
полезно и необходимо. Все это тема отдельной книги, посвященной персонажной анимации.
Примечание. То, что я постоянно ссылаюсь на анимацию персонажей, не должно вас
смущать. Любой объект можно рассматривать как персонаж, поэтому более простые
случаи анимации (будь это космический корабль или памятник Дзержинскому) можно
тоже рассматривать как анимацию очень простых персонажей. Мир в последнее время
совершенно помешался на персонажной анимации, поэтому приходится следовать
моде.
Типы анимации. Немного терминологии
В компьютерной графике используется несколько типов анимации и еще больше терминов
для обозначения этих типов. Разберемся с ними на примере AAAYA.
Самый распространенный тип - анимация по ключам, или ключевая анимация. Иногда
даже говорят «традиционная анимация», норовя перепутать ее с рисованной анимацией.
Положение (форма, цвет) объекта задается пользователем вручную в ключевых кадрах (ключах),
а в промежуточных кадрах AAAYA интерполирует (просчитывает) движение объекта в соответствии
с формой анимационной кривой.
Процедурная анимация - это задание движения (формы, цвета) объекта с помощью
некоторых алгоритмов, определяемых в виде формул. Чаще всего этот тип анимации используется
для задания хаотических, циклических или вторичных движений. В AAAYA для этой цели используются
expressions.
Реактивная, или косвенная анимация - в этом случае один объект движется в зависимости
не от времени, а от движения другого объекта. В AAAYA примером такой анимации служит
технология Set Driven Key. С одной стороны, такая анимация явно процедурная, а с другой стороны,
Анимация
545
lilJJ
зависимость определяется не формулой, а анимационной кривой и ключами на ней. Другой пример
- использование констрейнов, когда один объект накладывает ограничения на движения другого
объекта и они перемещаются согласованно. Случай, когда атрибуты одного объекта напрямую
соединены с атрибутами другого, также можно отнести с разряду косвенной анимации.
Анимация вдоль пути - частный случай ключевой анимации, когда вместо произвольного
положения в пространстве, анимируется движение объекта вдоль кривой, на которой он
закреплен.
Динамическая симуляция - движение частиц, волос, одежды, твердых тел определяется
законами, зашитыми в «черный ящик» (Solver), недоступный пользователю. Пользователь может
только менять начальные условия и свойства объектов, однако все траектории движения вычисляет
этот ящик и менять эти траектории вручную невозможно.
Захват движения (Motion Capture) - самый эффективный тип анимации с точки зрения
производительности. Движение в буквальном смысле задается вручную и «вножную»:
специально обученные люди одевают на себя костюм с датчиками или оптическими маркерами,
отслеживающими и передающими с определенной частотой свои координаты в компьютер. Данные
с координатами датчиков используются для анимации контрольных объектов, расположенных на
трехмерном персонаже в тех же местах, что и датчики на актере. Этот метод, правда, несколько
неэффективен с точки зрения финансов: системы захвата движений никак не желают дешеветь.
Нелинейная анимация - недавно освоенная технология, когда движение «отчуждается»
от объекта и превращается в самостоятельно существующий «клип». Такой клип можно наложить
на другой объект (заставив объект двигаться), его можно разрезать, сжать, растянуть - в общем
применять методы нелинейного монтажа, составляя анимацию из клипов. Эта технология
не является, строго говоря, отдельным типом анимации, это скорее надстройка над всеми
вышеперечисленными типами, позволяющая организовать производство анимации на качественно
более высоком уровне.
Применения анимации
Интересно, что вы ожидали прочитать в этом разделе?
Главный принцип анимации в MAYA
Вам следует раз и навсегда усвоить одну вещь - в MAYA можно анимировать всё! Как вы
наверное уже хорошо поняли, свойства любого объекта определяются значениями его атрибутов.
Главный принцип анимации в MAYA состоит в том, что анимируются не объекты, а атрибуты этих
объектов. Следовательно, анимируются абсолютно свойства объектов, задаваемые атрибутами.
Не только положение, вращение или размер, а цвет, видимость, позиция пивота, прозрачность,
форма и пр. Если вы вспомните, что объект - это набор составляющих его нод, каждая из которых
обладает своим набором атрибутов, то поймете, что анимировать можно довольно нетрадиционные
вещи.
Например, ноды Construction History, появляющиеся в результате операций моделирования,
позволяют анимировать место разрезания поверхности, положения отверстия на объекте,
количество сегментов у звезды или выращивание поверхности вдоль пути.
Внешний вид поверхности определяется присвоенным ей материалом, тоже состоящим из
многочисленных атрибутов, каждый из которых может быть проанимирован.
Положение текстуры на поверхности задается атрибутами и следовательно может быть
проанимировано. Так же, как и положение волос на голове, радиус действия поля турбулентности,
цвет тени, степень сглаженности полигональной поверхности, размер блика, фокусное расстояние
для камеры или положение отдельной контрольной вершины.
546
Книга Сергея Цыпцына
№
Скажу больше: анимировать можно даже положение окон «майского» интерфейса
(загляните в главу про MEL) или размеры кнопок.
А значит главный «майский» анимационный принцип можно переформулировать таким
образом: «Анимировать можно все, что шевелится».
То есть, все атрибуты, значения которых могут изменяться.
Общие принципы и внутреннее устройство анимации в MAYA
Выше я привел список различных способов анимации объектов в MAYA. Несмотря на то,
что некоторые из них принципиально различаются по идеологии (например, динамика и ключевая
анимация), у них у всех есть общее свойство: любой тип анимации воздействует на атрибуты
объекта. Рассмотрим это подробнее.
Примечание. Часто атрибуты объектов называют каналами. В основном это
происходит, когда речь идет об анимации. В данном контексте атрибуты и каналы
являются полными синонимами. Даже в названии Channel Box есть упоминание о
каналах. Можно также спорить о том, называть ли каналом только анимированный
атрибут, однако это не имеет смысла, с моей точки зрения.
Когда речь идет о материалах, каналами часто называют составляющие цвета или
прозрачности (канал красного или синего), а иногда и сами эти атрибуты (канал цвета). Однако
все эти «каналы» суть атрибуты, поэтому, чтобы гарантированно избежать путаницы в голове,
помните: синонимом слова канал в AAAYA (и только в MAYA) является «атрибут».
Когда вы любым способом анимируете объект, на атрибутах (или на каналах) этого объекта
появляются связи, которые устанавливают зависимость движения объекта либо от времени, либо
от перемещений другого объекта, либо от формулы в expression, либо от вычислений динамики
ит.д
Иногда такие связи появляются явно: например, вы поставили ключ и явно связали
значение атрибута со временем. Иногда совсем неявно: вы превратили объект в активное твердое
тело, и тут же на каналах translate и rotate появились входящие связи, соединяющие эти атрибуты
с результатами вычисления «решателя» динамики RigidSolver.
То, что «висит» на атрибутах объекта, определяет способ анимации, который используется
в этом случае.
Если на атрибутах «висят» анимационные кривые, значит вы (или кто-то до вас) поставили
ключи на эти атрибуты (или это сделал кто-то до вас). В этом случае цвет атрибутов в Channel Box
или Attribute Editor изменится на светло-оранжевый (или бежевый, в зависимости от угла зрения
на монитор и степени вашего дальтонизма). Анимация с помощью Set Driven Key также порождает
анимационные кривые, подсоединенные к атрибутам объекта.
Если значение атрибута вычисляется с помощью expression, цвет атрибута будет
фиолетовым. В этом случае используется процедурная анимация, а на атрибутах «висят» связи,
соединяющие объект с соответствующим expression.
Если объект анимируется с помощью констрейнов, то его зависящие от констрейнов
атрибуты имеют синий цвет, что говорит о наличии косвенной анимации.
Позеленевшие атрибуты означают, что на них приходит связь от ноды pairBlend, отвечающей
за смешивание разных типов анимации.
Если атрибуты объекта вычисляются с помощью динамики, на них «висят» связи желтого
цвета с «вычислителем» динамики.
Анимация
547
Не для всех типов анимации существует цветовая окраска атрибутов в Channel Box или
Attribute Editor. В общем случае, «связанные» атрибуты, имеют желтый цвет.
Примечание. Кстати, цветовая окраска атрибутов, имеющих связи, появилась
в MAYA не так давно. Раньше все «свободные» атрибуты имели белый цвет, а
зависящие от чего-либо - желтый. И в таком «аскетизме» проявлялась основная
концепция MAYA: объекты могут зависеть друг от друга с помощью связей
между атрибутами. И анимация - это лишь частный случай такой зависимости.
Подробнее об этом, вы можете прочитать в главе про изнанку MAYA.
Строго (или технически) говоря, анимация - это зависимость атрибутов объекта от времени.
Напрямую, без посредников, такая зависимость реализуется только в анимации по ключам. (И то,
некоторые любители точных формулировок возьмутся утверждать, что анимационная кривая - это
тоже посредник между объектом и временем).
Во всех остальных способах анимации между временем и объектом возникают «посредники»
- динамика, управляющие объекты с констрейнами, движение вдоль пути, expressions, объекты
Set Driven Key и т.д. Все эти «посредники» призваны облегчить, автоматизировать анимацию или
обеспечить какой-то характерный путь управления объектом.
Сначала я поговорю про ключевую анимацию,
облегчающих жизнь.
а затем возьмусь за «посредников»
Примечание. Согласно «майской» документации, все инструменты для деформации
поверхностей или согласования движения (констрейны) отнесены в категорию
настройки персонажей. Это, конечно, не означает, что их запрещено применять в
других целях. Деформеры могут быть использованы как вспомогательное средство
моделирования или как способ корректировки траекторий частиц, а констрейны
удобно применять при конструировании различных машин и механизмов. Так как
деформеры помогают лишь подготовить объекты к анимации и могут быть
полезны перед началом расстановки ключей, я расскажу о них отдельно. А работа
со скелетонами и скинингом будет описана в главе про настройку персонажей.
Констрейны, относящиеся к числу «посредников», я опишу как отдельное средство
создания косвенной или согласованной анимации.
548
Книга Сергея Цыпцына
Работа с Channel Box
Как правило, для создания и контроля анимации удобнее всего использовать Channel Box.
Коль скоро анимация в MAYA - это прежде всего работа с атрибутами, то Channel Box предлагает
наиболее компактное и гибкое представление атрибутов выбранных объектов и позволяет
выполнять большинство задач, связанных с анимацией.
При выделении одного или нескольких атрибутов в Channel Box становятся активными все
пункты меню, выпадающего при нажатии правой кнопки мыши. С их помощью можно производить
различные «махинации» с атрибутами и в том числе создавать анимацию. Причем разных типов.
Хотя основная часть пунктов меню посвящена работе с ключами, с помощью пунктов Expressions,
Set Driven Key или Connection Editor можно создавать анимацию другого типа.
Любой анимированный атрибут можно «приглушить», то есть временно выключить его
анимацию (Mute Selected), но можно и заблокировать его (Lock Selected), причем блокировка
лишь защитит атрибут от любых последующий действий с ним, но не заблокирует уже имеющуюся
анимацию на нем.
Отдельно хочу сказать про пункт Break Connections (разорвать связи). Предположим, что вы
анимировали атрибуты с помощью ключей или expression. Выделение этих атрибутов в Channel Box
и выполнение пункта Break Connections в принципе ведет к тому, что анимация с этих атрибутов
исчезает. Однако вы должны понимать, что ни анимационные кривые, ни expressions в этом случае
не удалились и остались в сцене. Вы лишь разорвали с ними связи, а сами они остались «живы-
здоровы» и с большой долей вероятности никому больше не нужны. Чтобы их разыскать вам,
потребуется некоторое время и усилия. Поэтому каждый раз, перед тем как выполнить операцию
Break Connections, подумайте о том, с чем вы собираетесь разорвать связь. Чтобы в сцене не
оставалось «бесхозных» анимационных кривых, вы должны удалять их с помощью операции Delete
Selected. Удалять expressions лучше прямо в Expression Editor.
Защита от анимации
Я хотел бы обратить внимание на то, что атрибуты объектов можно «защищать» от анимации.
Точно так же, как с помощью операции Lock Selected можно защищать атрибут от модификации
Анимация
549
его значения, с помощью пункта Hide Selected, его можно просто удалить из списка атрибутов,
перечисленных в Channel Box. Это не означает, что для него нельзя создавать анимацию: например,
в Attribute Editor вы сможете его разыскать и анимировать, как вам угодно. Атрибут исчезает
только из Channel Box. В этом случае на него перестает действовать операция Animate=>Set Key
(горячая клавиша "s") и функция AutoKey, и про такой атрибут говорят, что он неанимируемый
(nonkeyable).
Вернуть атрибут в «анимируемое» состояние, можно в окне Channel Control, которое можно
вызвать либо через меню Channel Box, либо через Window=>General Editors=>Channel Control. В
этом окне находятся три колонки с именами атрибутов. Выделяя атрибуты и нажимая кнопки
Move>> и <<Move, можно перемещать атрибуты из одной категории в другую.
В левой колонке (Keyable) располагаются анимируемые атрибуты, то есть отображаемые
в Channel Box. В колонке Nonkeyable Hidden присутствуют атрибуты, не показываемые в Channel
Box. С недавних пор в окне Channel Control появилась колонка Nonkeyable Displayed, в которой
содержатся атрибуты «защищенные» от анимации, но тем не менее отображаемые в Channel Box.
Они отображаются серым цветом и «защищены» от нажатия клавиши "s" и функции Auto Key.
Однако название Nonkeyable, с моей точки зрения, здесь не слишком уместно, поскольку вы можете
выделять такие атрибуты в Channel Box и ставить на них ключи с помощью меню, выпадающего под
правую кнопку мыши. И хотя ключевые кадры для таких атрибутов не отображаются на временной
линейке, они, тем не менее, создаются и, соответственно, успешно путают аниматора.
Защита части атрибутов от анимации через удаление их из Channel Box - это очень
удобное средство подготовки объектов к анимации. Это позволяет вам видеть только нужные для
анимации атрибуты в Channel Box и работать только с ними. Старайтесь заранее продумывать,
какие атрибуты вам понадобятся для анимации, чтобы оставить в Channel Box только необходимый
минимум анимационных каналов.
Кроме того, часть атрибутов любого объекта по умолчанию защищена от анимации. Например,
положение пивота или ориентация локальных осей. В тех экзотических случаях, когда вам надо
интенсивно анимировать эти атрибуты, вы можете «вытащить» их в Channel Box с помощью окна
Channel Control.
550
Книга Сергея Цыпцына
Просмотр анимации и настройки проигрывания
Я не стану описывать кнопочки запуска и остановки анимации, их назначение интуитивно
понятно. Даже те, у кого никогда не было плеера или видеомагнитофона, могут выяснить их
функциональность методом тыка. Кнопки с вертикальными красными полосками позволяют
перейти в следующий /предыдущий ключевой кадр для выбранного (или выбранных) объектов,
поэтому работают они, только когда вы выбрали какой-нибудь объект.
Временная линейка состоит как бы из двух частей - это сама линейка (Time Line) и диапазон
анимации, позволяющий задавать границы анимации: глобальные и локальные. Локальный
диапазон определяет отрезок времени для проигрывания анимации, глобальный - определяет
границы, в которых может находиться локальный диапазон. Иначе говоря, локальный диапазон
- это временное окно, которое «ездит» в границах глобального.
Если щелкнуть правой кнопкой мыши прямо на временной линейке, появится полезное
меню, предназначенное в основном для работы с ключами.
Для настроек временной шкалы и параметров проигрывания есть специальная кнопочка с
непонятным изображением в правом нижнем углу. Она ведет с общее окно настроек MAYA
Preferences (Windows=>Settings/Preferences=>Preferences) в категорию Timeline.
Анимация
551
В этом окне вы можете задать высоту временной линейки, варианты отображения на ней
ключевых кадров и другие полезные параметры. Но самым важным в этом окне является параметр
Playback Speed. Важно знать, в каких случаях требуется конкретное значение этого параметра.
По умолчанию он установлен как Play Every Frame. To есть MAYA честно будет проигрывать
каждый кадр анимации. Чем «тяжелее» сцена, тем медленнее будет проигрывание. Такой режим
абсолютно необходим для работы с динамикой, иначе результаты расчета траекторий частиц или
твердых тел будут просто неверны.
Все остальные режимы задают проигрывание анимации с какой-то фиксированной
скоростью, например Playback Speed = Real-time(25 fps). В этом случае MAYA будет проигрывать
анимацию опираясь как бы не на кадры, а на секунды. Для «тяжелой» сцены будет проигрываться
каждый десятый или двадцатый кадр, но заданный темп будет выдерживаться. Вы будете видеть
реальную скорость изменения вашей сцены, хотя возможно с ощутимыми рывками. Такой режим
абсолютно необходим в том случае, если вы хотите слышать звук, импортированный в сцену. В
режиме Play Every Frame звук не будет слышен.
Скорость воспроизведения анимации
В окне глобальных настроек MAYA есть категория Settings, где, наряду с выбором различных
единиц измерения, есть один очень важный параметр.
Он не очень удачно называется Time и определяет скорость анимации, или говоря
технически, частоту смены кадров (fps - frame per second). He всегда понятно, как это влияет на
производимую анимацию: вроде как задаем движение, отсчитываем нужное количество кадров,
собираем результат в «кино» типа avi или quicktime и с гордостью смотрим. На первый взгляд,
получается, что «скорость» анимации задается уже после рендеринга. Однако это не так. Дело в
том, что MAYA работает со временем в секундах, а не в кадрах. В каждой сцене есть служебный
объект timei, отсчитывающий время, и время это измеряется, грубо говоря, в секундах. Если у вас
в сцене есть какие-нибудь атрибуты объектов, зависящие от времени, например, напор источника
частиц (rate) или начальная скорость твердого тела, то все они измеряются относительно секунд,
а не кадров. Если вы задали, например emitterl .rate=100, то есть испускание ста частиц в секунду,
552
Книга Сергея Цыпцына
то при определении параметра Time как РАЦ25 fps), в каждом кадре будет появляться четыре
новых частицы. А если вы измените скорость анимации на Time=PAL Field(50 fps), то в каждом
кадре будут появляться только две частицы, так как в одной секунде будет 50 кадров.
С самого начала установите параметр Time в то значение, которое отвечает вашим задачам.
Если это реклама для телевидения в Европе или Азии, то это, как правило, РАЦ25 fps). Если работа
с киноматериалами, то Film(24fps) и т.д.
Будьте внимательны: если вы уже имеете сцену с анимацией, то при попытке сменить настройки
скорости анимации, ключевые кадры «съедут» со своих «покадровых» значений, притом таким
образом, чтобы оставаться на прежних местах относительно времени в секундах.
Если вы хотите следовать примерам из книги, установите скорость анимации как Time=PAL(25
fps). Будьте внимательны: если предыдущее значение этого параметра было равно Film(24 fps),
и диапазон анимации начинался с первого (а не с нулевого) кадра, то то при изменении скорости
анимации крайние кадры диапазона примут «некруглые» значения типа 1.04. Не забудьте исправить
их на «круглые» числа, чтобы избежать проблем, особенно с динамикой.
Помните: несмотря на то, что мы говорим «ключевые кадры», их значения хранятся в
сцене как «ключевые доли секунды».
Ну и, конечно, параметр Time определяет, с какой скоростью будет проигрываться
анимация в режимах, отличных от Play Every Frame.
Анимация по ключам
«Ключ» - сокращение от «ключевого значения». Основная идея ключевой анимации в MAYA
заключается в следующем. Вы берете атрибут (или атрибуты) объекта и ставите на него ключ в
данный момент времени, то есть фиксируете значение этого атрибута для этого момента времени,
затем идете в следующий нужный кадр (называемый ключевым кадром), изменяете значение
атрибута и снова ставите ключ. В промежутке между двумя ключевыми кадрами MAYA интерполирует
величину атрибута, то есть плавно меняет его от одного ключевого значения до другого. Так как
атрибуты в AAAYA определяют свойства объектов, такой подход позволяет анимировать что угодно:
перемещение, вращение, цвет, видимость и прочие всевозможные свойства.
Если вы начинаете делать «свою первую анимацию в MAYA», то с большой долей вероятности это
будет анимация движения какого-нибудь объекта, например скачущего мяча. Хотя вы можете
думать, что создаете ключевые кадры для положения объекта, помните, что при этом вы ставите
ключи на атрибуты translate, которые определяют положение объекта.
Итак, ключи в MAYA ставятся только на атрибуты!
Анимация
553
П1ША
Способы создания ключей
Самый формальный и аккуратный способ создания ключа для нужного атрибута (или
атрибутов) заключается в том, что его нужно выделить в Channel Box, нажать правую кнопку
мыши и выполнить операцию Set Key в появившемся меню. В этом случае вы точно знаете, что
происходит.
Второй способ заключается в нажатии правой кнопки над именем атрибута в Attribute
Editor. Правда, в этом случае вы сможете ставить ключ только на один атрибут единовременно (или
на три атрибута, если это «тройной» атрибут типа scale).
Остальные способы призваны ускорить или автоматизировать процесс постановки
ключей.
Горячая клавиша "s" соответствует операции Animate=>Set Key и по умолчанию ставит ключи
на все видимые (кроме серых) атрибуты в Channel Box для выбранного объекта (или объектов).
Совершенно очевидно, что в этом случае могут возникать лишние ключи, для тех атрибутов,
значение которых не изменяется со временем, но которые присутствуют в Channel Box.
Следует помнить, что у операции Set Key имеется собственный Option Box, в котором вы
можете настроить массу полезных параметров, влияющих на то, каким образом ставится ключ,
при нажатии кнопки "s".
При создании «поточной» анимации обычно объект или персонаж ставят в определенную
позу, нажимают кнопку «s», далее время сдвигается в нужный кадр, снова новая поза, кнопка «s»
и т.д. Если в ходе такой постановки ключей возникают атрибуты с «вырожденной» анимацией, то
есть значение их не меняется, но ключи, тем не менее, стоят в большом количестве, то удалить
такую анимацию можно, выбрав объект и выполнив Edit=>Delete by Type=>Static Channels (удалить
статическую анимацию).
Совет. Пользователи, корпящие над своей первой анимацией в MAYA, часто
сталкиваются со следующей проблемой: персонаж стоит в нужной позе, ставится ключ
на нужные атрибуты, затем персонаж кропотливо передвигается в новую позу и тут
обнаруживается, что кадр остался прежним, то есть пользователь забыл сдвинуться
вперед по временной линейке. При переходе в следующий кадр персонаж моментально
возвращается к предыдущей позе, так как для нее были поставлены ключи, и новая,
заботливо выстроенная поза, безвозвратно теряется. Первый совет заключается в
тренировке внимания. Если же это невозможно по каким-то причинам, то вы всегда
можете перейти в нужный кадр, не проигрывая анимацию, щелкнув в нужном месте
временной линейки средней кнопкой мыши. При этом столь усердно настроенная вами
поза персонажа не вернется в предыдущее ключевое состояние и вы сможете быстро
поставить ключ в новом кадре, зафиксировав очередную ключевую позу.
При нажатии кнопки «s» (то есть выполнении операции Set Key) ключи ставятся на все
видимые в Channel Box атрибуты, причем не только для самого выбранного объекта, но и для
554
Книга Сергея Цыпцына
№
всех связанных с ним объектов, чьи атрибуты отображаются в разделах INPUT и OUTPUT. Если эти
разделы «закрыты», то ключи для принадлежащих им атрибутов не ставятся.
Режим Auto Key
Еще одним способом ускорения и автоматизации является режим Auto Key. Он включается
с помощью маленькой кнопки с изображение ключа в правой части временной линейки. Суть
работы этого режима следующая.
Если вы изменяете вручную значения некоторых атрибутов в текущем кадре, для них
немедленно и автоматически создаются ключи в этом кадре. Но! Это справедливо, только для
атрибутов, уже имеющих анимацию, то есть ключи. Таким образом, перед использованием режима
Auto Key, вы должны вручную поставить хотя бы один ключ на нужные атрибуты, для того чтобы
на них потом возникали автоматические ключи. Можно сказать, что этот режим избавляет вас от
необходимости нажимать кнопку «s» в очередном ключевом кадре.
Будьте внимательны и не забывайте выключать режим Auto Key, чтобы не вычищать потом
невесть откуда взявшуюся анимацию. Используйте этот режим, только в том случае, если он вам
действительно необходим. К нему надо привыкнуть, и тогда он будет приносить больше пользы,
чем беспорядка.
Качение куба. Комментарии
Проделаем небольшой пример с расстановкой ключей. Это будет иногда встречающееся
на просторах Интернета упражнение на перекатывание куба, снабженное некоторым количеством
комментариев. Я оформлю этот раздел в виде традиционных инструкций и множества комментариев,
помогающих понять суть выполняемых телодвижений мышью и логику всего упражнения. Вы
можете сначала выполнить все упражнение, игнорируя комментарии, а затем, проделать все
заново (хотя бы мысленно), прочитав мои навязчивые примечания. Возможно, вы откроете для
себя что-то новое.
Создайте в новой сцене полигональный куб.
Нажмите кнопку «f», чтобы наехать на него камерой. Мы собираемся катить куб по
горизонтальной плоскости вдоль оси X, разверните немного камеру, чтобы видеть движение слева
направо.
Выберите куб, нажмите кнопку Insert и сдвиньте пивот куба в правый нижний ближний к вам
угол.
За вращение вокруг правого нижнего ребра отвечает атрибут rotateZ.
Выделите его в Channel Box и поставьте на него ключ в первом кадре, пользуясь правой
кнопкой мыши.
Анимация
555
атрибут.
Перейдите в двадцатый кадр, задайте rotateZ=-90 и снова поставьте ключ на этот
Комментарий. Дальше куб должен вращаться вокруг новой точки, то есть
положение пивота внутри куба также должно быть проанимировано. Причем, если
в текущем, двадцатом кадре пивот должен оставаться на старом месте, чтобы
куб успешно завершил первый поворот, то уже в следующем, двадцать первом,
пивот должен находиться в новом месте - правом нижнем углу куба, относительно
текущего положения.
Попробуйте проанимировать положение пивота из Attribute Editor. Перейдите в первую
закладку pCubel и откройте раздел Pivots. Попробуйте поставить ключ на Local Rotate Pivot или
World Rotate Pivot, неистово нажимая правую кнопку мыши над этими атрибутами. Не тут-то
было!
Примечание. Оказывается не на все атрибуты в Attribute Editor можно ставить
ключи, более того не все числовые поля в Attribute Editor представляют собой
атрибуты.
Чтобы добраться до истинных атрибутов, определяющих положение пивота придется
открыть окно Channel Control и «вытащить» их в Channel Box.
Выполните Windows=>General Editor=>Channel Control.
Разыщите в средней колонке атрибуты rotatePivotTranslateX, rotatePivotTranslateY, rotatePiv-
otTranslateZ, rotatePivotX, rotatePivotY, rotatePivotZ и нажмите кнопку <<Move, чтобы перенести их
в список анимируемых атрибутов.
556
Книга Сергея Цыпцына
Комментарий. Как вы, наверное, знаете, у любого объекта существует два
пивота: один для вращений (rotate pivot), другой для масштабирований (scale
pivot). По непонятной мне причине при нажатии кнопки Insert манипулятор управления
пивотом рисуется в месте нахождения scale pivot. Когда мы начнем анимировать
положение центра вращения, эти пивоты «разъедутся» на экране, и редактировать
«вращательный» пивот с помощью манипулятора будет неудобно.
Поэтому выделите в средней колонке также атрибуты scalePivotTranslateX, scalePivot-
TranslateY, scalePivotTranslateZ, scalePivotX, scalePivotY, scalePivotZ и тоже перенесите их в левую
колонку, нажав кнопку <<Move.
Теперь выберите в Channel Box все атрибуты со словом pivot и поставьте на них ключ. (Вы
должны по-прежнему находиться в двадцатом кадре).
Перейдите в следующий, двадцать первый кадр.
Если надо, войдите в режим редактирования пивота (Insert) и передвиньте пивот в правый
нижний угол. На помощь может прийти привязка к кривым в виде нажатой клавиши «с».
Комментарий. Когда вы используете манипулятор, тосмещаются сразу оба пивота, и «вращательный»
и «шкалирующий».
Опять поставьте ключ на все атрибуты со словом pivot.
Анимация
557
НМША
Комментарий. Можете открыть Attribute Editor и убедиться, что в первой
закладке в разделе Pivots, цвет всех числовых полей остался белым. То есть ключи,
поставленные в Channel Box не затрагивают напрямую поля Local Rotate Pivot или
World Rotate Pivot. Из этого следует, что именно эти поля в Attribute Editor не
являются атрибутами объекта, а представляют собой вычисляемые значения.
Из этого также следует, что положение пивота объекта (например, «вращательного» пивота)
определяется не тремя координатами, а шестью значениями. Первые три определяют координаты
пивота относительно системы координат объекта, а вторые три являются корректирующими
смещениями и отвечают за то, чтобы объект оставался на месте, когда вы сдвигаете пивот с
помощью манипулятора. Подумайте, ведь если сдвинуть пивот, а значения вращений не трогать, то
объект должен скакнуть в новое положение, отвечающее прежнему повороту, но вокруг сдвинутого
пивота. Однако когда вы неистово таскает пивот на экране за манипулятор, то объект остается на
месте - именно за эту неподвижность отвечают три дополнительных «корректирующих» атрибута
типа rotatePivotTranslate.
Перейдите в сороковой кадр и поверните куб вокруг нового пивота: rotateZ=-180.
Тут же поставьте ключ на атрибут rotateZ.
Если вы собираетесь делать анимацию дальше, вам, очевидно, следует поставить ключ на
все атрибуты со словом pivot в сороковом кадре, затем перейти в сорок первый, сдвинуть пивот
в новое место, поставить ключ, перейти в шестидесятый кадр, повернуть куб, поставить ключ на
вращение и т.д.
Мы ограничимся уже готовой анимацией, чтобы еще немного проанализировать
получившуюся сцену и ответить на наверняка возникшие вопросы.
Комментарий. Наш куб должен бодро переваливаться через собственное ребро.
Очевидно, что он имеет довольно банальную анимацию вращения - угол поворота
вокруг оси 1 просто равномерно нарастает. Главный трюк заключается в точной
анимации пивота вращения в нужных кадрах.
Проведите небольшой эксперимент. Перейдите в кадр с номером «двадцать с половиной».
Это можно сделать вписав значение 20.5 в поле, отображающее текущий кадр. И включите режим
редактирования пивота.
Вы увидите, что «между» кадрами пивот находится посередине между двумя своими
ключевыми значениями. Очевидно, что вращение в этот момент происходит не вокруг ребра, а
вокруг некоторой весьма абстрактной точки.
558
Книга Сергея Цыпцына
№
Комментарий. «Ну и что!» воскликнут легкомысленные умы. Ведь такая картинка не
попадет в финальный рендеринг, который просчитает только «целые» кадры. Да, это так. Но все
же следует постоянно представлять себе, что происходит между кадрами, и помнить, что АЛАУА
работает со временем в секундах (точнее в долях секунд), а не в кадрах.
Например, если вы вдруг решите отрендерить сцену с полями и смените скорость анимации
на PAL Field (50 fps), то кадр с номером «двадцать с половиной» тут же превратится в сорок первый
кадр, который будет явным образом просчитан.
При просчете motion blur также могут использоваться межкадровые вычисления, не говоря
уже о динамике.
Вы можете возразить, что в данной сцене никто ничего не заметит, особенно на таком
среднем плане. Совершенно верно, но я не призываю вас проверять все «междукадрия», а лишь
советую помнить о том, что между кадрами анимация тоже существует. Кстати, вы можете
«пробивать» ключи и между кадрами, достаточно ввести «нецелый» номер кадра и поставить ключ
обычным способом.
Чтобы контролировать, что происходит как между ключевыми кадрами, так и между
соседними, очевидно надо иметь возможность работать с анимационными кривыми и редактировать
полученную анимацию. Об этом и пойдет речь далее.
Примечание. Забегая вперед, скажу, что в данном случае, проблема межкадрового
поведения положения пивота решается с помощью ключей типа Stepped.
Сохраните полученную сцену (rollingCube.ma), она пригодится для дальнейших экспериментов.
Редактирование ключевой анимации
После того, как вы расставили ключи для нужных атрибутов, у вас, возможно, возникнет
странное желание их отредактировать, то есть немного изменить полученную анимацию. Как
обычно в MAYA, это можно сделать как минимум десятью способами. Перечислю лишь несколько
самых популярных из них.
Редактирование анимации в Graph Editor
После создания ключей для нужных атрибутов в сцене, очевидно, появляются анимационные
кривые. Эти кривые определяют, как объект должен двигаться между ключевыми кадрами. Самым
мощным средством редактирования анимационных кривых является Graph Editor. Он позволяет
делать с ключевой анимацией абсолютно все. Так как он заслуживает отдельного разговора, я
Анимация
559
HMMi
вернусь к нему позже, на примере конкретной анимации.
Редактирование ключей на временной линейке
Те, кого пугает или раздражает безумная функциональность Graph Editor, могут сэкономить
некоторое количество времени и нервов, редактируя ключи прямо на временной линейке. Этот
способ позволяет быстро перемещать и масштабировать ключи по времени, удалять или копировать
анимацию, изменять тип ключей и делать еще массу полезных действий, не открывая Graph
Editor.
Отройте сцену с катающимся кубиком (rollingCube.ma). Выберите куб и посмотрите на
временную линейку, где отображаются ключи для анимированных атрибутов.
Совет. Вы можете показывать на временной линейке ключи не для всех
анимированных атрибутов объекта, а только для выбранных в Channel Box. Для
этого надо открыть настройки анимации и установить опцию Key Tkks=Channel
Box.
Нажмите Shift и выделите мышью на временной линейке диапазон с десятого по тридцатый кадр.
Отмеченная область выделится красным цветом и кроме того на ней появятся стрелки,
позволяющие передвигать или масштабировать ключи. Возьмитесь за стрелки в середине
выделенной области и передвиньте красный диапазон влево так, чтобы два ключа, попавших в
область выделения сместились в район десятого кадра.
Проиграйте анимацию. Теперь куб будет делать первый поворот гораздо быстрее.
560
Книга Сергея Цыпцына
Примечание. Если вы будете масштабировать ключи на временной линейке за
крайние стрелки, имейте в виду, что все ключи внутри выделенной области могут
«съехать» и попасть между кадрами. Для того, чтобы их «приснапить» к целым
значениям, в контекстном меню временной линейки есть пункт Snap.
Выделенные ключи на временной линейке можно также удалять, копировать и вставлять
в новое место. Более того, таким способом можно переносить анимацию с одного объекта на
другой, лишь бы у них имелись общие атрибуты, на которых стоят ключи.
Перенос анимации с объекта на объект
Создайте в сцене с кубом полигональный цилиндр.
Задайте для него Scale=0.5, чтобы он идеально вписывался в куб. Выберите куб, и два раза
щелкните мышью в любом месте временной линейки. При этом выделится сразу весь диапазон
проигрывания анимации. Нажмите правую кнопку мыши над выделенной областью.
Появится меню (я буду называть его «контекстным меню временной линейки»). Выберите
в нем пункт Сору.
Дальше выберите цилиндр, перейдите в первый кадр на таймлайне и над первым кадром
(это важно) нажмите правую кнопку мыши.
В контекстном меню выберите Paste=>Paste.
Ключи скопируются с куба на цилиндр.
Однако, как следует из проигрываемой анимации, скопировались только ключи для
атрибута rotateZ. Анимационные кривые для положения пивота не продублировались, так как
соответствующие атрибуты не присутствуют у цилиндра в Channel Box и поэтому считаются
«неанимируемыми» (nonkeyable).
Откройте окно Channel Control для выбранного цилиндра.
Разыщите в средней колонке атрибуты rotatePivotTranslateX, rotatePivotTranslateY, rotatePiv-
otTranslateZ, rotatePivotX, rotatePivotY, rotatePivotZ и нажмите кнопку <<Move, чтобы перенести их
в список анимируемых атрибутов.
Анимация
561
Опять нажмите правую кнопку мыши над первым кадром. В контекстном меню выберите
Paste=>Paste.
Теперь ключи скопируются и для положения «вращательного» пивота.
Проиграйте анимацию.
Выделите, нажимая Shift, на временной линейке диапазон с восьмого по четырнадцатый
кадр и выполните в контекстном меню пункт Сору.
Перейдите в двадцатый кадр и выполните там же Paste=>Paste. Таким образом вы
скопировали несколько ключей с цилиндра на цилиндр.
Теперь при анимации цилиндр будет немного отставать от куба в первом повороте, так как
мы скопировали ключ, отвечающий за вращение на 90 градусов в двадцать второй кадр.
Пытливые умы могут заметить, что в диапазоне между десятым и двадцатым кадром, когда
цилиндр вроде как не должен вращаться (так как ключевые кадры справа и слева задают одинаковое
вращение rotateZ=-90), он слегка покачивается. Наиболее просвещенные пользователи сразу
сообразят, что все дело в интерполяции между ключевыми кадрами или, иначе говоря, в типе
ключей. Однако, чтобы изменить тип интерполяции, по-прежнему нет необходимости открывать
великий и ужасный Graph Editor.
Щелкните два раза в любое место временной линейки. В контекстном меню над выделенным
диапазоном выберите Tangents=>Flat.
Проиграйте анимацию. Теперь цилиндр исполняет паузу абсолютно неподвижно.
Сохраните сцену (rollingCubeAndCylinder.ma), она, возможно, еще пригодится.
562
Книга Сергея Цыпцына
Примечание. Информация о скопированных ключах остается в майском буфере
обмена даже в тот момент, когда вы открываете новую сцену. Таким образом, вы
можете переносить информацию от объекта из одной сцены на объект в другой
сцене. Следите только за соответствием атрибутов.
Для более продвинутой работы с ключами есть целое «подразделение» в основном меню
MAYA. По адресу Edit=>Keys находятся основные операции для работы с ключами. Их назначение
довольно очевидно, а опция Help Images в Option Box этих операций облегчает понимание их
логики.
Работа с ключами в Channel Box
Для работы с ключами в Channel Box имеются пункты меню Cut/Copy/Paste/Delete
Selected. Важно только понимать, что эти операции применяются ко всем ключам на выделенных в
Channel Box атрибутах. Например, операция Delete Selected удаляет всю анимационную кривую
целиком, сколько бы ключей на ней ни было. В отличие от аналогичных операций в контекстном
меню временной линейки, действующих на конкретные ключи в выбранном диапазоне или кадре,
все действия, производимые из Channel Box, производятся над анимационными кривыми, или,
иначе говоря, над анимированными атрибутами.
ДЩДД^Д Obiect
Key Selected
Key All
Breakdown Selected
Breakdown All
Mute Selected
Mute All
Unmute Selected
Unmute Al! ^
Cut Selected
Copy Selected
Таким образом, вы может переносить анимацию с атрибута на атрибут или удалять ее целиком.
Еще раз напомню: операция Delete Selected удаляет все анимационные кривые с выбранных
атрибутов, а операция Break Connections лишь разрывает связь между атрибутом и анимационной
кривой, оставляя последнюю спокойно существовать в сцене без всяких связей. Такие «бесхозные»
анимационные кривые замусоривают сцену, поэтому удаляйте ключевую анимацию с атрибутов с
помощью операции Delete Selected.
Примечание. «Безхозные» анимационные кривые можно удалить одним махом из
всей сцены с помощью операции File=>Optimize Scene Size
Работа с ключами в Attribute Editor
Обнаружить наличие анимации на атрибутах объекта можно не только по их цвету в Channel
Box или Attribute Editor. Если нажать правую кнопку мыши над любым анимированным атрибутом
в Attribute Editor, первый же пункт контекстного меню будет содержать название анимационной
кривой, присоединенной к этому атрибуту.
Анимация
563
Более того, если выбрать этот пункт меню, можно увидеть атрибуты анимационной кривой.
(Анимационная кривая - тоже объект, поэтому имеет свои атрибуты, которые ничем не хуже
других. И не лучше).
Для любителей вбивать цифры в клетки, представление анимационной кривой в Attribute
Editor - сущая находка.
В единую таблицу сведены номера ключей, их значения, тип интерполяции и масса других
свойств. И все эти свойства можно редактировать. Если у вас хорошее абстрактное мышление, вы
можете работать с анимационными кривыми в Attribute Editor, по-прежнему избегая контактов с
Graph Editor.
Для взрослых. Из представления анимационной кривой в Attribute Editor следует один
вывод: ключи являются атрибутами анимационной кривой. Действительно, номер кадра и значения
атрибутов в ключевых кадрах хранятся в специальных атрибутах .keyTime и .keyValue. В этом
нетрудно убедиться, выбрав в Attribute Editor для анимационной кривой пункт Help=>Help on
"animCurveTA" и прочитав описание ноды animCurveTA. Вы можете использовать MEL-команды getAttr
и setAttr для работы с ключами.
Основы работы с Graph Editor,
Свойства ключей и анимационных кривых
Для наиболее гибкого редактирования ключевой анимации предназначен редактор Graph
Editor. Его, как правило, назначают на горячую клавишу, поскольку мало у кого хватает терпения
564
Книга Сергея Цыпцына
№
каждый раз «продираться» по адресу Window=>Animation Editors=>Graph Editor.
Работа в Graph Editor ведется в основном с анимационными кривыми и ключами. Как я
упоминал выше, ключи представляют собой атрибуты анимационных кривых, поэтому можно
сказать, что Graph Editor - это специальный редактор для работы со свойствами анимационных
кривых.
Так же, как и в Attribute Editor, содержимое этого редактора отображает анимационные
кривые только для выбранного объект. Хотя это поведение можно изменить с помощью меню List.
В этом, как и в дальнейших случаях, под "меню" я буду иметь в виду меню окна Graph Editor.
Кроме меню в этом окне, имеется список выбранных объектов с их атрибутами, полка с наиболее
часто используемыми инструментами и собственно рабочая область.
Примечание. Если вы владеете MEL-программированием на более, чем среднем
уровне, для вас не составит труда модифицировать встроенную в Graph Editor
полку. Она, к сожалению, не допускает такой безболезненной модификации, как
обычные полки.
Рабочая область ведет себя как обычная ортогональная камера. Вы можете делать наезды-
отъезды, перемещения с помощью привычных манипуляций с мышью. Очень полезно в ходе
наездов нажимать Shift, чтобы ограничить изменение масштаба изображения только по одной из
осей.
Совет. При открытии Graph Editor часто появляется весьма экзотическая
картинка, связанная с отображением только части анимационных кривых для
выбранного объекта. Нажмите клавишу «/», чтобы увидеть все анимационные
кривые целиком.
Работу в Graph Editor можно более чем условно разбить на три категории: работа с кривыми,
редактирование ключей, редактирование тангенсов.
Рассмотрим небольшой конкретный пример, для того чтобы проиллюстрировать принципы
работы с Graph Editor.
Откройте сцену с валяющимся кубом (rollingCube.ma).
Выберите куб и откройте Graph Editor.
Чтобы увидеть все анимационные кривые целиком, нажмите клавишу «f».
Edit View Select Curves Keys Tangents List Show Panels
**SA'£|** i i | * V ~> л - л-|хд|v \ \ \ | о r i*. *э |
Слева отображаются все атрибуты выбранного объекта, имеющие анимацию (и часто
называемые каналами). Есть подозрение что некоторые атрибуты имеют «вырожденную анимацию»,
то есть ключи-то на них стоят, но значение атрибутов не изменяется во времени. Анимационные
кривые для таких атрибутов представляют собой горизонтальные прямые. Избавимся от такой
анимации.
Выполните Edit=>Delete All by Type=>Static Channels (удалить во всей сцене статичную
анимацию). Число анимированных атрибутов (и кривых) в Graph Editor существенно сократится.
Выделите ключи, принадлежащие короткому отрезку из анимационных кривых в районе двадцатого
кадра, и нажмите «f», чтобы наехать на них.
Анимация
565
Примечание.Если вы хотите выбрать саму анимационную кривую, выбирайте ее за
участок без ключей. Однако помните: в этом случае будут просто выбраны все ее
ключи.
Выберите в левой части атрибут Scale Pivot Y, чтобы увидеть справа только его анимационную
кривую. Выделите ее и удалите, она нам не нужна, так как мы не собираемся продолжать ставить
анимацию, а лишь редактируем ее.
Теперь давайте порассуждаем. В двадцатом кадре кубик уже повернулся на 90 градусов
(rotateZ=-90) и дальше должен начать вращаться вокруг нового пивота. Однако на участке между
двадцатым и двадцать первым кадром пивот перемещается в новое положение. Мы хотим, чтобы
пивот мгновенно «прыгнул» в новое положение без всяких плавных переходов. Для этого надо
изменить способ, которым MAYA интерполирует участок между ключами. Проще говоря, изменить
тип ключей, так как интерполяция участка кривой определяется типом ключей, ограничивающих
этот участок.
Выберите в Graph Editor слева куб, а справа все ключи, соответствующие анимации пивота,
и выполните в меню Graph Editor операцию Tangents=>Stepped.
Анимационная кривая примет ступенчатую форму.
В принципе это то, что нам нужно. Однако если подумать, то такой ступенчатый «прыжок»
должен происходить не в двадцать первом кадре, а в на кадр раньше, чтобы пивот смещался в
новое положение в двадцатом кадре и дальнейшее вращение шло вокруг нового пивота.
Таким образом, надо сдвинуть все выбранные ключи ровно на кадр влево. Для этого, по доброй
«майской» традиции, есть несколько способов.
Первый способ «официальный» и заключается в традиционном использовании инструмента
Move Tool и привязки к сетке.
Если все ключи выбраны, следует включить Move Tool и перетащить их средней кнопкой
мыши влево, удерживая при этом клавишу Shift, чтобы ключи смещались только по горизонтали.
Привязка к горизонтальной сетке (то есть к целым номерам кадров) включена по умолчанию
566
Книга Сергея Цыпцына
(это следует из нажатой кнопки с магнитом на полке Graph Editor. Поэтому все ключи должны
сместиться на кадр влево.
Примечание. Так как при использовании Move Tool или Scale Tool в Graph Editor не
появляется абсолютно никаких манипуляторов, следует постоянно помнить,
какой инструмент сейчас активен. Кроме того, выделение ключей происходит
левой кнопкой мыши, а перетаскивание (или масштабирование) - средней. На
первых порах это довольно непривычно и напоминает освоение ручной коробки
передач.
Второй способ более простой и позволяет избежать эквилибристики с мышью и
клавиатурой. Кроме того, он дает гарантию точного перемещения ключей в нужном направлении
на заданное расстояние. Если вы уже сдвинули ключи первым способом, верните их обратно.
Затем разыщите на полке Graph Editor два числовых поля Stats, отображающих информацию
о выделенных ключах (их значения по горизонтали и вертикали).
Введите в первое поле формулу
-=1 (минус равно один)
и нажмите Enter.
Искушенные пользователи и программисты на С сразу поймут, что введенное заклинание
вычитает единицу из координаты по горизонтали (то есть по времени) для всех выделенных
ключей. Таким образом, все выделенные ключи смещаются влево на единицу (то есть на один
кадр назад).
Примечание. Использование формул типа +=10 или *=1.1 исключительно удобно для
того чтобы одним махом выбранные ключи сдвигать по горизонтали (первое поле
Stats) или растягивать их по вертикали (второе поле Stats).
Теперь кубик катится абсолютно корректно, даже между кадров.
Итак, ключи могут обладать различными типами интерполяции, которые можно менять
либо через меню Tangets, либо с помощью соответствующих кнопочек на полке Graph Editor.
Однако на самом деле тип интерполяции определяется не для ключей, а для их тангенсов.
Если на пальцах, то тангенсы - это отрезки касательных к анимационной кривой в той точке, где
находится ключ. Когда вы выбираете ключ и меняете тип интерполяции, на самом деле этот тип
меняется для обоих тангенсов, торчащих вправо и влево из ключевой точки. Интерполяцию можно
менять индивидуально для каждого тангенса, достаточно просто его выбрать или воспользоваться
пунктами In/Out Tangent в меню Tangents.
Анимация
567
Терминологический комментарий. Слово «тангенсы» стопроцентно жаргонное, однако
настолько прочно прижилось, что искать ему замену мне даже не приходит в голову. Ну, не будут
же взрослые мальчики говорить «покрутим гантельки» или «подергаем за усики»
Очевидно, что тангенсы полностью определяют поведение кривой на участке между
соседними ключами. Поработаем немного с ними.
Выберите слева в Graph Editor канал rotateZ и нажмите «f», чтобы увидеть его анимационную
кривую целиком. Выберите ключ в середине кривой и измените для него тип интерполяции на
Flat.
Однако движение куба станет при этом совсем невыразительным. Подредактируем тангенсы
вручную. Выберите (левой кнопкой) левый тангенс и приподнимите его средней кнопкой.
(Move Tool при этом должен быть включен!)
Примечание. Если вы хотите «расцепить» два тангенса, можете воспользоваться
меню Key =>Break Tangents или соответствующей кнопкой на полке.
Однако далее вам, возможно, захочется изменить не только направление, но и длину
тангенса. И вот тут вам придется преодолеть двойную защиту. Дело в том, что ЛААУАсчитает тангенсы
произвольной длины глубоко безнравственными и, по умолчанию, не позволяет менять из размер.
И хотя на полке и в меню Keys вы можете разыскать операцию Free Tangent Weight (разблокировать
вес тангенса), выполнив его, вы получите такое сердитое сообщение об ошибке:
Error: All of the animation curves are non-weighted. Unable to change the weight locked state
Это означает, что сначала нужно разблокировать всю анимационную кривую, а уж затем
работать с отдельными тангенсами.
Поэтому выполните сначала операцию Curves=>Weighted Tangents.
После этого можно будет менять длину тангенсов выбранного ключа.
568
Книга Сергея Цыпцына
ш
Нажимая Shift, растяните тангенс средней кнопкой мыши, не изменяя его направления.
Теперь кубик, будет бодро переваливаться через ребро, немного «зависая» в верхней
точке. Сохраните сцену (rollingCubeCorrected.ma).
Дополнительные возможности Graph Editor
При работе с ключами в Graph Editor следует постоянно помнить про то, какой инструмент
является активным, так как никаких манипуляторов, в отличие от обычных камер, в этом редакторе
не появляется. Кроме того, основные операции производятся средней кнопкой мыши.
Кроме обычных инструментов Move и Scale, для работы с ключами есть более специфические
инструменты.
Когда анимационная кривая «густо засажена» ключами, удобно выделить сразу всю кривую
и двигать ключи с помощью Move Nearest Picked Key Tool. Этот инструмент перемещает только
один ключ, ближайший к точке, где была нажата средняя кнопка мыши.
Добавлять ключи на кривые можно с помощью Insert Keys Tool и Add Keys Tool. Первый
вставляет новый ключ в ближайшее место на кривой при нажатии средней кнопки мыши, второй
- ставит новый ключ в любое место и «подтягивает» анимационную кривую в это место.
Еще один инструмент, Lattice Deform Keys, позволяет деформировать выбранные ключи
с помощью решетки (Lattice). Это, естественно, может быть удобным лишь при достаточном
большом количестве выделенных ключей.
Все эти инструменты можно найти на полке Graph Editor.
Если в результате манипуляций с ключами некоторые из них съехали в межкадровое
пространство, то можно «приснапить» выбранные ключи к ближайшим целым кадрам с помощью
операции Edit=>Snap.
Если часть атрибутов объекта анимирована не с помощью анимации по ключам, а,
например, посредством expressions, то воображаемую анимационную кривую для этих атрибутов
можно нарисовать с помощью операции View=>Show Result.
С помощью меню Curves=> Post/Pre Infinity можно задавать, как будет продолжаться
анимационная кривая после своего последнего ключа (или перед первым ключом). Об этом я еще
поговорю позже.
Dope Sheet - альтернативный графический редактор
Я не пользуюсь этим альтернативным редактором анимации, поэтому могу лишь сказать,
что основное его преимущество - возможность одновременно видеть ключи для всех объектов
в сцене (или только для выбранных объектов). Благодаря тому, что ключи отображаются в виде
прямоугольников одинаковой ширины, на основании содержимого окна Dope Sheet удобно делать
выводы о тайминге анимации как для выбранных объектов, так и для всей сцены. Внешний вид
этого редактора чем-то напоминает экспозиционный лист (XSheet) для классической анимации,
поэтому пользователям с соответствующим образованием он, возможно, придется по вкусу.
Анимация
569
Это окно может быть также полезно при работе со звуком. Структура окна Dope Sheet, его
меню и основные приемы работы с ним практически повторяют аналогичные возможности для
Graph Editor.
Иерархическая анимация. Стэк анимации. Слоеная анимация
В MAYA нет понятия «стэк анимации», по крайней мере в виде, используемом в других
трехмерных конфессиях. Вместо этого применяется принцип иерархической анимации и смешанной
анимации. Про смешивание разных типов анимации на одном объекте я поговорю позже, а сейчас
остановлюсь на иерархическом принципе.
Вы можете выбрать любой объект и с помощью операции Edit=>Group сколько угодно
раз сгруппировать его с самим собой. Получится система вложенных групп, содержащая один-
единственный объект. Но каждая из этих групп может быть проанимирована независимо, у каждой
их них есть свой пивот, который можно редактировать, в общем, каждая группа представляет
собой полноценный объект (с нодой transform), и, выбрав ее отдельно, вы можете создать для нее
анимацию любого типа. Надо лишь хорошо представлять себе, как будут «складываться» анимации
отдельных групп в общее движение объекта, входящего в иерархию.
Проделайте простой пример.
Создайте полигональный куб.
Сгруппируйте его с самим собой (Edit=>Group).
Выберите куб, поверните его (rotateZ=20).
Выберите группу, растяните по вертикали (scaleY=2).
Теперь выберите куб, сожмите по вертикали (scaleY=0.5).
Выберите группу, поверните ее «обратно» (rotateZ=-20).
Почувствуйте разницу.
Таким образом, трансформации «наслаиваются» друг на друга, и совершенно очевидно,
что порядок применения трансформации к отдельным уровням иерархии очень важен.
Такой принцип можно также назвать «слоеной» анимацией. Важно помнить о том, что
анимация «слоев», то есть уровней иерархии складывается «сверху вниз»: сначала производятся
трансформации самого верхнего уровня (верхней группы), затем внутри этого уровня вычисляются
нужные трансформации и т.д.
Помните также, что трансформации объекта внутри группы происходят не в мировом
пространстве, а в локальном пространстве этой группы. Поэтому старайтесь делать анимацию
также «сверху вниз»: сначала анимируйте самый верхний уровень (группу), затем следующий, и
т.д. Причем для разных уровней вы можете применять разные виды анимации.
Перед тем как начать делать анимацию, полезно продумать сколько уровней иерархии
вам понадобится для результирующего движения. Например, ваш космический корабль несется
по крутой траектории, при этом его изрядно трясет, и в какой-то момент он начинает бешено
вращаться. В этом случае имеет смысл сгруппировать транспорт два раза с самим собой и получить
570
Книга Сергея Цыпцына
две дополнительные группы (а следовательно две новых ноды transform) для «послойной»
анимации. Самую верхнюю группу запускаете по пути (один вид анимации), следующую группу
трясете с помощью expression (процедурная анимация), а с нужного момента начинаете вращать
сам корабль обычными ключами на атрибутах rotate. С этого же момента можете выключить тряску,
проанимировав атрибут Node State у созданного expression. Иногда имеет смысл создать пару
«лишних» групп «про запас», на случай, если понадобится дополнительная вторичная анимации.
Проделаем небольшой пример иерархической анимации. Нет, это не будет планетарная
система. Это будет анимация юлы.
Анимация юлы
Перейдите в камеру front и нарисуйте профиль юлы с помощью Create=>CV Curve Tool.
Проследите за тем, чтобы последняя контрольная точка попала на вертикальную ось
координат, а первая точка находилась в начале координат.
Выберите кривую и выполните Surfасе=>Revolve. Любители кубизма могут установить в
Channel Box для ноды revolvel значения degree=Linear и sections=6.
При необходимости отредактируйте юлу, чтобы ее высота примерно равнялась 5
единицам.
Анимация
571
Переименуйте поверхность в spin.
«Обнулите» текущее положение, а точнее говоря, задайте значения трансформационных
атрибутов «по умолчанию»: Modify=> Freeze transformation.
Теперь все вращения и перемещения равны 0, а размер равен 1.
После окончания редактирования избавьтесь от истории.
Edit=>Delete All by Type=>History
Эта поверхность будет отвечать за вращение юлы вокруг вертикальной оси. Поэтому
сначала заблокируем все атрибуты, кроме rotateY, чтобы застраховаться от их непредвиденного
изменения.
Выделите все атрибуты, кроме rotateY, и из контекстного меню Channel Box (выпадающего
по правой кнопке) выполните Lock Selected.
Кроме того, спрячьте все только что заблокированные атрибуты: Channel Box=>Hide Selected.
572
Книга Сергея Цыпцына
Проверьте настройки анимации.
Задайте диапазон проигрывания от 0 до 25, а глобальный диапазон анимации от 0 до 200.
Задайте скорость проигрывания как Real-time (25 fps).
Выберите spin и поставьте два ключа на атрибут rotateY. Для этих целей хорошо подойдет
горячая клавиша «s».
В нулевом кадре задайте rotateY=0 и поставьте ключ.
В десятом кадре rotateY=360 и поставьте ключ.
Чтобы юла вращалась не только в течение десяти кадров, зададим ей бесконечное
продолжение анимационной кривой.
Откройте Graph Editor.
Нажмите «f».
Выберите анимационную кривую.
Выполните в меню Graph Editor операцию Curves=>Post lnfinity=>Linear.
Чтобы увидеть, как кривая будет продолжаться после второго ключа выполните
View=>lnfinity.
Анимация
573
Теперь юла будет вращаться бесконечно. Самое время проанимировать наклон оси юлы.
Для этого проще всего сгруппировать юлу саму с собой и проанимировать верхнюю группу. Выберите
юлу. Сгруппируйте: Edit=>Group. Переименуйте получившуюся группу в axis. Заблокируйте и
спрячьте все атрибуты axis, кроме rotateX и rotateZ.
Воплотим в жизнь основной принцип иерархической анимации: сейчас у юлы есть две
ноды типа transform - собственно сам объект spin и группа axis. Поскольку нода axis находится по
иерархии выше ноды spin, сначала будут выполнены все трансформации для группы axis, а затем
к результату будут применены вращения объекта spin. Выберите группу axis и поставьте пять
ключей на вращение в следующих кадрах.
Кадр 0: rotateX=30, rotateZ=0.
Кадр 25: rotateX=0, rotateZ=-30.
Кадр 50: rotateX=-30, rotateZ=0.
Кадр 75: rotateX=0, rotateZ=30.
Кадр 100: rotateX=30, rotateZ=0.
574
Книга Сергея Цыпцына
Подредактируем анимационные кривые.
Откройте Graph Editor и нажмите «f».
Удалите «лишние» ключи на наклонных участках.
И включите отображение «бесконечности»: View=>Infinity.
Выберите обе анимационные кривые и задайте для них бесконечное циклическое
повторение: Curves=>Post lnfinity=>Cycle.
Чтобы «повторы» гладко стыковались на границах, задайте «плоские» тангенсы для всех
выбранных ключей: Tangents=>Flat.
Выделите слева в Graph Editor канал Rotate Z, чтобы увидеть только его анимационную
кривую. Выберите первый и последний ключ на ней и выполните Tangents=>Spline, чтобы гладко
состыковать начало и конец анимационной кривой.
Анимация
575
Теперь ось юлы бегает по кругу.
Можно анимировать перемещения юлы по горизонтальной плоскости.
Для этого создадим еще один уровень иерархии для очередного «слоя» анимации.
Выберите группу axis и снова группируйте ее саму с собой.
Полученную группу назовите deviation.
Заблокируйте и спрячьте все атрибуты deviation в Channel Box, за исключением translateX
и translateZ.
Поставьте ключи на перемещение группы deviation.
Кадр 0: translateX=0, translateZ=0.
Кадр 50: translateX=0, translateZ=5.
Кадр 00: translateX=5, translateZ=5.
Кадр 150: translateX=5, translateZ=0.
Кадр 200: translateX=0, translateZ=0.
Отредактируем анимационные кривые.
Откройте Graph Editor и нажмите «f».
Выделите обе анимационные кривые и выполните Tangents=>Spline.
576
Книга Сергея Цыпцына
Чтобы сделать перемещения юлы более «жесткими», выберите два верхних ключа на
кривой для translateZ, а затем выделите соседние тангенсы этих ключей.
Выполните Keys=> Break Tangents, чтобы «сломать» тангенсы и редактировать их независимо,
с каждой стороны от ключа. Не забудьте включить Move Tool и потяните «сломанные» тангенсы
вниз.
Выполните аналогичные действия с нижними ключами на красной анимационной кривой
для translateX.
Анимация
577
Поэкспериментируйте с ключами и различными видами интерполяции. Сохраните сцену (ula.ma).
Пытливые умы наверняка держат за пазухой едкий вопрос: зачем это городить такой
«групповой огород», когда в принципе можно было бы обойтись одним объектом. Надо было бы
просто задать нужный порядок поворотов (атрибут Rotate Order в Attribute Editor), а перемещения
и вращения проанимировать независимо. Да, это так. Однако гораздо удобнее работать с
несколькими объектами (хотя бы с точки зрения постановки ключей) и разделять анимацию
на «слои». В данном примере каждая группа ответственна за определенный тип движения, и,
выбрав ее, совершенно очевидно, какие атрибуты и как надо редактировать для корректировки
анимации. В случае «экономии» и использования атрибутов одного объекта для общего движения,
придется все время держать в голове, какие атрибуты отвечают за определенный тип анимации и
переключаться в Graph Editor между «зарослями» анимационных кривых.
Не экономьте на промежуточных группах: они «съедают» совсем немного памяти и не
сильно утяжеляют сцену. Количество анимационных кривых остается неизменным, зато появляется
гибкость в добавлении дополнительных анимаций к уже существующему объекту.
Типы ключей. Breakdowns
Редактируя ключи в Graph Editor вы, конечно, заметили, что положение каждого ключа не
зависит от позиции остальных ключей и редактировать его можно совершенно автономно. Однако в
некоторых случаях хочется, чтобы некоторые ключи реагировали на перемещения своих соседей.
Например, вы поставили анимацию с помощью нескольких ключей, а потом хотите сдвинуть в
Graph Editor последний поставленный ключ влево, чтобы немного «укоротить» анимацию. Однако,
чтобы сохранить уже заданный темп движения, вам придется пропорционально сдвинуть влево
все ключи, кроме первого, то есть провести масштабирование ключей, которое само по себе не
является очень удобным занятием, особенно с точки зрения выбора центра масштабирования по
времени.
Чтобы заставить все промежуточные ключи между первым и последним сжиматься и
растягиваться по времени в соответствии с положением крайних ключей, их следует превратить в
специальный тип ключей - breakdown.
Положение ключей типа breakdown на временной шкале зависит от расположения
ближайших нормальных ключей справа или слева. Если с какой то стороны нормальные ключи
отсутствуют, то есть анимационная кривая заканчивается ключами типа breakdown, тогда
такие ключи ведут себя как нормальные (с тем исключением, что редактирование ближайшего
нормального ключа вызывает перемещение всех breakdowns вместе с ним).
Вы можете превращать нормальный ключ в ключ типа breakdown и обратно с помощью
операции Keys=>Convert to Breakdown/Convert to Key - в меню Graph Editor или через контекстное
меню временной линейки.
Ключи типа breakdown отображаются на временной линейке и в Graph Editor зеленым
цветом.
578
Книга Сергея Цыпцына
ш
Терминологический комментарий. Я ничего не смог придумать в качестве не то
что перевода, но даже русскоязычного написания термина breakdown. Надеюсь, вы
догадались, как называют такие ключи аморальные майщики.
Короткие вставки. Inbetweens
Иногда очень хочется вставить один дополнительный кадр в текущем кадре для всей
анимации объекта. Причем так, чтобы анимация практически не изменилась. Чтобы не возиться с
выбором всех анимационных кривых, а затем с выбором всех ключей справа от текущего кадра,
желая сдвинуть их вправо на один кадр, существует простая операция Add Inbetween, которая
делает все это автоматически. Все ключи справа и слева от текущего кадра сохраняют свои
тангенсы, и анимация объекта сохраняется.
Эту операцию можно выполнить в Graph Editor в меню Keys, либо в контекстном меню
временной линейки.
Примечание. Inbetween - это не тип ключей, как breakdown, это просто
дополнительный (не ключевой) кадр, вставляемый во всю анимацию.
Если вы хотите вставить такой кадр только в конкретные анимационные кривые, то следует
выбрать эти анимационные каналы в левой части Graph Editor и выполнить операцию Keys=>Add
Inbetween только для них.
Как нетрудно догадаться, операция Remove Inbetween удаляет в текущий момент времени
один кадр из всей анимации выбранного объекта. Все ключи справа от текущего кадра сдвигаются
влево. Будьте внимательны, если в соседних с текущим кадром (и особенно в нем самом) находятся
ключи. После удаления одного кадра, ключи могут «наехать» друг на друга, и анимация может
стать непредсказуемой.
Анимация по пути
Иногда бывает удобнее нарисовать в пространстве кривую и запустить объект по ней, чем
ставить множество ключей на перемещение и вращение объекта. Такой тип анимации, называемый
«движением по пути» (Motion Path Animation), более чем популярен.
С майской точки зрения, в ходе создания анимации по пути между объектом и временем
появляется «посредник» - объект motionPath, ответственный за то, чтобы объект постоянно
находился на кривой и преобразующий позицию объекта на кривой в мировые координаты. Сам
объект при этом движется пассивным образом. Реальная анимация по ключам создается для
объекта motionPath, который в свою очередь управляет положением и ориентацией объекта. Таким
образом, движение объекта зависит не от времени напрямую, как в случае ключевой анимации, а
от «посредника» motionPath.
Может быть, я выражусь банально, но, тем не менее, замечу, что движение по пути
предназначено для анимации только перемещений и вращений объекта. Следовательно, данный
тип анимации применим только к объектам, имеющим трансформационную ноду (то есть к DAG-
объектам) или, грубо говоря, имеющим собственный пивот. Для анимации материалов, например,
движение по пути напрямую не предназначено.
Итак, чтобы запустить объект по пути, надо иметь объект или иерархию, включающую
в себя сколько угодно объектов. При этом лучше заранее поинтересоваться, где у объекта или
группы расположен пивот (а именно, rotate pivot): ведь именно «пивотом» объект «поедет» по
пути. Крайне полезно будет также знать, как расположены локальные оси объекта или группы. Эта
информация будет играть решающую роль при ориентации объекта на кривой.
Также нужно иметь под рукой кривую (любой степени и топологии). Без нее ничего не
получится. Кроме того, удобно предварительно установить нужным образом диапазон проигрывания
анимации: по умолчанию объект будет «проезжать» весь путь за отрезок времени, указанный в
Анимация
579
этом диапазоне.
Сначала нужно выбрать объект (или объекты), затем кривую (кривая-путь выбирается
последней) и выполнить операцию Animate=>Motion Paths=>Attach to Motion Path.
После этого надо проиграть анимацию и увидеть, что, по «закону бутерброда», объект (камера,
источник света) движется по пути не так, как вам хочется. Далее следует открыть Attribute Editor
и отредактировать атрибуты ноды motionPath в соответствующей закладке, чтобы сориентировать
объект нужным образом.
Проделаем небольшой пример, иллюстрирующий все эти телодвижения. По ходу изложения
я отмечу некоторые неочевидные свойства движения по пути.
Пресмыкание по пути
Перейдите в окно side и нарисуйте профиль какого-нибудь Гада Пресмыкающегося.
Используйте CV Curve Tool и рисуйте слева направо, даже если вы привыкли писать наоборот.
Удостоверьтесь, что первая точка попала в начало координат, а последняя легла на горизонтальную
ось Z.
Далее для выбранной кривой строим поверхность вращения: Surfaces=>Revolve (ось
вращения, очевидно, Z).
Отредактируйте немного вашего Гада за контрольные вершины, чтобы было понятно, где
верх и низ, где брюхо, а где глаза.
580
Книга Сергея Цыпцына
Удалите исходную кривую.
Обратите внимание на расположение локальных осей внутри гада: ось Z смотрит вперед,
ось Y - вверх. Отметьте также, что пивот находится в начале координат. Скоро мы об этом вспомним.
Отмасштабируите кривую, чтобы ее длина равнялась примерно пяти единицам. Нарисуйте путь для
Гада. Это может быть абсолютно произвольная кривая. В качестве эксперимента можете ставить
точки неравномерно. Перед «запуском» Гада по пути, задайте диапазон проигрывания анимации
от нуля до двухсот кадров.
Выберите сначала Гада, затем кривую (путь всегда выбирается последним).
Выполните операцию Animate=>Motion Paths=>Attach to Motion Path.
Проиграйте анимацию.
Гад довольно весело едет по пути, однако совершенно не так, как нужно.
Анимация
581
Есть подозрение, что при выполнении последней операции можно было бы открыть
Option Box и указать массу параметров. Однако по доброй майской традиции все настройки можно
произвести после выполнения операции, отредактировав нужные атрибуты соответствующей
ноды.
Если Гад выбран, откройте Attribute Editor и разыщите там закладку motionPathl,
отвечающую за прикрепление объекта к пути.
Соответствующая нода появляется и в Channel Box в разделе INPUTS, однако для
редактирования нужных нам атрибутов необходим Attribute Editor.
Прежде всего, следует отметить, что по умолчанию включен атрибут Follow, отвечающий
за повороты объекта вдоль пути. Однако мы не определили, каким «боком» наш Гад должен
смотреть вдоль пути. Очевидно, что он должен двигаться «носом вперед», однако MAYA ничего не
знает о том, где у нашего мутанта «нос». По умолчанию объект движется по пути, разворачиваясь
своей локальной осью X по ходу движения. Это следует из значения атрибута Front Axis=X.
Установите Front Axis=Z, припоминая о том, что локальная ось Z у нашего пресмыкателя направлена
вперед. Анимация сразу примет более благопристойный вид.
Обратите внимание, что анимированное пресмыкающееся «зацепилось» за кривую своим
пивотом. Это не означает, что положение пивота больше нельзя редактировать, нет, вы можете
изменять его расположение внутри объекта привычным способом, однако при этом движение
пивота будет компенсироваться смещением объекта таким образом, чтобы пивот постоянно
оставался на кривой.
Следует также понимать, что инструкции «двигаться вперед локальной осью Z» еще не
достаточно для того, чтобы однозначно определить ориентацию объекта на пути. Наш гадёныш может
двигаться «носом вперед», но при этом перевернется «глазами вниз». То есть надо дополнительно
зафиксировать, где у объекта «верх», или «макушка», и куда смотрит эта «макушка».
В нашем случае установка по умолчанию Up Axis=Y задает подходящую для нас ориентацию
Гада «глазами вверх», так как локальная ось Y объекта направлена вверх.
Кроме того, в атрибутах motionPathl заданы значения World Up Type=Vector и World Up Vec-
tor=(0,1,0). Это означает, что локальная ось объекта, заданная с помощью UpAxis, будет стремиться
развернуться в направлении конкретного вектора (World Up Туре), координаты которого заданы
как (0,1,0), то есть вертикально вверх.
Поэкспериментируйте со значениями Up Axis, чтобы убедиться, что можно задавать
582
Книга Сергея Цыпцына
№
ориентацию не только «глазами вверх», но и «боком вверх», и даже «брюхом вверх». Не забудьте
про опции Inverse Front и Inverse Up. Они позволяют развернуть объект «задом наперед» и «вверх
тормашками».
Когда направление движения по пути становится параллельным направлению «вверх»,
заданному через World Up Vector, объект может внезапно перевернуться. В нашем случае это может
произойти, если на пути движения встретится вертикальный участок. Эта проблема связана с тем,
что в таких случаях объект пытается смотреть «вверх» одновременно и «носом» и «макушкой».
«Макушка» при этом, может стремительно вращаться.
Эту проблему решают обычно выбором направления World Up Vector таким образом,
чтобы оно никогда не совпадало с касательной к пути движения. Если же траектория столь
замысловата, что нельзя подобрать такой вектор, проблема решается выбором альтернативного
метода разворота «макушки» объекта, а именно World Up Type=Object Up. В этом случае требуется
создать дополнительный объект (обычно это локатор) и указать его имя в поле World Up Object.
После этого объект будет двигаться по пути и стараться ориентироваться своей «макушкой» на
локатор, который можно ловко анимировать, управляя ориентацией объекта. Подробнее о том,
как избежать проблемы перекручивания и внезапных переворотов, вы можете прочитать в разделе
про констрейны, а именно в описании Aim Constraint.
Атрибуты Front/Up/Side Twist позволяют «доворачивать» объект на нужный угол, если это
необходимо: ведь атрибуты rotate самого объекта заблокированы входящими связями от ноды
motionPathl. Вы можете анимировать атрибуты Twist любым способом.
Чтобы включить режим «мотоциклетного наклона внутрь поворота», существует опция
Bank (крен). Соответствующие атрибуты позволяют задать диапазон автоматического крена.
Редактирование анимации по пути
Теперь поговорим немного об внутреннем устройстве анимации по пути.
Как следует из Channel Box, на атрибутах translate и rotate объекта появились некоторые связи.
Перемещением и вращением объекта теперь управляет нода motionPathl, в чем нетрудно
убедиться, открыв Hypergraph.
Примечание. Если отключить опцию Follow в атрибутах ноды motionPath, атрибуты
rotate объекта, очевидно, «освободятся» от таких связей, так как в этом случае
объект не должен поворачиваться вдоль пути, и вы можете анимировать его
вращение любым угодным вам способом, например, нацелив его в нужную точку с
помощью Aim Constraint.
Самый «главный» атрибут ноды motionPath - это U Value. Он определяет, в каком месте на
кривой располагается объект.
Как вы знаете, «конкретное место на кривой» задается параметром U. Очевидно, что если
кривая имеет контрольные точки, неравномерно распределенные в пространстве, и построена по
умолчанию с использованием параметризации типа Uniform, то параметр U (или U-координата)
распределен вдоль кривой совершенно неравномерно. Именно поэтому опция Parametric Length
по умолчанию выключена, и объект движется вдоль кривой не в соответствии с параметризацией,
а пропорционально длине кривой. В этом случае атрибут U Value представляет собой длину
пройденного участка кривой. Точнее говоря, он изменяется от нуля до единицы, отражая, какую
часть полной длины кривой объект уже «проехал».
Если вы включите опцию Parametric Length, то увидите, что объект будет двигаться не
равномерно, а в соответствии с «насыщенностью» контрольными точками на различных участках.
Основная идея движения по пути заключается в том, что вы анимируете (не обязательно ключами)
атрибут U Value ноды motionPath и тем самым изменяете положение и ориентацию объекта в
пространстве. Сам объект анимируется «пассивно», то есть через посредника.
Примечание. В некотором смысле Motion Path можно рассматривать как констрейн.
По умолчанию, он создается уже с анимацией атрибута U Value, однако если в
Анимация
583
Option Box операции Attach to Motion Path определить Time Ran%e как Start, то в
результате выполнения этой операции получится объект, закрепленный в начале
кривой. Кривая в этом случае может рассматриваться как управляющий объект,
а нова motionPath как типичный констрейн с возможностью анимации положения
объекта на кривой.
По умолчанию, на атрибуте U Value стоят два ключа: один равен нулю в начале диапазона
анимации, а второй равен единице в конце диапазона. Можно в любом кадре отредактировать
или удалить эти ключи, а также поставить новые. Помните одно: вы анимируете не объект в
пространстве, а объект «вдоль кривой».
Если хотите, чтобы наш анимированный Гад Ползучий быстро проползал первую половину
пути, но медленно тащился на оставшемся участке, перейдите в кадр 50, задайте U Value=0.5 и
поставьте ключ на этот атрибут. Это означает, что на первую половину объект потратит 50 кадров,
а на вторую - 150.
Таким образом, вы можете заставить объект ездить взад-вперед или останавливаться.
В тех местах, где на атрибуте U Value стоят ключи, на кривой появляются маркеры.
Они, во-первых, облегчают контроль над темпом движения вдоль пути, а во-вторых, позволяют
редактировать скорость передвижения. Эти маркеры можно выбирать (проще всего с помощью
Select Tool) и даже перемещать вдоль кривой с помощью Move Tool, редактируя анимацию таким
образом. Для выбранного маркера можно также изменить в Attribute Editor значение времени,
соответствующее данному ключевому кадру.
Маркеры можно удалять, быстро удаляя, таким образом, ключи с атрибута U Value.
Откройте Graph Editor для выбранного гада.
Убедитесь в том, что анимационная кривая существует только для атрибута U Value, а
атрибуты rotate и translate никаких ключей не имеют. Чтобы увидеть «мнимые» анимационные
кривые для этих атрибутов, выполните в Graph Editor операцию View=>Show Result.
584
Книга Сергея Цыпцына
Нажмите «f» для адекватного отображения результата.
Надо обладать очень хорошим абстрактным мышлением, чтобы редактировать такие ключи
для анимации по пути в Graph Editor, поэтому закройте его, от греха подальше.
Деформация по пути
Бывалые юннаты могут скромно заметить, что наш питомец не ползет, а скорее «едет» по
пути. Для анимации всяческих твердотельных конструкций, типа паровозов или черепах, такой
результат вполне приемлем, однако в нашем случае хотелось бы настоящего пресмыкания и
деформации вдоль пути.
Можно, конечно, вручную создать нужный деформер, «припарентить» его к объекту и
задать его анимацию в зависимости от пройденного пути. Однако специально для таких случаев в
MAYA имеется операция Animate=>Motion Path=>Flow Path Object (flow - «течение»), позволяющая
сделать так, чтобы объект не только «ехал», но и «тёк» по пути. В Option Box этой операции есть
две основные опции.
Первая, Lattice Around=Object, создает деформационную решетку Lattice вокруг объекта и
позволяет изгибать сам объект в соответствии с участком пути, на котором он находится.
Вторая опция, Lattice Around=Curve, более интересна: она позволяет создать деформационную
решетку вокруг пути, а объект при движении будет «пролезать» сквозь эту решетку, изгибаясь,
сжимаясь или растягиваясь.
Выберите нашего твердотельного гада.
Откройте Option Box операции Animate=>Motion Path=>Flow Path Object и установите Lattice
Around=Curve. В этом случае следует задать достаточно большое количество разбиений решетки,
ведь она будет создана вдоль всего пути.
Установите Divisions:Front=100 и нажмите Flow.
Анимация
585
Вдоль пути появится «коридор», внутри которого яростно пресмыкается вполне гибкий
гад.
Примечание. Созданный «коридор» - это обычная деформационная решетка
Lattice. Иногда при выполнении операции Flow Path Object анимируемый объект «не
влезает» в решетку и деформируется некорректно. В этих случаях нужно просто
выбрать в Outliner саму решетку ffdlLattice и соответствующую ей «базовую»
решетку ffdIBase, а затем отмасштабировать их обеих так, чтобы объект
полностью помещался внутри «коридора.
На сильных изгибах может быть заметно, что деформация не совсем корректна
влияет на «спину» гада не полностью. Исправим эту проблему.
решетка
Выделите в Outliner решетку ffdl Lattice и базовую решетку ffdIBase. Возьмите Scale Tool и
растяните обе решетки по вертикали, пока деформация не станет корректной.
586
Книга Сергея Цыпцына
Чтобы «вползание» в решетку отрабатывалось корректно, следует выбрать решетку,
открыть Attribute Editor и указать в закладке ffdl, как должен вести себя объект вне решетки.
Установите Outside Lattice=AU.
Вы можете выделить в любом месте несколько точек деформационной решетки и создать
эффект «пролезания в замочную скважину», сжав их в помощью Scale Tool. Или наоборот: растянуть
решетку в определенном месте, заставив удавца «проглотить» кролика.
Сохраните сцену (snakeMotionPath.ma)
Анимация
587
Некоторые практические замечания по использованию
анимации по пути
Если вы будете запускать по пути камеру или направленный источник света, имейте в
виду: локальная ось Z этих объектов смотрит «назад». Поэтому если вы хотите, чтобы камера
ехала по пути объективом вперед, следует указать в атрибутах motionPath, что Front Axis= Z, и
включить опцию Inverse Front. При запуске по пути «следящей камеры» следует выключить опцию
Follow, чтобы «освободить» атрибуты rotate и организовать слежение с помощью Aim Constrain.
Кстати, проложить путь для анимации объекта можно, не создавая предварительно
кривую. Достаточно воспользоваться операцией Animate=>Motion Paths=>Set Motion Path Key. Если
передвигать объект в нужное положение и выполнять эту операцию, то MAYA будет «выращивать»
путь вслед за объектом. Надо только не забывать перемещаться в нужный кадр перед установкой
очередного ключа.
Часто бывает удобно перед «запуском» по пути предварительно сгруппировать объект с
самим собой, а по пути запустить группу. Это даст возможность разворачивать и анимировать
объект внутри «едущей» группы, не заботясь о расположении локальных осей внутри него.
Очевидно, что кривая, по которой движется объект, может быть анимирована любым известным
вам способом. В том числе с помощью морфинга Blend Shapes.
Иногда возникает задача запуска по пути не обычных объектов, а системы частиц. Для
этого существует скрипт, создающий множество локаторов, окружностей, expression и goal-
объектов. Этот скрипт запускается из основного меню операцией Effects=>Curve Flow, и перед его
запуском нужно выбрать только одну кривую. Для тех, кого не устраивает производительность
или качество этого эффекта, могу порекомендовать воспользоваться плагинами Stroika Dynamics
компании Kolektiv (www.kolektiv.com).
В тех случаях, когда нужно запустить объект не по кривой, а по поверхности (возможно
деформируемой), можно воспользоваться разными подходами.
Для сплайновых поверхностей достаточно создать «кривую на поверхности» (curve on
surface) и запустить объект по ней. Благодаря тому, что такие кривые «вшиты» в поверхность, объект
всегда будет оставаться на поверхности, даже при деформациях последней.
Для полигональных сеток задача прокладывания пути по поверхности немного усложняется.
Для сохранения истории можно скопировать некоторое количество ребер с помощью операции
Duplicate Surface Curves. Затем соединить их в кривые и, натянув на них поверхность типа Loft или
Square, свести задачу к предыдущему случаю. Однако выглядит это довольно громоздко.
Можно также воспользоваться динамикой волос и посадить на полигональную сетку
одиночный «волос». Его (follicle) можно использовать как управляющий объект для Point и Orient
Constraint. Движения по поверхности можно задавать, анимируя атрибуты U/V Parameter ноды
follicle для этого волоса.
Если это выглядит кощунственно, то для анимации движения по любой поверхности
(сплайновой или полигональной) может подойти использование Geometry и Normal Constraint.
588
Книга Сергея Цыпцына
Констреины
Здесь, наверное, следует сразу начать с терминологических комментариев. Английский
глагол constrain переводится как «принуждать», «сдерживать» и даже «заключать в тюрьму».
Существительное constraint переводится как «ограничение», «принуждение» и «тюремное
заключение». Применительно к майской тематике, эти значения подходят, мягко говоря,
плохо. Володя Забелин посоветовал мне неплохой теоретический термин «согласование» (в
смысле: согласование поворотов, размеров, позиций). Он очень хорошо отражает суть именно
майского подхода и в качестве глагола очень удобен, однако использовать его для обозначения
соответствующих объектов (то бишь «согласователей») не слишком, скажем так, ловко.
«Ограничители», «связи», «удержатели»? Это плохо отражает суть дела и к тому же путается
с другими майскими понятиями (попробуйте перевести «Aim Constraint» двумя словами, и вы
поймете, о чем я).
Поэтому я оставил это существительное без перевода и просто перенес его из уже
существующего, устного использования в письменное. Но вот довольно лихой глагол, то есть
«приконстрейнить», я буду стараться применять как можно реже: в общем, можно выкрутиться
при помощи фраз типа «нацелим верхушку объекта А в центр объекта Б с помощью Aim
Constraint». Объекты, выбранные в качестве ограничивающих или согласовывающих движение, я
буду называть управляющими объектами, а объект, чье движение согласуется или ограничивается
- управляемым.
В некоторых других конфессиях для обозначения функциональности констрейнов
употребляется термин «анимационные контроллеры».
Итак, что же такое констреины? Это - специальные объекты, позволяющие ограничить или
согласовать движение одного объекта в соответствии с трансформациями другого (или других). Речь
идет только о трансформациях: перемещениях, поворотах и масштабировании. Другим словами,
это способ так наложить на объект связи, чтобы он двигался или поворачивался согласованно с
другими объектами. Так как речь идет об анимации, такая связь должна оставаться постоянной и
сохраняться во время движения.
Бытовыми аналогами констрейнов могут служить различные приспособления для сборки
конструкций. Например, если вы прибьете гвоздем один предмет к другому, вы согласуете их
совместные перемещения и вращения (но не размеры). Повесив объект на крюк, вы ограничиваете
только его перемещения, в то время как вращаться он может сам по себе. Собака на поводке
также являет собой пример «приконстреиненного» объекта. Майские констреины - это и есть
такие «гвозди», «крюки», «поводки», «скотч» и прочие приспособления...
Собственно, главное предназначение констрейнов - это обеспечение пользователя
инструментами для конструирования и сборки смоделированных объектов в некоторые
конструкции и механизмы. Настройка персонажа - типичный пример конструирования механизма,
включающего систему взаимосвязей и влияний объектов друг на друга. Констреины служат для
подготовки моделей к анимации. Конечно, можно проанимировать каждую часть персонажа или
конструкции отдельно и вручную (это, кстати, часто очень эффективный метод), но если модель
будет «жить долго» и использоваться еще не раз, то проще настроить связи между объектами
таким образом, чтобы анимировать только основные управляющие объекты, а все остальные будут
двигаться вместе с ними автоматически.
Таким образом, движение одного управляющего объекта служит источником возникновения
пассивной или косвенной анимации, когда все зависимые от констрейнов объекты двигаются,
хотя для них не ставились ключи и не создавались expressions.
Применение, освоение и эффективное применение констрейнов требует некоторой
Констреины
589
1АМЖА
«инженерности» мышления. Когда я впервые увидел хорошо известную конструкцию под названием
Reverse Foot для управления ногами персонажа, я всерьез задумался над тем, в какой же извращенно-
изобретательный ум могла прийти такая логика использования костей и констреинов. Если вы
собираетесь сконструировать довольно сложную систему или механизм, рекомендую сначала
набросать его функциональную схему на бумаге. Если вы знакомы с теоретической механикой
(самой страшной дисциплиной среди естественных наук), это дает вам огромное преимущество в
сборке и подготовке моделей к анимации.
Порядок работы с констрейнами. Их устройство и отличия от
других видов связи между объектами
Типичный способ работы с констрейнами заключается в следующем: сначала надо выбрать
объект (или объекты), к которому вы собираетесь привязаться (или с которым собираетесь
согласоваться), потом объект, который будет привязан (согласован) с первым, а затем выполняется
операция создания нужного констрейна.
Вот пример. Создайте сферу и куб, раздвиньте их в пространстве.
Выберите сферу, затем куб и выполните Constrain=>Point.
Куб тут же «прилипнет» к центру (пивоту) сферы и в дальнейшем будет автоматически
двигаться вместе с ней.
Попытки передвинуть сам куб ни к чему не приведут - он «прибит» к сфере. Хотя может
свободно и независимо от сферы поворачиваться и растягиваться.
Секундочку! Но ведь если взять и соединить с помощью Connection Editor все атрибуты
translate сферы и куба, то результат будет идентичный. Так в чем же разница?
Да, в данном конкретном случае, результат применения констрейна и прямого связывания
атрибутов будет одинаков. Однако у констреинов есть три принципиальных отличия от прямых
связей.
Во-первых, для всех констреинов в сцене создается отдельный объект со своими
атрибутами, с помощью которых можно анимировать свойства связи между объектами.
Во-вторых, у большинства констреинов есть атрибут offset, позволяющий не напрямую
связывать атрибуты объектов, а добавлять в эту связь некоторое смещение.
В-третьих, самое главное: управляющих объектов, к которым привязывается последний
выбранный объект, может быть несколько. В этом случае объект стремиться занять среднее
положение между ними (например, в случае с Point Constraint). Более того, если управляющих
объектов несколько, все они обладают весами, определяющими, насколько сильно ограничиваемый
объект стремится к каждому из них.
Добавьте в предыдущую сцену еще пару объектов, например, тор и конус.
Выберите их, а затем выберите уже «приконстрейненный» куб.
И снова выполните Constrain=>Point.
MAYA определит, что куб уже привязан к сфере с помощью констрейна типа Point и,
вместо создания нового констрейна, просто добавит тор и конус в список объектов, к которым
привязывается положение куба.
Теперь куб стремится сразу к трем управляющим объектам, то есть занимает позицию,
среднюю между тремя объектами.
Если выбрать куб, то в Channel Box можно обнаружить ноду pCube1_pointConstraint1,
имеющую атрибуты offset, и три атрибута, отвечающие за вес каждого управляющего объекта.
590
Книга Сергея Цыпцына
«Пошевелив» каждый из этих атрибутов, можно убедиться, что они определяют степень
влияния управляющих объектов. Нулевое значение веса означает, что соответствующий объект
не оказывает никакого воздействия на куб. Проанимировав эти атрибуты нужным образом, можно
добиться того, что куб будет перелетать от одного к объекта к другому, причем вне зависимости
от движения самих управляющих объектов.
Основное свойство и преимущество констрейнов и их принципиальное отличие от других
методов согласования движения заключается именно в том, что несколько объектов могут
воздействовать на управляемый объект с разной степенью влияния.
Типы констрейнов. Их общие и уникальные атрибуты
Сейчас я бы хотел пробежаться по всем типам констрейнов и обозначить примерные
области их применения. Затем, как обычно, последует описание их внутреннего устройства и
вопросы совместимости констрейнов. Сейчас я бы хотел еще раз обозначить, что абсолютно все
констреины имеют атрибуты, определяющие вес, и многие из них позволяют задавать смещение
(offset) относительно положения по умолчанию. Эти параметры можно задавать еще при создании
констрейна, воспользовавшись, очевидно, Option Box для соответствующей операции или
отредактировать позднее.
Point Constraint
Используется для того, чтобы просто прикрепить один объект к другому (или один объект
к средней позиции между несколькими объектами). Благодаря анимации весов, может быть
использован дпя движения объекта от одной цели к другой. Например, перебрасывание предмета
из руки в руку, захват и бросок мяча, посадка на движущуюся платформу.
Orient Constraint
Разворачивает управляемый объект так же, как управляющий. Если управляющих объектов
несколько, повороты управляемого объекта равны усредненным величинам поворотов управляющих
объектов. Используется часто в дополнении к Point Constraint, чтобы заставить объекты не только
двигаться, но и поворачиваться синхронно.
Здесь необходимо уточнить разницу между констрейнами и объединением объектов в
иерархию. Если вы назначите один объект в качестве «родителя» (parent) для другого с помощью
операции Edit=>Parent, подчиненный объект тоже будет перемещаться и поворачиваться, вместе
с «родительским». Однако важно помнить, что в этом случае подчиненный объект поворачивается
вокруг пивота родителя, а не вокруг своих локальных осей. В случае, когда вы «прибили» один
объект к другому с помощью констрейнов (и, возможно, задали некоторое смещение (offset),
управляемый объект будет поворачиваться вокруг своего центра вращения, а не вокруг пивота
управляемого объекта.
Констреины
591
Ш1!Ш
Примечание. Атрибут offset в случае с Orient Constraint очень полезен и позволяет
избежать разворота локальных осей управляемого объекта для достижения
нужной ориентации.
Scale Constraint
Этот редко используемый констрейн позволяет привязывать масштаб одного объекта к
размеру других.
Смешивание анимации - старый добрый подход
До того, как в MAYA появились методы смешивания анимации (animation blending),
констрейны были единственным и очень надежным способом смешивания и даже монтажа
анимации. Я мог бы порекомендовать использовать этот метод и сейчас, в силу его абсолютной
предсказуемости.
Представьте себе, что у вас есть самолет, заходящий на посадку на палубу авианосца,
который раскачивается на волнах несильного шторма. Нарисовать кривую, по которой будет
двигаться самолет, от начала и до конца невозможно, тем более если корабль раскачивается
на волнах океана, анимированного с помощью MAYA Fluids. В этом случае проще сделать две
анимации по пути: заход на посадку и пробежка по посадочной полосе. Причем сделать эти две
анимации надо для двух кривых и двух простых объектов-«болванок». Одна болванка заходит на
посадку, а вторая начинает двигаться по палубе незадолго до того как первая достигнет конца
своего пути. После этого нужно лишь выбрать обе болванки, затем самолет и создать сначала
Point Constraint, а затем Orient Constraint. При этом самолет «зависнет» между двумя болванками.
Затем нужно проанимировать веса этих болванок так, чтобы самолет сначала заходил на посадку,
то есть двигался по первой кривой (вес первой болванки единица, второй - ноль), а затем плавно
«перепрыгивал» на палубу (вес первой - ноль, второй - единица).
Основная идея такого подхода заключается в том, что самолет не анимируется сам по
себе. Анимируются простые вспомогательные объекты. Их число равно количеству «анимаций»,
которые мы хотим «состыковать». После того, как эти объекты санимированы, основная модель
привязывается к ним с помощью констрейнов. Затем анимируются веса таким образом, чтобы
обеспечить плавный переход от одной анимации к другой. Еще раз повторюсь: основной объект
не анимируется! Анимируются лишь управляющие объекты и их степень влияния на этот объект.
Вторым примером может служит знаменитое устройство руки персонажа для переключения
между прямой и инверсной кинематиками. Вместо одной руки (с каждой стороны, естественно)
персонажу дается целых три. Первая содержит IK Handle и анимируется инверсной кинематикой,
вторая анимируется прямой кинематикой, а третья никак не анимируется, а «болтается» между
первыми двумя с помощью системы констрейнов. Именно третья рука несет на себе скининг,
мышцы и остальные элементы. В те моменты когда для анимации нужна только прямая или
только инверсная кинематика, веса устанавливаются соответствующим образом. Анимация весов,
позволяет сделать переход от одного типа кинематики к другому плавным. Сейчас в MAYA имеются
специальные средства для смешивания типов кинематики, однако такой подход универсален и
применим не только к анимации рук или костей скелета.
На сегодняшний день MAYA обладает средствами смешивания разных типов анимации
непосредственно на самом объекте, без привлечения вспомогательных «болванок». Об этих
средствах я поговорю позже. Однако переключение между анимированными управляющими
объектами с помощью констрейнов по-прежнему является надежным методом «стыковки»
анимаций.
Parent Constraint
Иногда возникает задача: временно «припарентить» один объект к другому, не меняя,
однако, при этом существующей иерархии в сцене. Это может понадобиться для согласованной
анимации родительского и подчиненного объекта, как единого целого.
592
Книга Сергея Цыпцына
Для этих целей существует Parent Constraint. Он привязывает один объект к другому (или
к другим, что важно!), но точно так же, как если бы была выполнена операция Edit=>Parent.
Edit Help
Maintain Offset W H
Constraint Axes
Translate W All
Г X ГУ Г 2
Rotate P All
Г X ГУ Г2
Weight 11.0000 '—J —
Add | Apply | Close |
В отличие от вышеперечисленных констрейнов, управляемый объект может иметь свои
собственные перемещения и повороты, при этом он дополнительно наследует перемещения и
повороты управляющего объекта. Он движется в точности так же, как объект, иерархически
подчиненный своему родителю, однако никакой новой иерархии в сцене не появляется. Кроме
того, при создании в Option Box можно задать, будет ли распространяться такое поведение на
перемещения и на повороты или только на выбранные атрибуты. Для Parent Constraint опция
Maintain Offset (сохранить смещение) по умолчанию включена, чтобы сохранить взаимное расположение
объектов при создании констреина, поэтому управляемый объект не «перескаивает» в новую
позицию.
Внимание! Очень важно понимать одно существенное различие между Parent Constraint и
операцией Edit=>Parent. Внешне результат «припарентивания» совершенно одинаковый. Однако
в случае применения констреина в Channel Box для подчиненного объекта будут высвечиваться
абсолютные перемещения и вращения объекта. В случае обычного «припарентивания» эти
координаты будут локальными (то есть относительно родительского объекта) и не будут меняться,
когда родительский объект перемещается в пространстве.
Данный констрейн очень удобен, когда ваш персонаж хочет что-нибудь схватить или
положить. В тот момент, когда надо что-то взять, нужный предмет следует прикрепить к руке
с помощью Parent Constraint. Расстояние между предметом и рукой сохранится. Далее, следует
проанимировать вес, чтобы до момента хватания он был равен нулю, а после - единице.
Aim Constraint
Это один из самых популярных констрейнов. Он позволяет «нацеливать» один объект на
другой (или на другие). Как обычно, достаточно выбрать объект-цель, затем управляемый объект и
выполнить Constrain=>Aim. После этого управляемый объект будет все время смотреть на объект-
цель.
Сейчас самое время уточнить, что это значит: «смотреть на». Представьте себе, что вы
лично получили указание свыше типа «повернитесь к солнцу». Наверняка вы повернетесь к нему
лицом, ибо для вас лицо - это, скажем так, направление по умолчанию. Повернуться к солнцу
можно было бы и спиной и боком, если бы в полученном свыше указании было бы уточнение,
«чем» повернуться к солнцу.
Однако повернувшись к солнцу лицом, вы понимаете, что смотреть на него можно в разных
положениях: например, наклоняя голову вправо или влево или даже встав на голову - тем не
менее вы все равно продолжаете оставаться «лицом к солнцу». Чтобы однозначно зафиксировать
положение вашей головы в трехмерном пространстве, вы должны получить дополнительное
уточняющее указание типа «смотреть на солнце макушкой вверх» или «смотреть на солнце
и наклонить голову вправо, чтобы левое ухо смотрело вверх». Таким образом вам нужны два
указания: «чем» смотреть на солнце и «чем» смотреть вверх, для того, чтобы однозначно повернуть
голову.
Констрейны
593
Попробуем посмотреть на солнце в MAYA. Очевидно, что солнце - это сфера (для любителей
фантастики и пришельцев, это может быть куб). Лицо - это очевидно, конус. На нем есть нос.
(Желающие фотореализма могут небыстро смоделировать реалистичное лицо). Создав сферу и
конус (полигональные для определенности), немного растяните конус по оси X, для контроля
расположения локальных осей, и отодвиньте его вверх по оси Y.
Теперь посмотрим конусом на солнце.
Выберите сферу, затем конусовидное лицо и выполните Constrain=>Aim.
Конус тут же развернется и будет «смотреть» на сферу.
Подвигав сферу, в этом нетрудно убедиться.
Разберемся теперь, КАК и ЧЕМ конус смотрит на сферу. Возможно, вы ожидали, что он
будет смотреть на нее «носом», то есть верхушкой, однако мы же не сформулировали при создании
констреина, чем именно надо смотреть на сферу. Поэтому конус смотрит на нее «боком», а точнее
говоря, своей локальной осью X (в чем нетрудно догадаться, включив манипулятор Scale Tool). Для
конуса ось X является «лицом по умолчанию».
К счастью, не обязательно все переделывать заново, поскольку, как обычно, все параметры,
задаваемые в Option Box при создании констреина, можно разыскать в Attribute Editor в виде его
атрибутов.
Выберите конус, откройте Attribute Editor.
Разыщите там закладку pCone_aimConstraint1 и поглядите на ее атрибуты.
594
Книга Сергея Цыпцына
Наряду с традиционным атрибутом offset, там присутствует атрибут Aim Vector (вектор,
которым прицеливаются). Он установлен в (1,0,0), что в переводе на человеческий язык означает
«локальная ось X».
Задайте для Aim Vector значения (0,1,0), определяющие локальную ось Y конуса. Теперь
конус развернулся и смотрит на сферу своей макушкой, то есть своей локальной осью Y.
Борьба с переворачиванием
Вроде бы задача решена, однако осталась неоднозначность в том, как конус повернут
вокруг оси «прицеливания». По аналогии с разворотом лица к солнцу, мы никак не определили,
«каким ухом смотреть вверх».
За то, какой локальной осью смотреть вверх, отвечает атрибут Up Vector. Установите его в
(1,0,0), и конус, продолжая смотреть макушкой на сферу, развернется так, чтобы его локальная
ось X стремилась максимально смотреть наверх.
Констрейны
595
ИМША
Таким образом, чтобы однозначно задать прицеливание одного объекта на другой с
помощью Aim Constraint, вы должны определить две локальные оси прицеливаемого объекта: ЧЕМ
(какой осью) смотреть на цель и ЧТО (какая ось) будет смотреть вверх.
Будет гораздо лучше, если вы будете знать, как расположены локальные оси прицеливаемого
объекта, заранее, перед созданием констрейна. Это избавит вас от неожиданных сюрпризов.
Некоторые пытливые умы наверняка столкнутся с ситуацией, когда конус начнет
«перекручиваться». Поместите сферу в начало координат, а конус расположите точно над ней.
Если перемещать сферу вдоль оси X, то при прохождении начала координат, конус над сферой
быстро «прокручивается» вокруг линии «нацеливания». Чтобы это лучше увидеть, оттащите одну
или несколько вершин на краю конуса, чтобы сделать его несимметричным.
Это вовсе не глюк и не ошибка. В данном случае MAYA делает ровно то, что от нее просят.
Разберем ситуацию поподробнее.
Медленно перемещайте сферу по горизонтали и следите, как расположена локальная
ось X конуса (можно для наглядности выбрать конус и включить отображение локальных осей:
Display=>Component Display=>Local Rotational Axes).
Конус, в соответствии с полученными указаниями, пытается направлять свою локальную
ось X вертикально вверх. Когда сфера проходит через начало координат, эта локальная ось
становится почти горизонтальной и в какой-то момент «переворачивается» на 180 градусов, чтобы
упорно продолжать смотреть наверх. Все это совершенно корректно и предсказуемо.
Дело в том, что в некоторый момент локальная ось Y конуса смотрит строго вниз. В этот
момент направление прицеливания становится параллельным вертикали. Получается, что конус
должен одновременно смотреть вниз осью Y и вверх осью X. (Если конус находится снизу от сферы,
получается, что он должен смотреть вверх обеими локальными осями, X и Y.). С точки зрения
математики возникает особая точка, или сингулярность, а с точки зрения «нормальных людей»
возникает вопрос: как этого избежать, как заставить конус не прокручиваться?
Именно в этом конкретном случае, когда направление прицеливания конуса проходит через
вертикаль, надо просто использовать для ориентации вместо направления вверх направление
вбок. До сих пор мы предполагали, что локальная ось X должна смотреть вверх, не задумываясь,
а почему, собственно, «вверх». Оказывается, за направление, к которому стремится ось, заданная
через атрибут Up Vector, отвечает атрибут World Up Vector. По умолчанию он равен (0,1,0), то есть
определяет направление «вверх».
Измените значение World Up Vector на (0,0,1). Конус станет смотреть своей локальной
осью X «вбок», вдоль направления мировой оси Z. Чтобы вернуться к предыдущей ориентации, но
596
Книга Сергея Цыпцына
с данным значением World Up Vector, надо очевидно изменить атрибут Up Vector на (0,0,1), чтобы
конус смотрел «вбок» своей осью Z.
Теперь конус не «прокручивается», когда сфера проходит через начало координат. Таким
образом, при использовании Aim Constrain вы должны также держать в уме будущее возможное
расположение объектов и стараться избегать ситуации, когда ось «прицеливания» будет проходить
через направление, заданное с помощью World Up Vector. Если нацеливаемый объект будет
«рыскать» в поисках цели в горизонтальной плоскости, то в качестве «верха» вполне годится
World Up Vector=(0,1,0). Если направление прицеливания в процессе анимации будет проходить
через вертикаль, определите World Up Vector как направление, через которое никогда не пройдет
линия прицела.
Примечание. Нельзя задавать одинаковое значение для атрибутов Aim Vector и Up
Vector. В этом случае вы будете разворачивать объект одной и той же осью и «на
цель» и «вверх».
Примечание. Атрибуты Aim Vector и Up Vector могут задавать не только локальные
оси объекта с помощью «круглых» значений типа (0,1,0) или (1,0,0), но и могут
определять произвольное направление «внутри» объекта, которым он должен
смотреть с нужном направлении. Но это скорее экзотика, чем правило.
Предвижу вопросы о том, а как быть в произвольном случае, когда заранее не известно
расположение цели и «целящегося» объекта. Для любителей самых общих случаев могу предложить
следующее решение.
Вместо того, чтобы определять фиксированное направление «вверх» или «вбок» для
ориентации объекта после прицеливания, можно создать дополнительный объект и дать указание
целящемуся объекту смотреть одной из своих осей не вверх, а на этот объект. В гуманитарных
терминах это прозвучит так «Смотреть лицом на солнце и при этом макушкой на зонтик (фонарь,
самолет)».
Создайте с сцене с конусом локатор.
Наверняка его имя будет locatorl.
Выберите конус и в атрибутах pCone1_aimConstraint1 установите World Up Type=Object Up. Это
значит, что вместо «верха» будет использоваться направление на некоторый объект.
Задайте имя этого объекта (locatorl) в поле World Up Object.
После этого конус развернется своей локальной осью Z (определенной в Up Vector) в
направлении локатора.
Задайте снова Up Vector равным (1,0,0), и конус развернется к локатору своей осью X,
продолжая смотреть на сферу.
Констрейны
597
HMMi
Таким образом, теперь у вас есть полное управление тем, как будет вести себя конус
в процессе «слежения» за сферой. Вы можете контролировать, куда смотрит «лицо» конуса, а
также, куда направлена его «макушка». В процессе анимации следует избегать ситуаций, когда
сфера, конус и локатор оказываются на одной линии. Это несложно сделать, просто анимируя
положение локатора.
Очень часто Aim Constraint применяется для ориентации камер или источников света в
нужном направлении. При создании такой «следящей камеры» следует учитывать, что локальная
ось Z для источников света и камер направлена «назад», поэтому в качестве Aim Vector для них
следует выбирать (0, 0, -1), а в качестве Up Vector (0,1,0).
Подводя итог разговора про Aim Constraint, хочу напомнить, что вы должны безупречно
представлять себе, как расположены локальные оси объекта. Вас не должна смущать запись типа
(-1,0,0) для обозначения направления внутри объекта, противоположного локальной оси X. Вы
также должны помнить, что объект может поворачиваться в сторону цели различными способами,
поэтому необходимо уточнять, куда смотрит не только его «лицо», но и «макушка».
Совет. Атрибуты offset при использовании Aim Constraint чудовищно удобны.
Мало того, что они позволяют анимировать небольшое собственное «рысканье»
объекта. В ситуации, когда объект «смотрит» на цель не той локальной осью,
вместо возни с переопределением Aim Vector и Up Vector, можно просто развернуть
(или точнее «довернуть») объект нужной осью на цель, добавив, «методом тыка»
90 (или -90) градусов в соответствующее значение для атрибутов offset.
Geometry Constraint
Следующие три типа констрейнов согласуют объект не с положением или вращением
управляющего объекта, а с его формой.
Первый из них, Geometry Constraint, позволяет «посадить» объект на поверхность или
кривую и ограничить его движение только в пределах этой кривой или поверхности.
Следует четко понимать, что этот констрейн не прикрепляет «намертво» объект к
фиксированной точке на поверхности. Вы можете свободно перемещать объект и анимировать его
положение. MAYA будет пересчитывать его позицию как ближайшую точку на поверхности. Если
передвигать саму управляющую поверхность, то объект будет скользить по ней, пытаясь остаться
на месте, но следуя наложенным ограничениям.
Этот констрейн удобен для анимации движений объекта вдоль поверхности. Он имеет
только атрибуты, определяющие вес управляющей поверхности или кривой.
Примечание. Для того, чтобы намертво закрепить объект в фиксированной точке
поверхности, имеются многочисленные способы, описанные в главе про изнанку
MAYA.
Normal Constraint
Данный констрейн позволяет развернуть объект так, чтобы он смотрел вдоль нормали к
заданной поверхности. Управляемый объект только разворачивается вдоль нормали, но остается
на месте и не перемещается на поверхность. Поэтому Normal Constraint и Geometry Constraint
часто используют вместе.
Читая выражение «смотрел вдоль нормали», вы должны сразу понимать, что в этом случае
необходимо задавать значения того, какой осью объект должен смотреть вдоль нормали и какой
осью он должен смотреть наверх. Он имеет такие же атрибуты, как и Aim Constraint, и требует
четкого понимания, как расположены локальные оси внутри управляемого объекта.
Совет. Атрибуты offset при использовании Normal Constraint удобны для разворота
598
Книга Сергея Цыпцына
№
объекта нужной локальной осью вдоль нормали. Кроме того, вы можете
использовать Normal Constraint для ориентации объекта не только вдоль нормали,
но и вдоль касательной в поверхности. Ориентация объекта в касательной
плоскости также может настраиваться атрибутами offset.
Tangent Constraint
Этот констрейн используется для ориентации объекта вдоль направления касательной
к выбранной кривой. Он не работает с поверхностями в качестве управляющих объектов.
Используется редко. Имеет атрибуты и идеологию, аналогичные Aim Constraint.
Совет. Гораздо проще закрепить и развернуть объект по касательной к кривой
с помощью анимации по пути. Закрепить объект на поверхности этим же
способом можно, создав кривую на поверхности (для сплайнов) или сдублировав
полигональное ребро. Полученную кривую можно использовать для анимации по
пути, с сохранением истории моделирования и принадлежности такой кривой к
поверхности.
Pole Vector Constraint
Констрейн с таким устрашающим названием предназначен для весьма специальных целей.
Если вы создали цепочку из костей и сделали для нее IK Handle, то при сгибании такой цепочки
(пусть это будет рука или нога), локоть (или колено) сгибается в каком-то, не всегда удобном
направлении. Для того, чтобы четко определять, куда будут смотреть локти или колени согнутых
с помощью инверсной кинематики конечностей, существует Pole Vector Constraint.
От том, что Pole Vector является атрибутом объекта типа IK Handle и задает плоскость,
в которой двигается кинематическая цепочка из костей, читайте с разделах про скелетоны и
инверсную кинематику.
Очевидно, что управляемым объектом в этом случае будет объект IK Handle, причем только
с определенным типом вычисления инверсной кинематики, а именно Rotation Plane IK Handle.
Управляющим объектом, как правило, выбирается локатор.
Совместимость констрейнов.
Использование нескольких констрейнов для одного объекта
Если не рассматривать Pole Vector и Scale Constraint, все остальные констрейны, очевидно,
воздействуют на атрибуты translate или rotate, ограничивая, таким образом, перемещение или
вращение объекта.
Констрейны
599
НИША
Судя по тому, как меняется цвет атрибутов в Attribute Editor или Channel Box для объектов
с констрейнами, можно судить, на какие именно каналы воздействует тот или иной констрейн.
Взрослые мальчики могут также взглянуть на дерево зависимостей в Hypergraph - ц,пя понимания
того, как работают констрейны.
Очевидно, что если один констрейн ограничивает перемещения объекта (например Point
Constraint), а другой ограничивает вращения (например, Orient, Aim или Normal), их можно без
проблем применять к одному и тому же объекту. Наиболее часто используемые «пары»: Point +
Orient, Geometry + Normal. Однако если вы уже ограничили вращения объекта с помощью Aim
Constraint, вам не удастся также связать его повороты с любым из объектов с помощью Orient
Constraint: ведь один атрибут не может иметь две входящие связи в дереве зависимостей.
Всегда помните, на какие атрибуты объекта воздействует создаваемый вами констрейн.
Не пытайтесь дважды ограничивать одни и те же атрибуты.
Примечание. Любители общих случаев, возможно, захотят, тем не менее, связать
вращения объекта сразу двумя констрейнами, к примеру с помощью Aim Constraint
и Normal Constraint. В этом случае могу посоветовать сделать две копии объекта.
Первую ограничить с помощью Aim Constraint, вторую - с помощью Normal
Constraint. Потом выбрать обе копии, затем сам объект и привязать его вращения
к копиям с помощью Orient Constraint. Таким образом, ориентация объекта будет
представлять собой среднее между поворотами двух его копий. С помощью
соответствующих весов вы даже сможете анимировать индивидуальное влияние
констрейнов Aim и Normal на ваш объект.
Следует особо отметить, что Geometry Constraint не воздействует напрямую на атрибуты
translate, поэтому его можно использовать совместно, например, с Point Constraint (или другими
способами анимации перемещений). В результате такого ограничения объект будет находиться
на поверхности (определяемой Geometry Constraint), притом в позиции, ближайшей к точке в
пространстве, задаваемой Point Constraint.
Удаление и добавление дополнительных управляющих объектов
В том случае, если объект находится под влиянием нескольких управляющих объектов и вы
хотите не просто устранить влияние одного из объектов, обнулив его вес, но и совсем удалить этот
управляющий объект из констреина, следует воспользоваться соответствующим пунктом меню:
Constrain=>Remove Target. Не забудьте сначала выбрать управляющий объект, а затем объект, на
который он влияет. Ведь один объект может «принимать участие» в разных констрейнах и влиять
на разные объекты.
Для добавления новых управляющих объектов нужно просто повторить процедуру создания
нужного типа констреина. MAYA сама разберется в том, что объект уже имеет констрейн такого
типа и добавит новые управляющие объекты к нему, вместо создания нового констреина этого же
типа.
Работа с весами.
Включение и выключение констрейнов.
Rest Position. Исходная позиция
Любой констрейн имеет атрибуты, отвечающие, насколько каждый из управляющих
объектов влияет на управляемый объект. Если управляющий объект один, изменение этого веса
не имеет большого смысла, кроме того случая, когда вес равен нулю.
Однако можно задать вопрос, а что будет происходить с объектом, когда веса всех
влияющих на него объектов равны нулю. В этом случае он не должен никак реагировать на
движения управляющих объектов и оставаться в покое. Предположим шляпа вашего персонажа
прикреплена к движущейся руке с помощью Point Constraint. Если вы проанимируете вес руки
600
Книга Сергея Цыпцына
№
так, что в некоторый момент он станет равным нулю, шляпа в этот момент «оцепится» от руки и
останется на месте. Иногда удобно точно задавать положение объекта, в которое он вернется,
когда веса всех влияющих на него объектов станут равными нулю. Такое положение называется
«исходной позицией» (Rest Position). Координаты такого положения задаются атрибутами Rest
Position, которые можно разыскать в Attribute Editor. Кроме того, если атрибут Enable Rest Position
включен, объект будет возвращаться в исходную позицию при обнулении весов всех влияющих на
него объектов; в противном же случае он просто будет замирать на месте в тот момент, когда веса
приняли нулевое значение.
Примечание. Все сказанное справедливо и для констрейнов, ограничивающих
вращение объекта. В этом случае под Rest Position понимается «исходная
ориентация».
Обнуление весов всех управляющих объектов не «выключает» выполнения работы
констрейна, а лишь изменяет его способ воздействия на объект. Если вы хотите совсем выключить
констрейн и избавить MAYA от необходимости все время вычислять позицию управляемого объекта,
то заблокируйте его, установив в Attribute Editor значение атрибута Node State=Blocking.
Примечание. Вы также можете одним махом заблокировать (или разблокировать)
работу всех констрейнов в сцене, выполнив: Modify=>Evaluate Nodes=>Constraints.
Констрейны как потенциальный источник циклов в дереве
зависимостей
Некоторые из пытливых умов (особенно любители динамики) наверняка сталкивались с
истеричными сообщениями MAYA о загадочных циклах.
// Warning: Cycle on 'pCube2.rotate' may not evaluate as expected.
// (Use 'cycleCheck -e off* to disable this warning.) //
Именно о них сейчас и пойдет речь. Проведите следующий простой эксперимент.
Создайте сферу и цилиндр.
Выберите сферу, затем цилиндр и создайте Point Constraint, привязывающий цилиндр к
сфере.
А теперь выполните операцию Edit=>Parent.
Коль скоро цилиндр был выбран вторым, он становится «родителем» сферы.
Теперь попробуйте перемещать сферу. Впечатляет?
Подумайте теперь, что же происходит? Вы перемещаете сферу, сфера тащит за собой
цилиндр, прикрепленный к ней с помощью Point Constraint. Однако цилиндр является родителем
для сферы и поэтому должен тащить за собой сферу, которая тащит цилиндр и т.д. Получается
замкнутый круг. Такой круг и трактуется AAAYA как цикл в дереве зависимостей.
При этом MAYA проявляет завидное терпение и старается не «упасть» от таких циклических
издевательств; она даже сообщает о наличии циклов в сцене с помощью замечания в Script
Editor:
// Warning: Cycle on <pCylinder1_pointConstraint1.target[0].targetParentMatrix, may not evaluate as
expected. (Use 'cycleCheck -e off' to disable this warning.) //
При появлении такого приговора следует внимательно пересмотреть связи между объектами
и атрибутами, чтобы выявить некорректные зависимости. В данном случае ответственность лежит
целиком на вас: ведь вы продумывали иерархию и связи между объектами. Поэтому при появлении
Констрейны
601
ПИША
такого сообщения в Script Editor при работе с констрейнами сразу проверьте взаимодействия
между объектами и логику влияния объектов друг на друга. Объект, указанный в сообщении,
помогает понять, в каком месте возник цикл.
И только в одном случае не стоит паниковать при появлении такого сообщения. При
использовании динамики твердых тел, после возвращения в первый кадр, MAYA весело сообщает о
наличии циклов. Не пугайтесь: так устроена динамика, а точнее - начальное положение твердого
тела. В этом случае можете просто игнорировать сообщение о циклах.
Пример использования констрейнов.
Конструирование карданной передачи
Как я уже упоминал, с помощью констрейнов можно собирать некоторые работающие
конструкции, который потом можно легко анимировать. В анимации персонажей констрейны
применяются для «навешивания» на модель управляющих объектов, облегчающих «руководство»
персонажем, а также для определения взаимодействий между различными частями персонажа. Об
этом можно подробнее прочитать в соответствующей главе, а сейчас я бы хотел привести пример
использования констрейнов для задач конструирования работающих механизмов, например, для
анимации карданной передачи.
Данный пример описывает «инженерный» подход к работе с констрейнами (его любезно
предоставил Володя Забелин). Использование констрейнов в данном случае весьма нетривиально,
но является практически единственным способом решить поставленную задачу. Не верите? Тогда
попробуйте решить ее по-другому.
Итак, надо передать вращение с одной оси на другую с помощью некоторой соединительной
конструкции. Задача состоит в том, чтобы анимировать только одну ось, а вращение второй оси
получалось бы автоматически. Причем ориентация осей друг относительно друга может задаваться
совершенно произвольно и тоже может быть проанимирована.
Откройте с диска сцену kardand .та. (Если вы «сняли» эту книжку в Интернете и у вас нет
диска, сделайте подобную конструкцию с помощью некоторого количества цилиндров).
В сцене имеется три объекта: два вала и крестовина. Наша задача - сделать так, чтобы красный
вал передавал свое вращение вокруг продольной оси синему валу через крестовину. Активным
объектом в сцене является красный вал, его анимация и взаимное расположение с синим валом
определяют движение всех остальных объектов.
Прежде всего, стоит соединить оба вала в центре с помощью Point Constraint. Нетрудно
заметить, что пивоты обоих валов находятся в начале координат. Это сделано для того, чтобы
обеспечивать их корректную ориентацию друг относительно друга.
602
Книга Сергея Цыпцына
Выберите красный вал, затем синий и выполните Constrain=>Point. Ничего особенно на
экрание не произойдет, но при попытке подвигать красный вал, синий будет двигаться вместе с
ним.
Не забывайте про Undo.
Теперь создадим способ управления взаимным расположением валов. Коль скоро они
должны уметь сгибаться друг относительно друга, самым удобным способом будет создание двух
локаторов и нацеливание каждого из валов на «свой» локатор.
Создайте два локатора (Create=>Locator).
Растащите их в стороны по оси X, чтобы они располагались позади валов.
Назовите один их них LocRed, а второй LocBlue.
Те, кто различает цвета на экране, могут для удобства поменять цвет локаторов на
красный и синий, соответственно. Для этого достаточно выбрать локатор, открыть Attribute Editor
и в первой закладке (можно и во второй) найти раздел Display=>Drawing Overrides.
В нем следует включить галку Enable Overrides и с помощью слайдера Color выбрать нужный
цвет.
Далее я буду ссылаться на красный локатор (LocRed) и синий локатор (LocBlue).
Сориентируем оба вала, так чтобы они смотрели своей продольной осью на локаторы.
Констрейны
603
Выберите красный локатор, затем красный вал.
Выполните Constrain=>Aim.
Сдвиньте локатор вверх и убедитесь, что вал «смотрит» на него своей продольной осью.
(Неплохо также помнить, что продольная ось - это локальная ось X для вала).
Теперь выберите синий локатор, затем синий вал.
Выполните Constrain=>Aim.
Синий вал мгновенно развернется так, чтобы «смотреть» на локатор своей продольной
осью, однако как бы «задом-наперед».
Это связано с тем, что локальная ось X (используемая по умолчанию для задания
направления внутри объекта, «которым» надо смотреть на цель) для синего вала направлена в
стороны «скобы», а не в сторону шестеренки. Вместо того, чтобы разворачивать локальную ось,
отредактируем атрибуты созданного констрейна.
Выберите синий вал, откройте Attribute Editor.
Перейдите в закладку VAL2_aimConstraint1 и в разделе Aim Constrain Attributes задайте Aim
Vector =(-1, 0,0).
Это означает, что синий вал должен смотреть на цель (aim) направлением, противоположным
локальной оси X.
После этого синий вал развернется к своему локатору шестеренкой.
Сдвиньте синий локатор вверх и убедитесь, что вал «смотрит» на него своей продольной
осью.
Сохраните сцену (kardan02.ma).
604
Книга Сергея Цыпцына
После того, как мы развернули оба вала с помощью констрейнов, может возникнуть
резонный вопрос, а как будет крутиться красный вал, если на атрибутах вращений у него «висит»
Aim-констрейн? И как он будет передавать свое вращение синему валу, если вращения последнего
тоже зависят от Aim-констрейна?
Будем решать проблемы по порядку. Красный вал «следит» за своим локатором с помощью
поворотов вокруг локальных осей Y и Z, а вращение вокруг продольной оси X определяет лишь его
поворот вокруг направления слежения. Никто не мешает нам разорвать связь между констреином
и атрибутом rotateX для красного вала. Это можно сделать вручную (такой способ нравится мне
гораздо больше, как олицетворение демократических свобод при работе с AAAYA) или «официально»,
через меню.
Через меню это можно сделать следующим образом:
Выберите красный вал и выполните Constrain=>Modify Constrained Axis...
Появится Option Box, предлагающий отметить только те оси, которые будут зависеть от
констрейна.
Снимите галку с оси X и нажмите Apply.
Убедитесь, что на атрибуте rotateX красного вала никто не «висит»: его цвет в Channel Box
или Attribute Editor должен быть белым.
Примечание. Такой способ опасен тем, что если на выбранном объекте «висят»
несколько констрейнов, такая операция разорвет связь не только для атрибутов
rotate, но для остальных (translate или scale). Для того, чтобы «отцепить»
конкретный констрейн от какого-либо атрибута таким способом, надо
предварительно выбирать сам констрейн, а не объект. Это не всегда удобно.
Вручную «отцепить» констрейн от любого атрибута можно гораздо быстрее. Выберите
красный вал. Нажмите Undo, если вы только что разорвали связь между констреином и атрибутом
rotateX. Затем в Attribute Editor, в первой закладке, нажмите правую кнопку мыши над атрибутом
rotateX и в появившемся меню выберите Break Connection (разорвать связь).
Констрейны
605
Чтобы убедиться, что красный вал может свободно вращаться вокруг продольной оси,
закрутим его, не прибегая к помощи ключей.
В Attribute Editor впишите в клетку для rotateX следующую формулу:
=frame*3
и нажмите Enter.
Как нетрудно догадаться, в результате этих заклинаний создается expression, равномерно
вращающий красный вал вокруг оси X.
Займемся теперь передачей вращения от красного к синему валу. Воспользуемся тем, что
для Aim Constraint можно задавать не только вектор «прицеливания», но и направление «вверх»,
вдоль которого должна смотреть одна из «поперечных» осей синего вала.
Идея проста: если продольная ось X синего вала смотрит в центр красного вала, то
поперечная ось (например, Y) должна смотреть на отверстие в скобе красного вала.
Выберите синий вал, разыщите Attribute Editor закладку VAL2_aimConstraint1.
Вместо ориентации «наверх» выберите разворот в сторону дополнительного объект,
установив World Up Type=Object Up.
Далее возникает вопрос, а в сторону какого объекта разворачивать поперечную ось Y
синего вала? Быстро создаем локатор и помещаем его в центр отверстия на скобе красного вала.
606
Книга Сергея Цыпцына
Назовите этот локатор UpLoc.
Затем выберите снова синий вал и в закладке VAL2_aimConstraint1 впишите в поле World
Up Object строку UpLoc.
VAL2 | VALShape2 | VAL2_pointCon$tfaint1 VAL2_aimConstraint1 j |ambeft31
Теперь синий вал развернется своей «поперечной» осью Y в направлении локатора
UpLoc. Чтобы убедиться в этом окончательно, а заодно заставить локатор UpLoc вращаться вместе
с красным валом, перетащите этот локатор в OutUner средней кнопкой мыши и «бросьте» его на
красный вал VAL1.
Это сделает красный вал «родителем» для локатора UpLoc.
Констрейны
607
Проиграв анимацию, можете убедиться, что валы вращаются согласованно. Особенно это
заметно, если спрятать крестовину, которой, впрочем, мы сейчас и займемся.
Сохраните сцену (kardan03.ma).
Первое, что нужно сделать, это прибить крестовину к центру соединения, а точнее к
красному валу с помощью Point Constrain.
Выберите красный вал, затем крестовину и выполните Constrain=>Point.
Теперь надо развернуть крестовину так, чтобы она смотрела одной осью в направлении
отверстия на скобе красного вала, а второй осью на отверстие на скобе синего.
Локатор в отверстии скобы красного вала уже имеется, поэтому выберите его (UpLoc), затем
крестовину и выполните Constrain=>Aim.
Крестовина развернется в сторону локатора, но не осью, а «плоскостью». Очевидно, надо
установить локальную ось для «прицеливания» в атрибутах констрейна.
Выберите крестовину.
В Attribute Editor, в закладке krestovina_aimConstraint1, задайте Aim Vector = (0, 0, 1), чтобы
крестовина развернулась с сторону локатора UpLoc своей локальной осью Z.
Для разворота второй оси крестовины, воспользуемся тем же трюком, что и для ориентации
синего вала. Создайте еще один локатор. Назовите его DownLoc. Переместите его в центр отверстия
скобы синего локатора.
608
Книга Сергея Цыпцына
Не забудьте также «припарентить» его к синему валу, перетащив его средней кнопкой
мыши в нужное место в Outliner.
Выберите крестовину, в Attribute Editor перейдите в закладку VAL2_aimConstraint1 и
сначала измените тип ориентации Word Up Type=Object Up.
Впишите имя DownLoc в поле World Up Object.
После этого крестовина развернется своей второй осью - локальной осью Y, указанной в
атрибуте Up Vector как (0,1,0) - в сторону локатора DownLoc.
Проиграйте анимацию. Измените взаимное расположение локаторов.
Сохраните сцену как kardanFinal.ma.
Подумайте: как бы вы смогли выкрутиться в данной ситуации без помощи констрейнов?..
Констрейны
609
Процедурная анимация.
В этом разделе речь пойдет еще об одних «посредниках» между объектом и временем.
Они называются expressions и предназначены для использования процедурной анимации. Когда
вы слышите модное выражение «процедурная анимация», не пугайтесь, ведь речь идет всего
лишь о том, что объект анимируется не по ключам, а с помощью формул, как правило весьма
незамысловатых, но довольно полезных.
Терминологический комментарий. Во избежание полной путаницы, я не буду употреблять
для expression термин «выражение». Тем более, что в русскоязычной майской среде никто
и никогда так не говорит, а если вы вдруг заявите, что заставили своего персонажа работать
с помощью «выражений», то окружающие подумают в первую очередь о крепких выражениях.
... Устная майская традиция предполагает употребление термина «экспрешен», обеспечивая
стопроцентную однозначность трактовки. Я же ограничусь непереведенным написанием
«expression» (так же, как loft или trim), предполагая, что произносить вы его будете, как положено, так
что все вас поймут при общении.
Формулы для expression пишутся на языке MEL. Вы можете прочитать обсуждение синтаксиса
и правил написания кода на MEL в соответствующей главе. В этом же разделе я сосредоточусь на
практическом аспекте использования различных expressions и возможных вариантах их применения.
А также на том, каким образом они взаимодействуют с объектом. Дополнительную информацию о
«внутренностях» expressions и об их реализации в дереве зависимостей майской сцены вы можете
почерпнуть из главы про изнанку MAYA.
Напомню: главная концепция анимации в MAYA основана на том, что анимируются не сами
объекты, а их атрибуты. Поэтому среди прочих связей на атрибутах объекта могут «висеть»
expressions, определяющие процедурную анимацию объекта.
Среди всевозможных вариантов использования expressions можно выделить два основных типа.
К первому относятся expressions, связывающие атрибуты объекта со временем. Например:
pTorusI .rotateX=noise(time)
Такие expressions - явные «посредники» между временем и атрибутами объекта, задавая
вместо анимационной кривой формулу, по которой будет меняться тот или иной атрибут. Такие
формулы задают «бесконечное» движение и применяются в тех случаях, когда не обязательно
устанавливать точное состояние объекта в определенном кадре, а надо лишь задать характер
или тип движения. Например «хаотическая тряска» или «движение по спирали». Задавать
беспорядочное движение в диапазоне из пятисот кадров с помощью сотни-другой ключей - занятие
довольно утомительное, а вот посредством expressions такая задача решается моментально.
Этот тип expressions часто используется для задания вторичных движений: например,
дыхание персонажа, покачивание хвоста, бегающие зрачки и пр. Такую анимацию еще называют
«амбиентной» (то есть неявной или вторичной).
Второй тип expressions задает связь атрибутов объекта не со временем, а с атрибутами
других объектов. Например:
pTorusl.rotateX = pTorusl.translateZ * 180/3.1415926/(polyTorus1.radius + polyTorusl.sectionRadius);
В этом случае expressions выступают в роли обобщенных констрейнов, не создавая
непосредственно анимацию, а согласовывая атрибуты различных объектов. Этот тип expressions
используется для «конструирования» взаимодействий между объектами. Он часто используется
для автоматического преобразования одного типа движения в другой (например, перемещения во
вращение), вычисления средних значений и пр.
610
Книга Сергея Цыпцына
крепкие выражения. Expressions
Существует еще масса примеров использования expressions, не попадающих ни в один из
двух перечисленных типов (например, Particle Expressions), однако я сосредоточусь именно на
традиционном применении expressions, как одном из способов анимации атрибутов объекта.
Порядок создания expressions
Есть много способов создать expression для выбранного атрибута, однако на первых порах
я советую придерживаться идеи о том, что expressions «висят» на атрибутах, подобно остальным
типам анимации.
Поэтому, чтобы создать новый expression, надо сначала продумать, каким атрибутом (или
атрибутами) объекта он будет управлять, затем выделить этот атрибут в Channel Box (или разыскать
в Attribute Editor) и, нажав правую кнопку мыши, выбрать в контекстном меню пункт Expressions.
После этого появится специальное окно для работы с expressions, называемое, как ни
странно, по-простому: Expression Editor. В центральное тестовое поле Expressions следует ввести
текст магической формулы и нажать кнопку Create. Если формула на языке MEL введена без
ошибок (с точки зрения MAYA, а не с вашей точки зрения), то expression будет успешно создан и
кнопка Create превратится в кнопку Edit (это основной индикатор успеха). В противном случае
MAYA бесстрастно ругнется, сообщая об ошибке (не прячьте Command Line с экрана!), а вы должны
будете отыскать эту ошибку в написании своей формулы, исправить ее и снова нажать Create. И
так далее.
Атрибуты, управляемые с помощью expressions, отображаются в Channel Box или Attribute
Editor фиолетовым цветом. Чтобы «добраться» до этих expressions следует опять выделить нужные
атрибуты в Channel Box и в контекстном меню выбрать пункт Expressions, открывающий Expression
Editor с уже загруженными формулами.
Примечание. Один из моих самых любимых и быстрых способов создания несложных
expressions заключается в следующем. Отыскав нужный атрибут в Attribute Editor,
следует ввести знак «равно» (=) в поле атрибута, а затем ввести текст формулы
expression, после чего нажать Enter. Конечно в случае ошибки, придется набирать
все заново, однако удовольствие наблюдать, как после ввода «=» внезапно
разъезжается числовое поле атрибута, стоит того.
Констрейны
611
Синтаксис expressions
Основные правила синтаксиса для написания скриптов и expressions изложены в главе,
посвященной MEL-программированию. Здесь я лишь сформулирую простейшие принципы
составления expressions, позволяющие писать довольно эффективные формулы.
Прежде всего, вы должны помнить, что полное имя атрибута состоит из имени объекта,
соединенного точкой с именем атрибута. Например:
pTorusl.rotateX
Регистр букв исключительно важен. pTorusI и PTorusI - это разные объекты, а атрибута
rotatex Maya по умолчанию не знает (вы можете сделать его сами).
Для ленивых пользователей были дополнительно придуманы короткие имена атрибутов,
чтобы сэкономить силы при наборе формул на MEL. pTorusl.rotateX и pTorusl.rx - это один и тот
же атрибут. Коротких имен для объектов, как ни прискорбно, не может быть в принципе.
Совет. Посмотреть короткие имена атрибутов можно в Channel Box. Для этого в
контекстном меню достаточно выбрать Channel Names=>Short.
612
Книга Сергея Цыпцына
Также я советую раз и навсегда включить отображение длинных (Long) имен атрибутов в
Channel Box. По непонятной мне причине, по умолчанию включен режим отображения «красивых»
(Nice) имен, и это явно дезинформирует пользователя относительно правильного написания
названий атрибутов. В этом режиме в именах атрибутов появляются пробелы и все имена
начинаются с большой буквы, что не соответствует истине.
Зная имена атрибутов, вы можете складывать, вычитать, перемножать и делить
значения этих атрибутов с помощью общепринятых знаков. Использование скобок и наиболее
употребительных функций типа rand, noise, sin и cos не должно вызвать у вас затруднений.
Нижеследующие примеры должны развеять страх перед написанием несложных формул.
Единственное, о чем стоит помнить всегда, это то, что в конце каждой строки, (а точнее в
конце каждой MEL-команды) необходимо ставить точку с запятой.
pCubel .tx=(pTorus1 .tx+ pTorus2.tx)/2;
pCubel .tz=(pTorus1 .tz+ pTorus2.tz)/2;
Если в одной строчке не помещается вся команда, можно без проблем перенести ее на
другую строчку.
pCubel .ty=(pTorus1 .ty+pTorus2.ty+pTorus3.ty
+pTorus4.ty+pTorus5.ty)/5.0;
Следует лишь помнить: точка с запятой отделяет одну команду от другой.
По поводу работы с переменными вы можете подробнее прочесть в главе про MEL, здесь
я лишь отмечу, что результаты любых вычислений (обычно промежуточных) могут храниться в
переменных, имена которых начинаются со знака $.
$rot = pCubel. ry/180*3.14;
pCube2.ry = sin($rot);
Кроме того, специально для использования в expressions имеются две специальные
переменные для работы со временем. Они называются time и frame и обозначают текущее время
в секундах и в кадрах, соответственно.
В этой главе нам еще понадобятся условные операторы, но их использование я
проиллюстрирую на конкретных примерах.
Прежде чем перейти к практическим примерам использования expressions, я немного
остановлюсь на разнице между expressions и скриптами, о которых все, без сомнения, наслышаны.
И те и другие пишутся на языке MEL, но служат несколько разным целям.
Разница между скриптами и expressions.
Порядок выполнения expressions
Майский скрипт - это набор команд на языке MEL, который выполняется по вашему
требованию, то есть когда вы сами его запустите. Хранится он, как правило, на диске в виде
текстового файла и не является частью сцены.
Expression - это тоже набор команд. Но во-первых, эти команды хранятся в виде объекта
и являются частью сцены, то есть хранятся внутри нее. А во-вторых, эти команды выполняются
не по вашему желанию, а, вообще говоря, при смене номера кадра при анимации. Каждый раз,
когда происходит переход к следующему кадру (или когда вы в очередной раз неловко ткнули
мышкой в TimeLine), выполняются все незаблокированные expressions, присутствующие в сцене.
Также выполнение expressions происходит с том случае, когда один из объектов, чьи атрибуты
используются в expression, изменяет значение этих атрибутов.
Таким образом, если вы проиграли двести кадров анимации, все expressions, созданные
Констрейны
613
в сцене, выполнятся по двести раз. Поэтому expressions используются, как правило, не для
интенсивных расчетов и вычислений, а для задания логических связей между объектами (точнее
говоря, между атрибутами объектов).
Примеры использования expressions. Часы
Разберем пример использования expressions для «явной» анимации, то есть для
установления прямой зависимости между атрибутом объекта и временем.
Изготовьте в новой сцене стрелку часов.
Расположите ее так, чтобы центр вращения находился в начале координат и вращение
стрелки происходило вокруг оси Z.
Назовите стрелку sec, ибо она будет отсчитывать секунды.
Если это слишком сложно или скучно, откройте файл clock.та.
Выделите в Channel Box атрибут rotateZ и в контекстном меню выполните пункт
Expressions. В появившемся окне Expression Editor введите простую формулу
rz = time*6;
Нажмите кнопку Create.
Если в строке из десяти символов вы допустили ошибку, то кнопка Create не превратится
в кнопку Edit, и вам придется хорошенько сосредоточиться, чтобы найти ошибку. В противном
случае проиграйте анимацию и подумайте о сути формулы.
614
Книга Сергея Цыпцына
Переменная time содержит время в секундах для текущего кадра. Соответственно, через
одну секунду после начала анимации (то есть в двадцать пятом кадре), значение time будет равно
единице. За одну секунду секундная стрелка должна повернуться на шесть градусов (360 градусов
разделить на 60 секунд равно 6). Поэтому, чтобы задать значение атрибута rotateZ в градусах, мы
умножили время в секундах на 6.
Примечание. В данном случае имя объекта можно было не писать перед именем
атрибута. Об этом я скажу чуть позже.
Очевидно, для того, чтобы стрелка поворачивалась в другую сторону, следует добавить знак
минус. Кроме того, зададим «дискретное» вращение стрелки, чтобы она скачком поворачивалась
в новое положение только в тех кадрах, где значение времени равно «целым» секундам. Очевидно
для этого нужно взять целую часть числа, содержащего время в секундах, то есть целую часть
переменной time.
Если вы закрыли Expression Editor, доберитесь до него снова, выделив rotateZ в Channel
Box и вызвав пункт Expressions.
Примечание. Возможно, вы удивитесь, увидев, что ваша формула неузнаваемо
изменилась. Если нет, нажмите кнопку Reload, и вы увидите, что MAYA
автоматически преобразует короткие имена атрибутов в длинные и добавляет
к ним имена соответствующих объектов. Для того, чтобы изменить такое
поведение, необходимо исправить некоторое количество стандартных майских
скриптов. Однако обсуждение этого процесса выходит за рамки данной главы.
Исправьте формулу следующим образом:
sec. rotateZ = -int(time)*6;
Нажмите кнопку Edit.
Теперь стрелка вращается ежесекундными рывками.
Установите диапазон анимации в 90 000 кадров - ведь если 3600 секунд (то бишь 1 час)
умножить на 25 кадров, это аккурат 90 000 кадров.
В настройках анимации задайте Playback Speed=Real-time(25 fps), чтобы наблюдать
реальное время на экране.
Запустите анимацию, посидите, отдохните, подумайте о вечном, глядя на кончик секундной
стрелки...
Вернитесь в нулевой кадр и скопируйте объект sec, изготовив таким образом минутную
стрелку. Назовите ее min и немного подредактируйте ее позицию и форму.
Констрейны
615
Минутная стрелка должна вращаться в 60 раз медленнее секундной. Поэтому expression
для вращения будет вызывающе прост.
Выделите в Channel Box атрибут rotateZ и вызовите Expression Editor.
Введите формулу:
min.rz=sec.rz/60;
Нажмите Create.
«Повозите» мышкой по временной линейке, убедитесь, что стрелки вращаются
согласованно. Сделайте еще одну стрелку, часовую.
Назовите ее hour.
Она должна вращаться в двенадцать раз медленнее минутной, поэтому expression для нее
будет выглядеть следующим образом:
hour.rz=min.rz/12;
Теперь вы имеете процедурно анимированные часы. Скорость вращения соответствует
сейчас реальному течению мирового времени. Однако для создания нереалистичных эффектов
хотелось бы иметь атрибут, управляющий скоростью вращения стрелок. Коль скоро основной у
нас является секундная стрелка, добавим атрибут к ней.
Выберите объект sec и выполните Modify=>Add Attribute.
Назовите новый атрибут speed, задайте Minimum=-10, Maximum=10, Default=1.
Нажмите ОК.
Теперь снова выделите атрибут rotateZ в Channel Box и откройте Expression Editor. Исправьте
формулу для секундной стрелки:
616
Книга Сергея Цыпцына
sec.rotateZ = -int(time)*6*sec.speed;
Запустите анимацию и попробуйте менять атрибут speed.
Таким образом, вы получили контроль над скоростью хода часов.
Для того, чтобы останавливать часы или, наоборот, заставлять их вращаться с бешенной
скоростью, вы можете ставить ключи на атрибут speed секундной стрелки.
Для того, чтобы получить вконец обезумевшие часы и остаться в рамках процедурного
подхода, выделите атрибут speed в Channel Box, вызовите Expression Editor и введите формулу:
sec.speed = noise(time)*10;
Это заставит меняться скорость вращения беспорядочным образом в диапазоне от 10 до
минус 10. Если вы захотите замедлить (или ускорить) стремительность таких изменений, введите
в формулу дополнительный коэффициент:
sec.speed = noise(time*0.5)*10;
Приручение Expression Editor
Некоторые из вас, наверное, уже столкнулись с некоторыми «бестактностями» в поведении
Expression Editor. Если вы, печатая свою магическую формулу, вдруг решили на секундочку выбрать
другой объект, чтобы, например, проверить значения его атрибутов, все ваши «печатные труды»
тут же исчезнут! Чтобы сохранить свои нервы, напечатанный текст, а заодно призвать к порядку
Expression Editor, следует знать о двух режимах работы с ним.
По умолчанию включен первый режим, когда в Expression Editor отображаются
expressions только для выбранного объекта. Поэтому при случайном щелчке мыши в окне камеры весь
введенный текст пропадает.
Второй, более гуманный (на мой взгляд) режим, отображает в окне Expression Editor все
имеющиеся в текущей сцене expressions.
Эти режимы переключаются в меню Expression Editor с помощью пунктов Select Filter=>By
Object Name и Select Filter=>By Expression Name, соответственно.
Два этих режима отражают два идеологических подхода к expressions. Первый рассматривает
expressions как, например, анимационные кривые, которые жестко закреплены за определенными
атрибутами и рассматриваются только вместе с объектом. В этом режиме, чтобы увидеть код
нужного expression, недостаточно выбрать объект: надо дополнительно в окне Expression
Editor выбрать атрибут объекта, на который этот expression влияет. В этом режиме весьма полезно
ограничить отображение в Expression Editor только тех атрибутов, для которых уже созданы
expressions. Это можно сделать в меню Expression Editor, выбрав Attribute Filter=>Connected to Expressions.
Заметьте также, что в меню Object Filter также существуют разные варианты, «фильтрующие»
отображение в списке Objects объектов тех или иных типов.
Констрейны
617
Здесь, наверное, стоит уточнить, что значит «expression влияет на атрибут». Неформально
выражаясь, в этом случае expression «висит» на атрибуте. Формально говоря, в дереве зависимостей
атрибут имеет входящую связь, приходящую к нему от expression. А с точки зрения написания
формул это означает, что в коде expression встречается выражение типа "object.attr= ...", в
котором имя атрибута стоит в левой части оператора присваивания. Как вы понимаете, в одном
expression может встречаться несколько таких выражений для разных атрибутов. Все они создают
связь одного expression с этими атрибутами.
Второй режим идеологически предполагает, что вы рассматриваете expressions как
самостоятельные объекты сцены, выполняющие определенные действия. В этом режиме вы
можете видеть в верхней части окна Expression Editor список всех expressions, уже имеющихся
в текущей сцене (включая предназначенные для частиц). Вы можете не бояться, что код
expression пропадет при случайном выборе объекта и спокойно редактировать любой expression, просто
выбирая его из списка. Не забывайте при этом нажимать кнопку Edit: она сохраняет результаты
вашего редактирования, и ее действие аналогично традиционной операции Save. Кнопка Reload
возвращает вас к последнему сохраненному варианту кода. Помните о том, что после того, как
вы изменили код expression, ваша сцена изменилась, и ее нужно будет сохранить для сохранения
нового варианта expression.
/1ично мне ближе второй режим работы: как бывший программист, я оперирую с
expressions как с самостоятельными, а не с вспомогательными объектами. Однако с точки зрения общей
идеологии MAYA, возможно, более последовательным будет использование первого режима.
Совет. Если вы хотите избежать пропадания всего набранного текста
expression при случайной смене выбранного объекта, тогда либо включите режим Select
Filter=>By Expression Name, либо в меню Object Filter выберите любой вариант,
кроме Selected Objects - например, Transforms. Сделайте это при первом же
открытии Expression Editor после запуска MAYA. Если вы хотите сделать эти
режимы задаваемыми по умолчанию, сделайте так, чтобы соответствующие
этим действиям команды EEselectFilterCB expression; или EEobjFilterCB
transforms; выполнялись автоматически при открытии MAYA. О том, как это сделать,
читайте в главе, посвященной MEL.
Заметьте также, что MAYA достаточно «интеллектуальна», чтобы отслеживать изменившиеся
имена объектов. Если вы переименуете любой из объектов, «участвующих» в expression, то MAYA
автоматически изменит текст этого expression, заменяя старое имя объекта на новое.
Совет. Если число expressions в вашей сцене превышает три, хорошо завести привычку
переименовывать их сразу после успешного их создания. Это можно быстро сделать в
Expression Editor. В имени expression можно отразить, что именно он делает и для чего
предназначен. Позднее гораздо проще будет выбирать нужные expressions из списка,
чем просматривать их все, пытаясь найти нужные команды.
Вы можете также обнаружить в Expression Editor загадочное поле Default Object, в котором,
как правило, содержится имя выбранного объекта (особенно, если вы открываете Expression Editor
через Channel Box). Это поле предназначено для суперленивых создателей expression и для тех,
кто совершенно не умеет набирать тексты на клавиатуре. Для того объекта, чье имя содержится
в этом поле, можно писать в тексте набираемого expression не полное имя атрибута, включающее
имя объекта, а лишь имя самого атрибута. Например, если в поле Default Object содержится имя
объекта pTorusI, вы можете написать просто:
ty = noise(time);
При этом после нажатия кнопки Edit MAYA сама добавит имя объекта к короткому имени
атрибута и превратит этот текст в следующую формулу:
pTorusl.translateY = noise(time);
Также для ленивых (и любопытных) пользователей предназначено меню Insert Functions
в окне Expression Editor. Оно позволяет вставлять имена различных полезных функций в то место
618
Книга Сергея Цыпцына
№
текста, где находится курсор. Такие действия, естественно, не освобождают от необходимости
знать, что делают эти полезные функции.
Кнопка Delete удаляет expression как объект сцены. Помните о том, что если вы выполняете
операцию Break Connection в контекстном меню Channel Box, вы лишь разрываете связь между
атрибутом объекта и expression, не удаляя последнего.
Примечание. Предположим, вы собираетесь проанимировать два объекта с
помощью expressions.
Для этого вы можете создать один expression, в котором будет описана анимация обоих
объектов, например:
pTorusl.translateY = noise(time);
pCubel.translateY = sin(time);
Однако, если следовать по иному пути, а именно выделять атрибуты в Channel Box и
создавать индивидуальные expressions для каждого объекта, вы можете получить два отдельных
expression, каждый из которых описывает анимацию только одного объекта. Какой способ лучше?
С точки зрения производительности, наверное, первый, хотя вряд ли вам когда-нибудь удастся
заметить разницу. Идеологически, возможно, корректнее второй способ, когда каждый объект,
связан только со своей процедурной анимацией. Однако редактировать формулы будет быстрее
и удобнее в общем expression, то есть первым способом. Таким образом, нельзя сказать, какой
способ лучше - это дело вкуса. Результат будет совершенно одинаковым в обоих случаях.
Примеры использования expressions. Телескопическая антенна
Разберем пример применения expressions для анимации различных «выдвигающихся»
конструкций, типа телескопа. Использование expressions в этом случае едва ли не единственный
способ решить поставленную задачу. Никакими констреинами или операцией Set Driven Key не
удастся добиться выполнения массы логических условий, типа «если одно звено выдвинулось на
определенное расстояние, то вслед за ним начинает двигаться следующее звено». С помощью
логических операторов языка MEL эти «вполне человеческие» требования легко программируются
в виде expressions.
Итак, создайте в новой сцене два цилиндра и один локатор.
Поднимите локатор повыше, а один из цилиндров также приподнимите немного и сделайте
его радиус немного поменьше другого (не меняя высоты цилиндра).
Самые ленивые пользователи могут открыть сцену telescope_start.ma.
Назовите локатор end, верхний цилиндр - р1, нижний - р2. Помните, что MAYA чувствительна
к маленьким и большим буквам.
Констрейны
619
Идея состоит в следующем: если верхний цилиндр (р1) в результате вертикального
перемещения «высовывается» из нижнего (р2) полностью, нижний цилиндр должен последовать
за верхним. Если же верхний цилиндр «входит» обратно в нижний, последний должен перестать
двигаться. Представьте себе телескопическую антенну, и вы поймете, о чем идет речь.
Напишем expression для нижнего (подчиненного) цилиндра.
Выберите р2 и откройте Expression Editor.
Введите следующий текст:
if(p1.ty-p2.ty>2) p2.ty=p1.ty-2;
Нажмите Create и сразу установите в меню Expression Editor режим Select Filter=>By
Expression Name.
На «человеческом языке» это читается так: если расстояние по вертикали между первым
и вторым цилиндром больше двух, переместить второй цилиндр точно на две единицы ниже
первого.
В скобках стоит логическое выражение, а все, что идет после скобок, относится к тому
случаю, когда это выражение логически выполняется.
Если быть совершенно аккуратным, то последний оператор присваивания надо заключить
в фигурные скобки, ибо только он относится к логическому выражению (просто в случае наличия
всего одной команды после логического оператора if, ставить скобки не обязательно).
Поэтому для улучшения читаемости нажмите Reload и исправьте текст следующим
образом.
if(p1.translateY-p2.translateY>2) { p2.translateY=p1.translateY-2; }
Некоторые из вас, наверное, заметили, что MAYA самостоятельно «перегрузила» наш
expression в «длинную» форму. Меня такое поведение регулярно бесит, однако что поделаешь - пока
что приходится мириться с этакой бестактностью.
Перемещайте верхний цилиндр по вертикали.
Теперь нижний следует за ним, если расстояние между цилиндрами превышает 2. Однако
это работает лишь при движении цилиндра р1 вверх. Добавим в наш expression еще одну строку:
if(p1.translateY - p2.translateY > 2) { p2.translateY=p1.translateY-2;}
if(p1.translateY - p2.translateY <-2) { p2.translateY=p1.translateY+2; }
Дополнительная строчка говорит о том, что если первый цилиндр опустился ниже второго
больше чем на две единицы, второй должен быть перемещен точно над первым на расстоянии
двух единиц.
Не забывайте нажимать кнопку Edit после каждого исправления текста!
Примечание. Взрослые мальчики, конечно, могут тут же начать оптимизировать
код с помощью функций abs() (абсолютная величина) или sign() (знак выражения),
однако «читабельность» команд от этого испортится, а оптимизация коснется
только количества знаков в тексте.
Теперь нижний цилиндр послушно следует за верхним и вниз и вверх.
В принципе, задача решена и пытливые умы быстро сообразят, как написать дополнительные
expressions для добавочных цилиндров. Я лишь добавлю «марафет» и прокомментирую некоторые
моменты.
Высота обоих цилиндров равна двум. Отсюда и взялось число 2 в наших формулах.
Если цилиндры отмасштабировать, приведенные формулы перестанут правильно работать.
Отредактируем их так, чтобы они отражали масштаб цилиндров по вертикали:
$scale=p1 .scaleY+p2.scaleY;
620
Книга Сергея Цыпцына
if(p1.translateY-p2.translateY>$scale) { p2.translateY=p1.translateY-$scale; }
if(p1.translateY-p2.translateY<-$scale) { p2.translateY=p1.translateY+$scale; }
Чтобы не писать каждый раз сумму масштабов цилиндров (вместо двойки), я запомнил ее
в переменную $scale и подставил ее вместо двойки. Теперь перемещение цилиндров согласуется
с их размером.
Немного «почистим» сцену.
Наши цилиндры должны перемещаться только по вертикали и могут менять размер.
Потому выберите оба цилиндра, выделите в Channel Box все атрибуты, кроме translateY и
scaleXYZ, и сначала заблокируйте их (Lock Selected), а затем спрячьте от греха подальше, то есть
удалите из Channel Box (Hide Selected).
Посмотрим, как можно быстро добавить несколько звеньев в наш телескоп и при этом
затратить минимум энергии на создание и редактирование новых expressions.
Сначала выделите все уже отлаженные команды в Expression Editor и скопируйте их в
буфер обмена (Ctrl-c).
Выберите цилиндр р2 и сдублируйте его с помощью операции Edit=>Duplicate.
Появится новый цилиндр - с именем рЗ.
Откройте Expression Editor и нажмите кнопку New Expression.
Вставьте скопированный текст (Ctrl-v) в поле Expressions: .
Теперь его надо исправить так, чтобы он устанавливал зависимость третьего цилиндра от
второго. То есть имя р2 надо исправить на рЗ, а имя р1 - на р2.
$scale=p2.scaleY+p3. scaleY;
if(p2.translateY-p3.translateY>$scale) { p3.translateY=p2.translateY-$scale; }
if(p2.translateY-p3.translateY<-$scale) { p3.translateY=p2.translateY+$scale; }
Если вы проделали эту кропотливую процедуру правильно, третий цилиндр будет двигаться
за вторым, точно так же, как второй за третьим.
Теперь цилиндры двигаются как система вложенных поршней, и управляющим является
первый цилиндр. Если такая модель вас устраивает, сохраните файл (telescope_v1.ma) и далее
можете ограничиться только чтением.
Дело в том, что владельцы раритетных ныне транзисторных радиоприемников справедливо
заметят, что в телескопической антенне цилиндры складываются «все вместе», как матрешки, в
один цилиндр у основания и выдвигаются из него по очереди. Что ж, исправим текущие формулы,
дабы достичь глобального консенсуса с радиолюбителями.
Выберите в Expression Editor по очереди оба expressions и исправьте их текст следующим
образом:
$scale=p1 .scaleY+p2. scaleY;
if(p1.translate Y-p2.translateY>$scale) { p2.translateY=p1.translateY-$scale; }
if(p1.translateY-p2.translateY<0) { p2.translateY=p1.translateY; }
$scale=p2.scaleY+p3.scaleY;
if(p2.translateY-p3.translateY>$scale) { p3.translateY=p2.translateY-$scale; }
if(p2.translateY-p3.translateY<0) { p3.translateY=p2.translateY; }
Теперь второй логический оператор проверяет, не опустился ли верхний цилиндр ниже
Констрейны
621
нижнего, и если да, то «прицепляет» нижний к верхнему.
Сохраните сцену (telescope_v2.ma).
Если вам захочется покрутить антенну или прикрепить ее к радиоприемнику, то, очевидно,
лучше всего объединить цилиндры в группу и ориентировать группу «хитрым» способом.
Выберите все три цилиндра, сгруппируйте их: Edit=>Group.
Перетащите пивот группы в основание нижнего цилиндра.
Чтобы ловко вращать антенну за конец или основание, воспользуемся констреинами.
Выберите сначала локатор, затем только что созданную группу и выполните Constrain=>Aim
Constraint.
Если параметры этой операции были заданы по умолчанию, цилиндры «лягут» на бок.
Чтобы направить их на локатор, найдите в Channel Box атрибуты объекта group1_aimConstraint1 и
задайте offsetZ= -90.
Подробнее про использование констрейнов читайте в соответствующем разделе.
Теперь вы можете ориентировать условную антенну, перемещая локатор и группу друг
относительно друга, а также вытягивать ее или сжимать, передвигая верхний цилиндр.
Сохраните сцену (telescope_final.ma).
Напоследок замечу, что в данном примере expressions предназначены для задания связи
между объектами, которую можно описать следующими словами: «если объекты расположены
так, то делать одно действие, а если эдак, то делать другое, в противном же случае - ничего не
делать!». Реализовать такую зависимость другими средствами (констреинами, Set Driven Key) было
бы очень и очень непросто, особенно логику типа «в противном же случае - ничего не делать».
Поэтому перед выбором подходящих средств для определения связей между объектами всегда
стоит хорошенько подумать о логике этих связей и, быть может, даже сначала описать эти связи
«человеческим» языком или в виде блок-схемы.
622
Книга Сергея Цыпцына
№
Общие принципы создания и использования expressions
После такого подробного и пошагового разбора примеров я хочу немного ускорить темп и
поговорить об общих принципах написания и применения expressions.
Прежде всего, следует постоянно помнить о том, что expressions - это объекты (точнее, ноды),
хранящиеся вместе со сценой. Вы всегда можете увидеть их в Hypergraph и там же «распутать»
или исследовать их связи с другими объектами.
Как я уже упоминал выше, можно отдельно выделить класс expressions, задающих явную
зависимость атрибутов объектов от времени, то есть анимирующих объекты непосредственно.
Такие expressions задают некоторые характерные движения, среди которых, в свою очередь,
можно отметить циклические траектории и различные случайные перемещения. В дальнейшем,
для простоты, я буду говорить о перемещениях, однако вы должны понимать: это могут быть и
вращения, и даже случайный разброс цвета, и хаотические или циклические деформации.
Если говорить о циклических движениях, в их основе лежат, как правило,
триногометрические функции sin() и cos(), зависящие от времени. Случайными перемещениями
«заведуют» функции rand() и noise(). Примерами циклических движений могут служить различные
спиралевидные траектории, колебания вокруг некоторой точки, размахивание крыльями, руками и
другими конечностями, мигание маяка и прочее. Примеров хаотических перемещений так много,
что перечислять их нет особого смысла, а диапазон примеров простирается от движения камеры
в трясущихся руках взволнованного оператора до моргания глаз растроганного режиссера.
Затухание амплитуды колебаний или хаотических движений задается обычно с помощью
эспоненциальной функции, зависящей от времени, типа exp(-O.OTtime). Однако можно просто
делить нужную величину на текущее время ($amp/(time*10+0.0001)) и тогда она будет линейно
убывать по мере проигрывания анимации. Не забывайте про деление на ноль в этом случае.
Примечание. Классики анимации советуют делать сначала линейное затухание, а
потом - экспоненциальное.
Среди expressions, предназначенных для задания связи между разными объектами, трудно
выделить какие-то определенные типы. Могу лишь заметить, что знание теоремы Пифагора и
основ тригонометрии совершенно необходимо для написания такого рода expressions, так как
задача перевода вращений в перемещения и обратно встречается в этом случае очень часто.
Примерами могут служить зависимость вращения колеса от его перемещения, различные формулы
для программирования циклов походки (walk cycles), преобразующие поступательное движение
туловища персонажа в циклические перемещения его ног.
Очень часто для эффективного использования expressions приходится добавлять к объектам
дополнительные атрибуты и сохранять в них вспомогательную или промежуточную информацию,
например, о состоянии объекта в предыдущем кадре или расстоянии от него до определенной
точки. Помните о том, что expressions выполняются в каждом кадре и такая информация помогает
задавать дополнительные свойства атрибута - например, скорость. (Пример использования
скорости объекта для его ориентации будет приведен ниже.)
Узнать значение нужного атрибута в любом кадре можно с помощью функции getAttr с
флагом -time. Например:
pCube2.tx = 'getAttr -time (frame -10) pCube1.txx;
pCube3.tx = x getAttr -time (frame -20) pCubel.tx';
pCube4.tx = * getAttr -time (frame -30) pCube1.txv;
Однако использовать функции getAttr и setAttr в expressions крайне нежелательно. (Об
этом еще скажу позже.) Для создания «отстающей» или «догоняющей» анимации лучше всего
подойдет использование клипов (см. раздел, касающийся нелинейной анимации). Для объектов,
анимированных с помощью динамики, такой трюк, однако, не пройдет, так как MAYA не «знает»
(точнее, не «запоминает»), где будет или где был объект некоторое время назад (в этом случае
может помочь кэширование).
Expression нередко используются совместно с констрейнами для «сборки» анимированных
конструкций. Дело в том, что некоторые свойства - например, ориентацию в сторону цели - удобно
Констрейны
623
ШЖУ.
задавать с помощью констрейнов, а взаимодействие объектов можно определять через
expressions. Помните только о том, что expression и констрейны не должны воздействовать на одни и те
же каналы (если только вы намеренно не смешиваете два типа анимации).
Также следите за тем, чтобы не возникали циклические зависимости - например, первый
объект «прибит» ко второму с помощью Point Constraint и в то же время влияет на перемещения
второго посредством expression типа:
object2.tx=-1.5*object1 .ty;
Если вы на свой страх и риск создаете объекты прямо в expressions с помощью MEL-команд
(или, совсем потеряв совесть, удаляете объекты), надо понимать, что при возвращении в первый
кадр никто за вас не будет делать Undo: ведь это не динамика с ее начальным положением
системы. В этом случае, вы можете сделать нужные действия в первом кадре с помощью
конструкции if(frame==1), например:
if (frame==1) { delete "myObject*"; $counter=0; }
Примечание. Про разницу между «=» и «==» можно прочитать в главе про MEL.
Объекты, анимированные с помощью expressions, не имеют, очевидно, никаких
анимационных кривых. Однако вы всегда можете превратить процедурную анимацию в анимацию
по ключам с помощью операции Edit=>Keys=>Bake Simulations. Это может, например, понадобится
для экспорта сцены в другие пакеты или движки, ничего не знающие про механизм expressions.
Операция Bake Simulations предназначена не только для преобразования динамической симуляции
в анимационные кривые, а может использоваться для перевода любого типа анимации в анимацию
по ключам.
Примечание. Для написания эффективных expressions вам придется открыть
старые школьные учебники и освежить давно утраченные сакральные знания по
примитивной тригонометрии, простейшей алгебре и элементарной арифметике.
В идеале термины «квадратный корень» или «длина вектора» не должны валить
вас с ног. К сожалению, я не видел на русском языке книги «Высшая математика
для чайников», а ведь она могла бы быть крайне полезна для не поступающих в
вузы.
Крайне полезным может быть и прочтение раздела документации «Useful Functions» в
рубрике MEL and Expressions.
Кроме того, вам не избежать прочтения главы в этой книге, посвященной языку MEL. По
крайней мере, если вы хотите знать основы синтаксиса и понять, наконец, зачем нужно ставить
все эти дурацкие кавычки.
Далее, я приведу еще немного примеров для иллюстрации разных типов
expressions, упомянутых выше. Я также буду предполагать, что Expression Editor уже освоен вами в
совершенстве.
Циклические движения. Устаканивание с помощью expressions
Представьте себе крутящуюся на столе тарелку, точнее последнюю фазу ее движения,
перед тем как она, дребезжа, затихнет на столе. Или раскачивающуюся, но не падающую бутылку,
которая постепенно «устаканивается» и перестает вращаться. Попробуем изготовить формулу для
описания таких вращений, ибо количество ключей, необходимых для задания такого движения,
совершенно не вдохновляет на использование ключевой анимации. Но сначала немного общих
принципов описания циклических движений с помощью expressions.
Циклические движения описываются обычно с помощью функций sin() и cos(), задающих
перемещения по двум любым координатам. Например, создайте полигональный куб и сделайте
для него простой expression:
pCubel.tx = sin(time);
624
Книга Сергея Цыпцына
№
pCubel.ty = cos(time);
После этого куб начнет перемещаться в плоскости XY по окружности единичного радиуса.
Чтобы увеличить радиус, следует просто домножить каждую функцию на свой коэффициент. В
теории колебаний он называется амплитудой.
pCubel.translateX = 5.0*sin(time);
pCubel.translateY = 3.0*cos(time);
Если амплитуды колебаний по каждой координате разные, получится эллипс, а не
окружность. Кроме амплитуды, существует еще частота колебаний, определяемая коэффициентом,
на который умножается время.
pCubel.translateX = 5.0*sin(time*5.0);
pCubel.translateY = 3.0*cos(time*5.0);
Если частота колебаний по каждой координате разная, окружность превратится в различные
«циклоиды» и вместо периодической траектории вы получите довольно экзотические колебания.
Для того, чтобы колебания постепенно затухали, необходимо, очевидно, чтобы амплитуда плавно
уменьшалась со временем.
«Классический» способ состоит в использовании экспоненциальной функции с
отрицательным аргументом
pCubel.translateX = 5.0*exp(-0.1*time)*sin(time*5);
pCubel.translateY = 3.0*exp(-0.rtime)*cos(time*5);
Более интуитивно понятный способ заключается в делении амплитуды на величину,
пропорциональную времени, чтобы добиться линейного убывания амплитуды с временем.
pCubel.translateX = 5.0/(time*0.1+1)*sin(time*5);
pCubel.translateY = 3.0/(time*0.1+1)*cos(time*5);
Добавление единицы необходимо здесь для того, чтобы точно определять амплитуду в
нулевой момент времени, а заодно для того, чтобы избежать деления на ноль.
Заметьте, что координата Z остается совершенно свободной. Вы можете задать
спиралевидное движение, заставив ее равномерно увеличиваться. Это можно сделать с помощью
двух ключей или же дописать в expression еще одну строку
pCubel.translateX = 5.0/(time*0.1+1)*sin(time*5);
pCubel.translateY = 3.0/(time*0.1+1)*cos(time*5);
pCubel.translateZ = time*0.5;
Теперь вернемся к тарелке на столе.
В новой сцене создайте полигональный цилиндр.
Сожмите его по вертикали до состояния «тарелки» и приподнимите немного (trans-
lateY=0.5).
Констрейны
625
Теперь поверните цилиндр на 30 градусов вокруг оси Z. Его край коснется «земли».
Тут пытливые умы сообразят, что радиус цилиндра равен единице и что угол в тридцать
градусов был взят не с потолка, а в результате сакральных вычислений, заключающихся в
следующем: если радиус цилиндра (равный единице) - это гипотенуза прямоугольного треугольника,
а положение его центра по вертикали - катет (равный 0,5), то угол напротив этого катета должен
быть равен 30 градусов, ибо синус от 30 градусов равен в точности 0,5.
Давайте напишем expression, который будет вычислять угол поворота тарелки в зависимости
от высоты, так, чтобы она всегда касалась «земли».
Откройте Expression Editor и создайте новый expression:
pCylinderl .rz=asind(pCylinder1 .ty);
Загадочная функция asind - это арксинус (функция, обратная синусу), возвращающий
значение в градусах (буква d на конце - это от degree).
Теперь, если вы будете таскать тарелку вверх-вниз, она всегда будет касаться одним
краем земли.
Теперь попробуем закрутить тарелку.
Оказывается циклические выражения, упомянутые выше, применимы не только к
перемещениям, но и к любым другим атрибутам. Чтобы заставить, например, циклически
поворачиваться нашу тарелку, можно просто написать формулу:
//pCylinderl .rotateZ=asind(pCylinder1 .translateY);
pCylinderl. rotateX=30*sin(time*5);
pCylinderl. rotateZ=30*cos(time*5);
Две косые черты - знак комментария, и все, что следует за ним до конца строки, при
выполнении expression игнорируется.
Сейчас тарелка весело вращается вокруг вертикальной оси, наклоняясь на 30 градусов.
Для угла наклона у нас уже есть формула, осталось подставить ее вместо числа 30. Используем
для этого переменную:
$amp = asind(pCylinder1. translateY);
pCylinderl. rotateX=$amp*sin(time*5);
pCylinderl. rotateZ=$amp*cos(time*5);
Теперь тарелка вращается под нужным углом в зависимости от высоты ее центра (не
задирайте пока тарелку выше единицы).
626
Книга Сергея Цыпцына
Число 5 в формулах задает частоту колебаний. Эта частота должна возрастать по мере
того, как тарелка опускается на «землю», а у самой земли тарелка должна неистово дребезжать.
Зададим формулу для вычисления частоты колебаний в зависимости от высоты центра
тарелки, то есть от значения атрибута translateY.
$speed = 5.0/(pCylinder1.translateY+0.01);
$amp = asind(pCylinder1.translateY);
pCylinderl .rotateX=$amp*sin(time*$speed );
pCylinderl .rotateZ=$amp*cos(time*$speed );
Теперь, если высота центра близка к единице, то тарелка вращается с прежней частотой,
приблизительно равной 5, а если опускать тарелку, то ее вращение стремительно ускоряется. Это
можно увидеть, и не запуская анимацию, а лишь «таская» тарелку вверх или вниз. Добавление
числа 0.01 необходимо для того, чтобы избежать деления на ноль, когда центр тарелки вдруг
опустится на «землю».
В принципе expression готов. Для того, чтобы анимировать «устаканивание» тарелки,
вам достаточно поставить ключи на атрибут translateY. Это даст вам возможность уложить ее
на землю именно так, как, по-вашему, должны вести себя фотореалистические тарелки. Она
может подниматься и опускаться столько раз, сколько вам нужно. Если вы до того прониклись
революционными идеями процедурной анимации, что не можете более ставить ключи, можете
дописать в expression дополнительную строчку для анимации translateY, например
pCylinderl .translateY=0.7/(time*3+1);
Однако тогда вам придется дополнительно останавливать вконец обезумевшую тарелку.
Наведем некоторый блеск и подготовим тарелку к дальнейшей анимации. «Блеск»
заключается в том, что надо отследить возможное возникновение математических ошибок (типа
деления на ноль) и «вывести наружу» некоторые коэффициенты для дополнительной ручной
анимации частоты вращения.
Во-первых, функция арксинус не может принимать в качестве аргумента значения больше
единицы (ведь синус в мирное время больше единицы не бывает).
Поэтому надо проверить значение translateY и принять меры.
if(pCylinder1.translateY<1) $amp = asind(pCylinder1.translateY);
else $amp=90.0;
$speed = 5.0/(pCylinder1.translateY+0.01);
pCylinderl .rotateX=$amp*sin(time*$speed );
pCylinderl .rotateZ=$amp*cos(time*$speed );
Во-вторых, если значение translateY равно нулю, это означает, что тарелка полностью
«легла» на землю. По существующей формуле частота колебаний ($speed) будет равна 500.
Однако, к счастью, значение амплитуды $атр, вычисляемой через арксинус, будет в этом случае
равно нулю.
Констрейны
627
В-третьих, вы можете также сделать проверку и задать, что будет происходить, когда
тарелка уйдет под землю, то есть translateY станет меньше нуля. Однако я предлагаю избавить
себя от этой головной боли и задать в Attribute Editor нижний предел перемещений по оси Y
равным нулю.
В-четвертых, число 5.0 следует вывести наружу в виде атрибута объекта, для того, чтобы
можно было вручную задавать замедление или ускорение вращения.
Выберите цилиндр, добавьте к нему атрибут speed:
Modify=>Add Atrribute (Attribute Name=speed; Minimum=-100; Maximum=100; Default=5).
Исправьте expression следующим образом:
if(pCylinder1.translateY<1) $amp = asind(pCylinder1.translateY);
else $amp=90.0;
$speed = pCylinder1.speed/(pCylinder1.translateY+0.01);
pCylinderl .rotateX=$amp*sin(time*$speed );
pCylinderl .rotateZ=$amp*cos(time*$speed );
Теперь вы можете ставить ключи на атрибут speed, управляя скоростью вращения.
В-пятых, дальнейшие улучшения практически безграничны. Вы можете добавить также
горизонтальные смещения центра цилиндра - для пущей реалистичности:
if(pCylinder1.translateY<1) $amp = asind(pCylinder1.translateY);
else $amp=90.0;
$speed = pCylinderl.speed/(pCylinder1.translateY+0.01);
pCylinderl .rotateX=$amp*sin(time*$speed );
pCylinderl .rotateZ=$amp*cos(time*$speed );
pCylinderl.translateZ=$amp/100.0*sin(time*$speed );
pCylinderl.translateX=-$amp/100.O*cos(time*$speed );
Коэффициент 100.0 также можно вывести наружу в виде атрибута объекта.
Наиболее пытливые умы могут придумать формулу вращения вокруг оси Y, чтобы обеспечить
«непроскальзывание» (хотя реальная тарелка как раз активно проскальзывает). Не забудьте только
поменять порядок вращений в Attribute Editor на Rotate Order="yxz".
Сохраните сцену (plate.ma)
628
Книга Сергея Цыпцына
№
Если вы хотите еще немного поиграть с тарелкой, поставьте ключи на атрибут translateY:
Frame 1: translateY=0.8;
Frame 50: translateY=0.2;
Frame 100: translateY=0.5;
Frame 200: translateY=0;
После этого, с помощью операции EditPolygons=>Extrude, превратите тарелку в другой
вид посуды, например, в рюмку или бутылку. Вся анимация «устаканивания» будет успешно
унаследована новой формой.
Сохраните сцену (plateFinal.ma). И попытайтесь отказаться от навязчивых мыслей о
дальнейших усовершенствованиях.
Скорость объекта. Использование expressions для ориентации объекта
по направлению движения. Работа с динамическими атрибутами
Если перемещение объекта анимировано по ключам, никакой информации о скорости
объекта у нас нет. Мы можем лишь узнать позицию объекта в каждом кадре. С помощью
expressions можно вычислить скорость, ускорение и другие «динамические» свойства объекта,
анимированного «традиционным» способом. Эти свойства можно затем использовать, например, для
автоматического разворота объекта «носом» по направлению движения (то есть необходимо только
проанимировать положение объекта по ключам, а вращение будет получаться автоматически).
Создайте полигональный конус.
Чтобы определить его будущую скорость, необходимо знать его положение в предыдущем
кадре. Это положение удобно сохранять в дополнительном атрибуте, а скорость вычислять как
разницу между двумя позициями - в текущем и предыдущем кадрах.
Добавьте к конусу три динамических атрибута (Modify=>Add Attribute), назовите их oldX,
oldY, oldZ.
Создайте довольно примитивный expression:
pConel .oldX=pCone1 .translateX;
pConel .oldY=pCone1 .translateY;
pConel .oldZ=pCone1 .translateZ;
Пока этот expression абсолютно бесполезен, ибо просто копирует текущее положение
конуса в дополнительные атрибуты в каждом кадре. Однако если мы допишем некоторые формулы
Констрейны
629
перед этими строками, то сможем использовать «старую» позицию конуса перед тем, как она
обновится.
Создайте локатор.
Допишите в expression еще три строчки:
locatoii .translateX=pCone1 .oldX;
locatorl .translateY=pCone1 .oldY;
locatorl .translateZ=pCone1 .oldZ;
pConel .oldX=pCone1 .translateX;
pConel .oldY=pCone1 .translateY;
pConel .oldZ=pCone1 .translateZ;
Как следует из этих незамысловатых формул, локатор будет всегда отставать от конуса
ровно на один кадр.
«Подергайте» за конус, чтобы в этом убедиться.
Поставьте несколько ключей на перемещение конуса, задав «быстрые» и «медленные»
участки. Теперь можно воспользоваться тем фактом, что направление скорости - это вектор
идущий от локатора в центр конуса.
Таким образом, если мы заставим конус «смотреть» на локатор, он будет всегда
ориентирован «по скорости», то есть поворачиваться по направлению движения. Проще всего это
сделать с помощью Aim Constraint.
Выберите локатор, затем конус и выполните Constrain=>Aim Constraint с параметрами по
умолчанию. Чтобы конус повернулся «макушкой» от локатора, задайте в Channel Box для объекта
pConel_aimConstraint1 значение offsetZ=90. Опять «подергайте» за конус и убедитесь, что он
теперь поворачивается макушкой по ходу движения.
Задача решена. Осталось, как обычно, навести блеск.
Теперь вы можете как угодно ставить ключи на перемещения конуса - вращения при этом
будут получаться автоматически, и вам не нужно будет дополнительно разворачивать объект и
ставить ключи на атрибуты rotate.
Блеск заключается в добавлении еще нескольких атрибутов для дальнейшего использования
(они несут в себе информацию о направлении и величине скорости), а также , как обычно, в
контроле над ошибками.
Добавьте к конусу еще четыре атрибута: vx, vy, vz и velocity. Допишите в expression еще
несколько строк:
locatorl .translateX=pCone1 .oldX;
locatorl .translateY=pCone1 .oldY;
630
Книга Сергея Цыпцына
locatorl .translateZ=pCone1 .oldZ;
pConel .vx=pCone1 .translateX-pConel .oldX;
pConel .vy=pCone1 .translateX-pConel .oldY;
pConel .vz=pCone1 .translateX-pConel .oldZ;
pConel .velocity = mag( <<pCone1.vx, pConel .vy, pConel .vz>> );
pConel .oldX=pCone1 .translateX;
pConel .oldY=pCone1 .translateY;
pConel .oldZ=pCone1 .translateZ;
Очевидно, что атрибуты vx, vy, vz содержат теперь координаты вектора скорости, а атрибут
velocity определяется как длина вектора скорости, то есть как величина скорости. Эти атрибуты
вы можете использовать в дальнейшем.
Например, конус может удлиняться, двигаясь с большой скоростью - в соответствии с
общей теорией относительности...
Для этого достаточно дописать еще одну строчку в expression:
locatorl .translateX=pCone1 .oldX;
locatorl .translateY=pCone1 .oldY;
locatorl .translateZ=pCone1 .oldZ;
pConel .vx=pCone1 .translateX-pConel .oldX;
pConel .vy=pCone1 .translateY-pConel .oldY;
pConel .vz=pCone1 .translateZ-pConel .oldZ;
pConel .velocity=mag(<<pCone1.vx, pConel .vy, pConel.vz>>);
pConel.scaleY = 1 + pConel .velocity*2.5;
pConel .oldX=pCone1 .translateX;
pConel .oldY=pCone1 .translateY;
pConel .oldZ=pCone1 .translateZ;
В дальнейшем вы можете использовать информацию о скорости и более интеллектуальным
образом. Например, при движении с большой скоростью объект может изменять свой цвет
или прозрачность. Вы также можете деформировать объект и задавать степень деформации в
зависимости от скорости объекта. Такие интеллектуальные связи удобнее всего устанавливать с
помощью операции Set Driven Key, о которой речь пойдет ниже.
Примечание. Чтобы добиться автоматического удлинения при разгоне и сплющивания при
торможении, необходимо иметь информацию об ускорении объекта. Ускорение вы всегда можете
вычислить как разницу между скоростью в текущем и предыдущем кадрах, пользуясь только что
описанными выше принципами (см. сцену keyframeAcceleration.ma).
Поговорим теперь об ошибках. Когда конус останавливается, положение локатора
совпадает с позицией конуса, и в этом случае конус пытается смотреть на локатор, находящийся
у него в центре. Это приводит к тому, что конус просто разворачивается вдоль мировой оси X, так
как констрейн не может вычислить необходимые вращения.
Чтобы избежать такой ситуации, надо, очевидно, проверить, не равна ли нулю скорость
объекта, и если равна, то не надо ли производить обновления позиции локатора, оставляя его в
последнем положении.
pConel .vx=pCone1 .translateX-pConel .oldX;
pConel .vy=pCone1. translate Y-pCone1 .oldY;
pConel .vz=pCone1 .translateZ-pConel .oldZ;
pConel .velocity=mag(<<pCone1.vx, pConel .vy, pConel .vz>>);
if(pCone1.velocity!=0) {
locatorl .translateX=pCone1 .oldX;
locatorl .translateY=pCone1 .oldY;
Констрейны
631
locatorl .translateZ=pCone1 .oldZ;
pConel.scaleY = 1 + pConel .velocity*2.5;
}
pConel .oldX=pCone1 .translateX;
pConel .oldY=pCone1 .translateY;
pConel .oldZ=pCone1 .translateZ;
Сохраните сцену (keyframeVelocity.ma).
Подумайте о том, как еще можно использовать информацию о скорости.
Коленвал.
Преобразование типов движений с помощью expressions.
Теорема Пифагора.
Разберем типичный пример совместного использования констреинов и expressions.
Expressions используются в данном случае для задания связи между объектами, не реализуемой
с помощью констреинов. А констреины не только обеспечивают основные связи, но и служат
источником информации об абсолютных координатах объектов, находящихся внутри иерархий.
Пример и модель предоставлены Володей Забелиным.
Откройте файл-заготовку krivoship.ma.
В нем есть три элемента. Вращающийся вал с анимацией, штанга и поршень. Названия
объектов достаточно красноречивы.
Обратите внимание, что длина штанги равняется примерно семи единицам. Наша задача
состоит в том, чтобы перевести вращательное движение вала в поступательное вертикальное
перемещение поршня.
Для начала закрепим один конец штанги на ручке вала. Проще всего это сделать с помощью
локатора и Parent Constraint.
Создайте локатор, назовите его valLoc.
Надо приподнять его на уровень вала (translateY=7) и «припарентить» к объекту val с
помощью Parent Constraint:
Выберите val, затем valLoc, выполните Constrain=>Parent Constraint).
Теперь локатор вращается вместе с валом.
Внимание! Очень важно понимать одну существенную разницу между
Parent Constraint и операцией Edit=>Parent. Внешне результат «припарентивания»
совершенно одинаковый. Однако в случае применения констрейна в Channel Box
632
Книга Сергея Цыпцына
для локатора будут высвечиваться абсолютные координаты объекта. В случае
обычного «припарентивания» эти координаты будут локальными (то есть
относительно вала как родительского объекта) и вообще не будут меняться,
так как положение локатора относительно вала не изменяется в этом случае.
Так как нам в дальнейшем понадобятся абсолютные координаты локатора для
вычисления положения поршня, был использован Parent Constraint.
Теперь «прибьем» штангу к локатору.
Выберите локатор, затем штангу и выполните Constrain=>Point Constraint. Теперь штанга
перемещается вместе с локатором, не вращаясь при этом.
Заставим штангу смотреть на поршень (то есть ему «в пивот»).
Выберите поршень, затем штангу и выполните Constrain=>Aim Constraint (с параметрами по
умолчанию).
Штанга развернется в сторону поршня, однако не той локальной осью, которой нужно.
Чтобы исправить положение, найдите в Channel Box атрибуты объекта shtanga_aimConstraint1 и
задайте offsetZ=-90.
Теперь осталось согласовать вращение вала и перемещение поршня, чтобы между
локатором и поршнем все время было одно и то же расстояние, равное длине штанги (в нашем
случае ровно семи).
С помощью констрейнов сделать это ловко не удастся, и на помощь нам придет теорема
Пифагора.
Рассмотрите прямоугольный треугольник, где гипотенузой (С) является штанга, одним
катетом (А) будет расстояние от локатора до вертикальной оси Y, а вторым катетом (В) будет
Констрейны
633
расстояние от поршня до прямого угла.
Если мы найдем длину катета В, задача будет решена, так как это и есть искомое расстояние
по вертикали от локатора до поршня, и нам останется написать expression, задающий связь между
valLoc.translateY и porshen.translateY.
Длина гипотенузы С нам известна, это - 7.
Длина катета А тоже, это valLoc.translateZ.
Как следует из теоремы Пифагора B^^l = С2 - А2.
Создаем expression:
porshen.ty = valLoc.ty - sqrt(7*7 - vall_oc.tz*valLoc.tz);
Здесь sqrt - это функция, вычисляющая квадратный корень. Теперь вся конструкция
исправно работает в анимации. Осталось, как обычно, навести блеск и поработать над возможными
ошибками. Блеск заключается в том, что если вместо семерки вписать в expression значение
атрибута scaleY для штанги
porshen.translateY = valLoc.ty - sqrt(shtanga.scaleY*shtanga.scaleY-valLoc.translateZ*valLoc.
translateZ);
вы сможете после этого изменять длину штанги, и весь механизм будет перестраиваться
под новые размеры, продолжая корректно отрабатывать анимацию.
Работа над ошибками заключается в следующем. Если сделать длину штанги достаточно
короткой, возникнет ситуация, когда она станет меньше, чем радиус вала, и поэтому в какой-то
момент выражение:
shtanga.scaleY*shtanga.scaleY-valLoc.translateZ*valLoc. translateZ
станет меньше нуля. Попытка вычислить квадратный корень из отрицательного выражения вызовет
у MAYA приступ бешенства в виде серии сообщений об ошибках. Чтобы избежать такой ситуации,
следует, очевидно, сделать проверку величины указанного выражения и в случае отрицательного
значения (то есть когда штанга «отрывается от поршня») сделать высоту поршня
(porshen.translateY) равным высоте локатора (valLoc.translateY).
634
Книга Сергея Цыпцына
Отредактируйте expression следующим образом:
$diff=(shtanga.scaleY*shtanga.scaleY-valLoc.translateZ*valLoc.translateZ);
if($diff>0)
porshen.translateY=valLoc.translateY-sqrt($diff);
else
porshen.translateY=valLoc.translateY;
Примечание. Попытка просто взять абсолютную величину подкоренного выражения с помощью
функции abs приведет к менее удачной конструкции. Можете проверить сами.
Взрослые мальчики могут переписать expression в более компактном и «красивом» виде
(правда, менее понятном):
$diff=(shtanga.scaleY*shtanga.scaleY-valLoc.translateZ*valLoc.translateZ);
if($diff<0) $diff=0;
porshen.translateY=vall_oc.translateY-sqrt($diff);
Сохраните сцену (krivoshipFinal.ma).
Подумайте о связях между объектами, загляните в Hypergraph, проследите направление
связей от вала к поршню.
Операция Set Driven Key. Формула произвольной гибкости
Представьте себе, что нужно сделать так, чтобы цвет и прозрачность объекта изменялись
в зависимости от его размера. Примером может служить надуваемый воздушный шарик или же
брюхо комарихи, набухающее и краснеющее по мере его заполнения.
Первое, что приходит на ум, это написать expression с формулой зависимости цвета от
размера. Однако сразу возникает несколько проблем.
Во-первых, каналов цвета три и писать формулу придется для каждого в отдельности.
Во-вторых, значение цвета для каждого канала меняется от нуля до единицы. Конечно
можно подобрать коэффициент зависимости между размером и цветом, чтобы цвет менялся
примерно в нужном диапазоне. Однако как быть с границами диапазона? Хотелось бы иметь
ограничение типа «цвет пропорционален размеру, но не может быть больше чем 0.9». С помощью
expression это можно реализовать с помощью выражения типа:
lambertl.colorR = 0.1*myObject.scalY;
if(lambert1 .colorR>0.9) lambertl .colorR=0.9;
if (lambertl .colorR<0.1) lambertl .colorR=0.1;
В-третьих, для каждого канала цвета надо будет подбирать свои коэффициенты, причем
вслепую. Соответствующий expression превратится в месиво цифр:
lambertl.colorR = 0.1*myObject.scalY;
if(lambert1 .colorR>0.9) lambertl .colorR=0.9;
if (lambertl .colorR<0.1) lambertl .colorR=0.1;
lambertl.colorG = 0.01*myObject.scalY;
if (lambertl .colorG>0.2) lambertl .colorR=0.2;
if (lambertl .colorG<0.01) lambertl .colorR=0.01;
lambertl.colorB = 0.015*myObject.scalY;
if(lambert1 .colorB>0.3) lambertl .colorR=0.3;
if (lambertl .colorB<0.02) lambertl .colorR=0.02;
Констрейны
635
HMMi
Говорить о наглядности и уж тем более об интерактивности, согласитесь, в данном случае
не приходится.
Ну, и в-четвертых, как быть, если мы захотим, чтобы цвет менялся не прямо пропорционально
размеру, а более сложным, нелинейным образом, типа: «медленно при малых значениях размера
и быстро при больших»?
Приведенная ситуация - типичный пример, когда выбранное средство (expression) хоть и
способно решить задачу, однако явно неэффективно и будет сильно тормозить производственный
процесс.
Часто встречается ситуация, когда связь между атрибутами объектов описывается в
терминах типа «если один объект находится в состоянии (положении, вращении и т.д.) А1, то
второй объект должен быть в состоянии В1, а если первый объект будет в состоянии А2, то второй
должен перейти в состоянии В2, и так далее». Такая связь плохо реализуется с помощью
expressions, но для ее описания идеально подходит операция Set Driven Key.
Идея технологии Driven Key заключается в следующем. Когда вы ставите обычные ключи
на атрибуты объекта, возникает анимационная кривая, определяющая зависимость атрибута от
времени. С помощью операции Set Driven Key можно ставить на атрибут ключи, определяющие
зависимость этого атрибута не от времени, а от другого атрибута. Такие «особые» (driven)
ключи также порождают анимационную кривую, у которой на горизонтальной оси в Graph Editor
отображаются не кадры или секунды, а атрибуты управляющего объекта. В дереве зависимостей
такая анимационная кривая располагается не между объектом и временем, а между управляемым
и управляющим объектами.
Другими словами, можно сказать, что операция Set Driven Key позволяет определить не
«прямую» связь между атрибутами (как в Connection Editor), а допускает задание произвольной
зависимости между атрибутами, график которой определяется анимационной кривой.
Несмотря на использование термина «ключ» (Key), никакой зависимости от времени
в ходе применения этой операции не возникает. Равно как и никакой анимации. Возникает
лишь зависимость между атрибутами объектов, не более того. Я советую рассматривать ключи
и анимационные кривые, созданные с помощью Set Driven Key, как своего рода expressions,
связывающие атрибуты объектов.
Терминологический комментарий. Переводить команду Set Driven Key словами,
вроде «установить управляемый ключ», я, как вы понимаете, не собираюсь. И
вообще не собираюсь как-либо «переводить» этот термин. Закоренелые майщики,
как нетрудно догадаться, употребляют прямолинейные выражения типа «этот
сетап сделан дривен кеями» и прекрасно понимают друг друга. Я лишь упомяну
о том, что driven в переводе с компьютерного означает «управляемый». Также
замечу, что применительно к операции Set Driven Key, оперирующей такими
терминами, как driver и driven, очень хорошо подходит понятийная связка
«ведущий-ведомый».
Проделаем быстро простой пример, чтобы понять смысл операции Set Driven Key.
Интеллектуальный шлагбаум
Откройте файл drivenKey_start.ma. Если вам посчастливилось скачать эту книгу
из Интернета, изготовьте цилиндрический паровоз и кубический шлагбаум. Рельсы носят
декоративный характер.
636
Книга Сергея Цыпцына
Как известно, любой добропорядочный шлагбаум при приближении паровоза тут же
опускается и перекрывает движение автомобилей по дороге. После удаления адской машины на
безопасное расстояние шлагбаум автоматически поднимается и остается в таком положении, до
следующего паровоза.
Зададим связь между положением паровоза и движением шлагбаума с помощью операции
Set Driven Key.
Коль скоро управляемым будет шлагбаум, то есть на его атрибутах rotate будут «висеть»
какие-то управляющие связи, надо выбрать его (объект bar), а затем выделить в Channel Box
атрибут rotateX и в меню по правой кнопке выбрать Set Driven Key.
Откроется окно Set Driven Key, позволяющее задавать зависимость между управляющим
объектом и выделенным атрибутом bar.rotateX.
Это окно напоминает отдаленно Connection Editor, только ориентированный вертикально.
В нижней части отображаются атрибуты управляемого (или ведомого, driven) объекта. В верхней
панели должен находиться управляющий (ведущий, driver) объект.
В нашем случае управляющим объектом будет parovoz, а управляющим атрибутом будет
translateZ. Ведь положение шлагбаума должно зависеть от перемещения паровоза по оси Z.
Чтобы загрузить паровоз в верхнюю Driver-панель, выберите его и нажмите кнопку Load Driver в
окне Set Driven Key.
Теперь обязательно выберите атрибут translateZ в верхней панели, чтобы определить его
как управляющий.
Не помешает удостовериться, что в нижней Driven-панели атрибут rotateX объекта bar
также выбран.
Констрейны
637
Теперь начинается самое интересное.
Отведите паровоз на безопасное расстояние, то есть туда, где шлагбаум будет еще
открыт. Откройте шлагбаум на адекватный, с вашей точки зрения, угол. Нажмите кнопку Key.
Внимание! В тот момент, когда вы нажали кнопку Key, вы создали связь-условие
типа «если паровоз находится в таком-то месте, то шлагбаум должен быть
повернут на такой то угол».
В терминах MAYA эта связь формулируется как «если атрибут parovoz.translateZ
равен -18, то атрибут bar.rotateX равен 80». К сожалению, никаких индикаторов
или маркеров, свидетельствующих об этом, не появляется, так что вам надо
просто помнить о том, где и когда вы уже поставили Driven Key.
Теперь передвиньте паровоз туда, где шлагбаум уже должен быть закрыт, а затем опустите
шлагбаум. И снова нажмите кнопку Key.
Внимание! Сначала надо изменять управляющий объект, а затем управляемый.
Это важно.
«Поелозьте» паровозом по рельсам. Шлагбаум должен в панике закрываться при
приближении паровоза. «Поелозьте» также мышкой по временной линейке. Убедитесь, что
никакой анимации нет и в помине. Все, что вы сделали, это установили связь между паровозом и
шлагбаумом.
Примечание. Название кнопки Key катастрофически дезинформирует начинающих
пользователей. Нажимая ее, они бессознательно ожидают появления анимации в
сцене и с удивлением взирают на временную линейку, где не появляется ни одного
ключа. С моей точки зрения более адекватным названием для кнопки было бы Set
или Connect.
Поставим еще два driven-ключа.
В меню окна Set Driven Key есть пункт Keys=>Go to Next, позволяющий последовательно
переходить в те положения, в которых были установлены связи-ключи. Это помогает не
запутаться.
Заставьте паровоз проехать шлагбаум и остановите его в том месте, где осторожный
шлагбаум должен начать подниматься.
Шлагбаум при этом трогать не надо: он ведь еще закрыт.
Просто нажмите кнопку Key.
Совет. Шлагбаум или паровоз можно выбирать прямо в окне Set Driven Key. Это
здорово экономит время и заодно помогает понять суть процесса.
638
Книга Сергея Цыпцына
Далее передвиньте паровоз еще дальше, затем откройте шлагбаум.
Снова нажмите Key.
Теперь неистово подергайте за паровоз и убедитесь, что шлагбаум открывается и
закрывается автоматически. Так, как будто бы работает некий expression, связывающий,
перемещение паровоза и опускание-поднимание шлагбаума.
Так где же посмотреть на эти невидимые driven-ключи? Правильно, в Graph Editor.
А выбрать нужно при этом шлагбаум, ведь это на его атрибуте rotateX «висит» специальная
анимационная кривая, отвечающая за связь с паровозом (в чем нетрудно убедиться, взглянув на
цвет rotateX в Channel Box).
Откройте Graph Editor, нажмите «f».
Вы увидите анимационную кривую, определяющую зависимость вращения шлагбаума
от перемещения паровоза. Обратите внимание: в правом нижнем углу обозначено не время, а
перемещение паровоза (parovoz.translateZ).
Эту анимационную кривую можно редактировать любыми известными вам способами.
Например, выберите ее и сделайте тангенсы всех ключей типа Spline: Tangents=>Spline.
Потаскайте паровоз и убедитесь, что шлагбаум стал «проваливаться», вместо того, чтобы
оставаться закрытым. Форма анимационной кривой в середине красноречиво объясняет, почему
так происходит. Чтобы обеспечить «мягкое» поднятие и опускание шлагбаума сделайте тангенсы
«плоскими»: Tangents=>Flat.
Совет. Всегда помните о том, какого типа тангенсы создаются при создании
ключей по умолчанию. Посмотреть или изменить этот тип можно в главном окне
настроек Preferences, в категории Animation.
Констрейны
639
ШШ|
Обратите внимание: driven-ключи не отображаются на временной линейке. Им
просто негде там отображаться, ведь они не связаны ни с каким кадром.
Откройте Hypergraph и посмотрите, как устроены входящие связи для шлагбаума.
Анимационная кривая располагается в дереве зависимостей точно посередине между
объектами parovoz и bar. Теперь вы можете ставить «традиционные» ключи на перемещение
паровоза, производя анимацию его движения. Анимация шлагбаума при этом будет получаться
автоматически. Сохраните сцену (drivenKey_final.ma).
Управление множеством атрибутов с помощью Set Driven Key.
Борьба с комарами
Совершенно очевидно, что с помощью операции Set Driven Key можно заставить один
управляющий атрибут влиять на множество управляемых. Нужно лишь произвести нужный выбор
в окне Set Driven Key. Сделаем еще один пример.
Откройте новую сцену. Создайте две сплайновые сферы и превратите каждую в брюхо
комара. Первую - в тонкое голодное брюхо, а вторую - в набухшее сытое брюхо. Если вам лень
таскать за точки, откройте файл komar_start.ma.
Сделаем морфинг тонкого брюха в толстое, имитируя, таким образом, процесс насыщения
кровососущего паразита.
Сначала выберите большой живот, затем маленький и выполните операцию Deform=>Create
Blend Shape.
Разыщите в Channel Box ноду blendShapel и убедитесь, что если задать значение ее
атрибута nurbsSphere2 равным единице, то худое брюхо превратиться в толстое.
Спрячьте или удалите второе, ненужное брюхо, а на оставшееся назначьте новый материал
типа Phong (правая кнопка Mbiujn=>Materials=>Assign New Material=>Phong).
I Channels Object
I norb*Sphete1
640
Книга Сергея Цыпцына
Теперь наша задача состоит в том, чтобы сделать так, чтобы по мере набухания брюха оно
становилось более красным и прозрачным.
Говоря формально, надо установить зависимость между атрибутом blendShapel.nurb-
sSphere2 и атрибутами цвета и прозрачности материала phongi.
Доберемся до атрибутов материала. Выберите брюхо, откройте Attribute Editor, перейдите
в последнюю закладку phongi. Нажмите правую кнопку мыши над атрибутом Color и выберите в
выпавшем меню Set Driven Key...
Таким образом, материал phongi загрузится в нижнюю панель открывшегося окна Set
Driven Key. Осталось загрузить в верхнюю часть ноду blendShapel, отвечающую за деформацию.
В окне Attribute Editor перейдите в закладку blendShapel и нажмите внизу кнопку Select,
чтобы выбрать ноду blendShapel как отдельный объект.
Теперь в окне Set Driven Key нажмите кнопку Load Driver и в верхней панели появится
blendShapel со всеми своими атрибутами.
Разыщите среди них атрибут nurbsSphere2, отвечающий за морфинг, и выделите его.
В нижней панели выделите атрибуты colorR, colorG, colorB, transparencyR, transparencyG,
transparencyB.
Теперь можно устанавливать зависимость между формой и цветом.
Выберите в верхней панели blendShapel и удостоверьтесь в Attribute Editor, что атрибут
nurbsSphere2 равен нулю, то есть брюхо пустое.
Выберите в нижней панели phongi и задайте в Attribute Editor наиболее подходящий с
вашей точки зрения цвет голодного комариного брюха.
Нажмите кнопку Key.
Далее выберите blendShapel, задайте nurbsSphere2=1, надув тем самым брюхо.
Затем задайте цвет и прозрачность материала, наиболее соответствующие наполненному
кровью брюху комара.
Снова нажмите кнопку Key.
Констрейны
641
Теперь выберите снова blendShapel и задайте nurbsSphere2=2, раздув тем самым брюхо до
недопустимых размеров.
Задайте затем цвет и прозрачность материала, соответствующие лопающемуся брюху.
Снова нажмите кнопку Key.
Теперь изменяйте атрибут nurbsSphere2. По мере раздувания брюха, его цвет должен
меняться в соответствии с поставленными ключами.
И хотя это не очень хорошая идея - редактировать анимационные кривые для каналов
цвета, вы можете заглянуть в Graph Editor, чтобы поправить, если необходимо, тангенсы.
Выбрать при этом нужно, очевидно, материал phongi.
Теперь вы можете неоднократно анимировать надувание и опустошение комариного брюха,
и цвет при этом будет меняться автоматически. Вам не надо будет ставить ключи на атрибуты
материала.
Сохраните сцену (komar_Final.ma).
Set Driven Key - некоторые замечания
Несложно заметить, что один атрибут может управлять несколькими атрибутами разных
объектов. Все эти объекты можно одновременно загрузить в нижнюю часть окна. Если выбрать их
там все вместе, то справа будут показаны только общие для всех выбранных объектов атрибуты.
Поэтому если вы хотите одновременно задавать зависимость для разных атрибутов разных
объектов, то выбирайте их по очереди и так же, по очереди, ставьте ключи.
Очевидно, что в верхней панели можно выбрать только один управляющий атрибут, ведь
было бы странно, если бы на один управляемый (driven) атрибут влияли сразу два управляющих
(driver). Однако это возможно организовать, если по очереди выполнить операцию Set Driven Key
для одного и того же управляемого (driven), но для разных управляющих (driven) атрибутов.
Например, в предыдущем примере с комаром, вы можете дополнительно проделать
операцию Set Driven Key, выбрав в качестве управляющего атрибута, например, scaleX, а в качестве
управляемых по-прежнему оставить атрибуты материала phongi. В таком случае на цвет материала
будут влиять сразу два управляющих атрибута.
Пытливые умы сразу спросят, а как тогда будет выглядеть дерево зависимостей? Не может
же один атрибут иметь две входящие связи! Действительно, не может. Небольшое исследование
Hypergraph показывает, что в этом случае возникает специальная нода (blendWeighted),
смешивающая результат влияния двух управляющих атрибутов.
642
Книга Сергея Цыпцына
Таким образом, с помощью операции Set Driven Key можно делать так, чтобы один
управляемый объект (а точнее, атрибут) зависел от сразу нескольких управляющих объектов (а
точнее, их атрибутов). Индивидуальное воздействие каждого управляющего объекта будет при
этом «смешиваться» с другими. Например, уши вашего персонажа должны немного шевелиться,
когда персонаж широко открывает рот, и в тоже время они должны немного двигаться, когда
персонаж приподнимает брови.
Одно из наиболее частых применений операции Set Driven Key - задание мышечных
деформаций. Форма или размер мышцы выступают в таких случаях в качестве управляемых
атрибутов, а угол сгиба костей в локте или колене - в качестве управляющих. К этому мы еще
вернемся в разделе про анимацию персонажей.
Шутка для взрослых. Выберите произвольный объект и загрузите его в нижнюю часть окна
Set Driven Key. А в качестве управляющего объекта выберите глобальное время timel, загрузите
его в верхнюю панель и в качестве управляющего атрибута выберите атрибут outTime. Теперь
поставьте анимацию, пользуясь только перемещением по временной шкале и кнопкой Key. Вы
получите ключи-невидимки, их не будет видно на временной линейке, и ваши друзья будут долго
ломать голову, как вам удалось заставить MAYA так сильно глючить.
Констрейны
643
шшш
Смешивание различных типов анимаций: Animation Blending
Теперь, когда изнанка основных типы анимации разобрана, я хотел бы остановиться на
способах комбинирования или смешивания разных видов анимации. Animation Blending применяется
чаще всего для стыковки или плавного перехода одного вида анимации в другой. Например, вот
муха, она летела на мед (анимация по пути или по ключам), но прилипла к поверхности банки
(констрейны) и следует в дальнейшем за этой поверхностью. Или описанная выше тарелка спокойно
катится по столу (анимация по ключам), а потом начинает падать и бешено вращаться (expression).
Перепрыгивание Брюса Виллиса из кабины вертолета на крыло Боинга - тоже пример смешивания
анимаций: сначала этот «крепкий орешек» был «приконстреинен» к кабине вертолета, а затем уже
следовал за крылом самолета.
Как я уже говорил, смешивание анимаций всегда, начиная с версии 1.0, могло быть
реализовано в MAYA с помощью системы констрейнов. И может до сих пор.. Тот же Брюс Виллис мог
быть одновременно приконстреинен и к кабине вертолета, летящего по пути, и крылу самолета,
двигающегося по ключам, в соответствии с указаниями диспетчеров. Смешивание анимации в
этом случае сводится к анимации весов констрейна, определяющих, какую долю анимации Брюс
Виллис унаследует от вертолета, а какую от Боинга.
Однако пользователи MAYA не желали плодить констрейны для каждого прыжка Брюса
и требовали возможности «наваливать» разные типы анимации на один и тот же объект, не
«приконстрейнивая» его к вспомогательным «болванкам». В конце концов пользователи победили,
и в MAYA появилась новая возможность, так что в третьей серии «Крепкого орешка» Брюс Виллис
был уже полностью трехмерный и скакал с невиданной прытью.
В соответствии в основной концепцией MAYA об анимации атрибутов, а не объектов, следует
сразу внести ясность: когда мы говорим о смешивании различных типов анимации на одном
объекте, на вход анимированного атрибута поступает результат усреднения или смешивания двух
(или нескольких) значений, вычисляемых, например, анимационной кривой и констрейном.
Если в обычном случае анимационная кривая или констрейн напрямую присоединены
к анимированному атрибуту, то в случае их смешивания, связи исходящие от них сначала
смешиваются в специальном «блендере» - ноде типа pairBlend, а затем результат смешивания
передается в анимированный атрибут.
На практике для того, чтобы получить смешивание анимаций, достаточно просто
проанимировать один и тот же атрибут объекта двумя разными способами: например, сначала
поставить ключи на атрибуты translate, а затем применить к объекту Point Constraint; или сначала
создать для атрибута expression, а потом поставить на этот же атрибут ключи.
Чтобы быстро увидеть пример смешивания анимаций, возьмите любой объект, например
куб, и сначала хорошенько потрясите его с помощью expression:
644
Книга Сергея Цыпцына
pCube1.ty=rand(-1,1);
А затем поставьте на атрибут translateY несколько ключей, задающих движение по
вертикали. Результирующее движение будет определяться поставленными ключами, однако в
Channel Box можно будет увидеть дополнительный атрибут blendExpressionI и дополнительную
ноду с названием pairBlendl.
Цвет атрибута translateY станет зеленым, что свидетельствует о том, что он зависит теперь
не от анимационной кривой или от expression, а от ноды pairBlendl.
Новый атрибут blendExpressionsI определяет, в каких пропорциях смешиваются две
анимации: ключевая и процедурная.
Установите значение blendExpressionsI =0.5, и вы увидите, как объект движется по ключам,
одновременно хаотически вздрагивая.
Поэкспериментируйте с эти атрибутом, чтобы убедиться, что с его помощью можно
переходить от одного типа анимации к другому.
Примечание, Атрибут blendExpressionsI - динамический. Он создается при попытке
поставить ключи на уже анимированный другим способом объект. Он управляет
атрибутом weight ноды pairBlendl, который определяет степень смешивания
двух входящих значений. Кстати, величина этого атрибута может быть больше
единицы и меньше нуля. Попробуйте понять методом тыка, как смешиваются
анимации в этом случае.
Порядок смешивания анимаций
Если поглядеть на устройство смешанной анимации в Hypergraph, можно предположить, что
совершенно безразлично, в каком порядке создавать разные анимации для выбранных атрибутов:
ведь для ноды pairBlend абсолютно все равно, какие данные приходят на первый вход, а какие на
второй. Однако на практике это не так и надо помнить про ряд особенностей.
Констрейны
645
Можно ставить ключи и создавать констрейны, влияющие на одни и те же атрибуты объекта
в произвольном порядке. Однако, если вы поставите ключи на какой-нибудь атрибут, а потом для
него же напишете expression, то при попытке создать такой expression вы получите сообщение об
ошибке:
Error: Attribute already controlled by an expression, keyframe, or other connection.
По непонятной причине MAYA требует, чтобы сначала был создан expression для этого
атрибута, а уж потом на него были поставлены ключи. Только в этом случае будет создана нода
pairBlend и влияние двух анимаций будет корректно смешиваться.
Если вы контролируете анимацию атрибута с помощью операции Set Driven Key, вы не
сможете поставить обычные ключи на этот же атрибут. Однако если сначала поставите ключи на
этот атрибут, а затем зададите его зависимость от других атрибутов с помощью окна Set Driven
Key, влияние двух анимационных кривых будет корректно усреднено (правда, в этом случае будет
использоваться нода blendWeighted).
Если у вас уже есть активное твердое тело, при постановке ключей на атрибуты
translate или rotate будет создано смешивание анимации с помощью ноды pairBlend. Однако если вы
сначала поставите ключи на эти атрибуты объекта, а потом превратите его в активное твердое
тело, никакого смешивания не возникнет. Тут следует вспомнить, что активные тела игнорируют
ключи, и в этом случае единственный способ заставить твердое тело «вспомнить» про ключи - это
превратить его в пассивное твердое тело, то есть установить атрибут active равным нулю. Или
поставить новые ключи.
Если объект движется по пути, можно ставить ключи на атрибуты translate или rotate, AAAYA
будет смешивать повороты и перемещения от анимационных кривых и от движения по пути. Если
сначала поставить ключи, а затем запустить объект по пути, у вас ничего не выйдет. Проверьте
сами.
Поэкспериментируйте с другими возможными случаями смешивания различных типов
анимаций. Я могу дать лишь общий совет - если хотите корректно смешивать разные типы анимации,
ставьте ключи или создавайте констрейны во вторую очередь, то есть поверх уже имеющейся
анимации другого типа.
Для взрослых. Если MAYA вам не позволяет накладывать одну анимацию поверх другой
(например, создавать expression для атрибутов translate активного твердого тела), вы всегда
можете сделать это вручную, пересоединив в Hypergraph входящие связи к ноде pairBlend от
остальных нод, обеспечивающих анимацию.
Кватернионы, эйлеровские углы, синхронизация вращений
и прочие ужасы
Некоторые пытливые умы, заглянувшие в Attribute Editor для ноды pairBlend, наверняка
обнаружили там загадочный атрибут Rot Interpolation, по умолчанию имеющий значение Euler Ап-
646
Книга Сергея Цыпцына
gles, но имеющий также опцию Quarternions. Совсем уж любознательные археологи обнаружили
упоминание об этих пугающих явлениях в Graph Editor (Curves=> Change Rotation Interp) или в
общих настройках анимации Preferences=>Settings=>Animation=>Rotation Interpolation.
Так что же это за «вращательная интерполяция»? Попробуем разобраться
Создайте конус и поверните его на 175 градусов вокруг оси X.
Поставьте ключ в первом кадре.
Перейдите в двадцатый кадр.
Задайте в Channel Box значение rotateX = -175 и снова поставьте ключ.
<на пальцах»
Теперь, если вы будете проигрывать анимацию, конус будет бешено вращаться по кругу.
Однако если вы будет переходить из первого кадра сразу в двадцатый и обратно, то коллега,
подошедший позвать вас на перекур и взглянувший на экран, будет уверен, что в промежуточных
кадрах конус чуть-чуть повернется, чтобы плавно перейти от одного положения к другому. То есть
вопрос в том, как интерполировать вращение между ключевыми кадрами.
По умолчанию вращение интерполируется формально, то есть от одного значения угла
до другого, вне зависимости, какие пируэты выписывает при этом конус. Такая формальная
интерполяция задана в установках анимации по умолчанию и называется Euler-Angles (эилеровские
углы). Попробуем изменить ее для существующей анимационной кривой.
Выберите конус, откройте Graph Editor, отметьте анимационную кривую и выполните
операцию Curves=> Change Rotation lnterp=>Synchronized Quarternions.
MAYA бодро поприветствует вас сообщением об ошибке
Error: Can only synchronize rotations on objects with all three rotation channels keyed. Skipped:
pCone1_rotateX
Констрейны
647
Это означает, что вращение вокруг оси X было анимировано независимо от остальных
вращений. Опять же по умолчанию, в MAYA принято анимировать вращения независимо друг от друга,
хотя имеется возможность включить режим согласованной или синхронной анимации вращений.
Это можно сделать в окне глобальных установок Preferences в категории Settings=>Animation.
В случае выбора New Curve Default=Synchronized Euler-Angles Curves все ключи, создаваемые
для атрибутов rotate будут синхронизированы. Это значит, что если вы поставите, например, ключ
только на атрибут rotateX, автоматически возникнут также ключи для rotateY и rotateZ. Если вы
откроете в этом случае Graph Editor и передвинете ключ на анимационной кривой для rotateY
вправо или влево, ключи на анимационных кривых для rotateZ и rotateX также передвинутся на то
же расстояние. Ключи в этом случае оказываются «сцеплены» и не могут быть отредактированы
независимо друг от друга. Синхронизация поворотов может быть полезна для работы с анимацией
сложных вращательных движений, в частности при работе с прямой кинематикой и интенсивными
вращениями костей друг относительно друга во всех плоскостях.
Вернемся теперь к нашим кватернионам. Если формальная интерполяция Euler-Angles
может быть независимой (Independent Euler) или синхронизированной (Synchronized Euler), то
интерполяция с помощью кватернионов работает только с синхронизированными ключами.
Поэтому встаньте в первый кадр и просто поставьте ключ на атрибуты rotateY и rotateZ.
Теперь снова откройте Graph Editor, выберите снова анимационную кривую для rotateX и выполните
Curves=> Change Rotation lnterp=>Synchronized Quaternions.Теперь ошибки быть не должно и
анимационная кривая примет довольно замысловатый вид.
ШШШШВШШШШЖ ^№*1
Если вы теперь проиграете анимацию, конус будет чуть-чуть вращаться, переходя из
одного положения к другому кратчайшим образом.
Итак, кватернионы используются только для задания альтернативного типа интерполяции
анимационных кривых между ключевыми кадрами. Они применяются только для вычисления
вращений. В результате использования Quaternion Interpolation объект будет вращаться (между
соседними ключевыми кадрами) так, чтобы совершить кратчайший поворот от одного положения
к другому, даже если цифры в Channel Box имеют совершенно безумные значения.
Примечание. В Channel Box всегда отображаются эйлеровские углы, независимо от
типа интерполяции анимационных кривых.
Очевидно, что применять Quaternion Interpolation имеет смысл только в тех случаях, когда
величины вращений принимают «экстремальные» значения (то есть внезапно переходят через
значения 180 или -180 градусов), либо когда объект начинает неожиданно бешено крутиться в
непонятном направлении.
Вы спросите, а с чего бы это объекту вдруг начать крутиться, если мы сами ставим ключи
и контролируем положение объекта. Да, это так, если вы используете только анимацию по
ключам. Однако в некоторых случаях ключи для вращений или ориентация объекта получаются
648
Книга Сергея Цыпцына
№
автоматически, в результате вычислений. Одним из примеров может служить использование данных
от систем захвата движений или соответствующих библиотек. Как правило, вращения всех костей,
«приехавших» к вам от системы motion capture, находятся в диапазоне от -180 до +180 градусов и
весело перекручиваются, проходя через границы диапазона, если предварительно никто не принял
никаких усилий - типа эйлеровской фильтрации. Другим примером может быть вышеупомянутое
смешивание анимаций, когда от одного вращательного движения объект плавно переходит к
другому. При этом вы вполне контролируете значения вращений, когда ставите ключи, однако
значения, вычисляемые констрейнами или движением по пути, получаются автоматически, и вы
не можете их предугадать или контролировать. Поэтому может возникнуть ситуация, когда объект,
вместо того, чтобы плавно повернуться от текущего положения (определяемого, например, Aim
Constraint) к новой ориентации, задаваемой ключами и визуально очень близкой в пространстве,
начинает описывать большие дуги, поворачиваясь в новое положение совсем не так, как вы этого
ждете. В этом случае имеет смысл отредактировать значение атрибута Rot Interpolation ноды
pairBlend, установив его в Quaternions, чтобы смешивание вращений происходило по кратчайшему
пути в пространстве.
Еще одним примером может служить сложная настройка персонажа, когда каждый сустав
имеет собственное расположение локальных вращательных осей. При использовании управления
с помощью Set Driven Key углы поворота будут вычисляться автоматически, а вращение не всегда
будет происходить предсказуемо.
Несмотря на то, что кватернионы довольно ловко решают задачу внезапных перекручиваний,
я видел очень мало людей, делавших внятные попытки ими пользоваться. Это в основном связано
с тем, что анимационные кривые такого типа имеют довольно ограниченные возможности
редактирования тангенсов в ключевых кадрах и, как следствие, несколько сужают свободу
управления анимацией. Поэтому основная часть аниматоров мучается, колется, но продолжает
использовать традиционные эйлеровские углы. Им на помощь приходит, время от времени, операция
эйлеровской фильтрации, позволяющая выбрать анимационную кривую и перераспределить ключи
таким образом, чтобы избежать перекручиваний. Эта операция располагается в меню Graph Editor
по адресу Curves=>Euler Filter.
Примечание. Леонард Эйлер - один из величайших математиков XVIII века. Широта
его научной эрудиции просто потрясает. Небесная механика и баллистика, теория
корабля и морская наука, прочность материалов, навигация и магнетизм, оптика
и теория музыки, гидродинамика и работа ветряных мельниц, астрономия,
картография, теория шахматной игры, магическиеквадраты. Современныеучебники
математики, механики, астрономии содержат многочисленные упоминания его
имени: эйлеровы углы, подстановки, функции, интегралы, уравнения, теоремы,
постоянная Эйлера и пр. Кто-то подсчитал: только для того, чтобы просто
переписать труды Эйлера, работая по восемь часов ежедневно, понадобилось
бы не менее полувека. Многие из его удивительных открытий были сделаны в
Петербургской Академии наук, где Леонард Эйлер проработал тридцать один год.
Жизнь Эйлера была неразрывно связанная с Россией, где он начал свою научную
карьеру, где скончался и был похоронен. Эйлер женился также в Петербурге в 1733
году. Он был отцом 13 детей и дедом 38 внуков. Многие из его потомков тоже
стали учёными, они жили и продолжают жить в России.
Бесплатный гхостинг, или классическая фазовка
Речь идет о полезном сервисе, который MAYA предоставляет аниматорам для симуляции
техники, применяемой в классической рисованной анимации, когда вы можете видеть не только
текущую позу персонажа или объекта, но и фазы его движения в предыдущих или последующих
кадрах. Все это одновременно, в одном кадре. Для того, чтобы визуализировать фазы движения
объекта, нужно прежде всего его анимировать, а затем воспользоваться операцией Animate=>Ghost
Selected.
В Option Box этой операции находится исчерпывающее количество параметров,
позволяющих задать количество предыдущих и последующих фаз, отступ их по времени друг от
друга и другие.
Констрейны
649
Для того, чтобы поэкспериментировать, можете открыть файл plateFinal.ma и, выбрав
анимированную рюмку, применять к ней операцию Animate=>Ghost Selected с различными
параметрами. Чтобы отменить отображение дополнительных фаз движения, достаточно
воспользоваться операцией Animate=>Unghost Selected.
Для того, чтобы задать цвета дополнительных фаз, надо очевидно сходить в Window=> Set-
tings/Preferences=>Color и там найти соответствующий раздел.
Playblast: предварительный просмотр анимации
Вы можете предварительно просмотреть нужный диапазон анимации, воспользовавшись
операцией Window=>Playblast. Ее основное предназначение - просмотр анимации в реальном
времени, то есть независимо от сложности сцены и производительности видеокарты. В Option
Box этой операции вы можете указать диапазон анимации и размер изображения, после чего MAYA
покадрово проиграет указанный диапазон и произведет захват экрана в каждом кадре.
По умолчанию, копии экрана собираются в Avi-файл, причем вы можете выбрать кодек и
степень компрессии так же, как вы делаете это в Adobe Premiere. Иногда бывает полезно получить
не один файл, а последовательность изображений (например, для печати), и в этом случае надо
выбрать опцию Viewer=fcheck, включив там галку Save to File.
Примечание. Захватить или проиграть последовательность «разрозненных»
кадров (например, ключевых фаз, номера которых вам известны) можно с помощью
соответствующей MEL-команды с флагом -frame
playblast -frame 13 -frame 24 -frame 65 -frame 84 -frame 99;
Поскольку операция Playblast использует захват экрана, не стоит перетаскивать окна по
экрану или смотреть неприличные обучающие фильмы во время ее работы. Все ваши лихорадочные
манипуляции с окнами попадут в результирующее изображение. К счастью, курсор мыши можно
бесстрашно возить по экрану во время проигрывания, даже если он очень большой.
650
Книга Сергея Цыпцына
Если у вас в сцене есть звук, он благополучно будет включен в результирующий Avi-файл.
Примечание. Быстрый доступ к операции Playblast можно получить, щелкнув правой
кнопкой мыши на временной линейке и выбрав последний пункт выпавшего меню.
Правда, по неясной мне причине, в Option Box вызванной таким образом операции
отсутствует задание диапазона проигрывания.
Работа со звуком
Иногда возникает задача синхронизации анимации и звука. MAYA не предлагает никаких
средств для автоматизации этого процесса. Все, на что вы можете рассчитывать, это наблюдать
волновую диаграмму звукового файла на временной шкале и слышать его в наушниках
(прослушивания в колонках вам не простят коллеги по цеху).
Для этого прежде всего надо импортировать звуковой файл в AAAYA: File=>lmport. Причем
MAYA «проглотит» звуковой файл «молча», ничем не обозначив факт появления нового объекта в
сцене. Чтобы его увидеть в интерфейсе MAYA, надо нажать на временной шкале правую кнопку
мыши и в меню Sound выбрать нужный объект, соответствующий звуковому файлу. После этого
прямо на временной шкале появится диаграмма этого файла. Можете проиграть анимацию в
надежде услышать звук.
Внимание. Чтобы звук был слышен при воспроизведении анимации, необходимо,
чтобы скорость проигрывания (Playback Speed) НЕ была установлена в Play Every
Frame. Чтобы звук проигрывался с нормальной скоростью, установите Playback
Speed=Realtime в установках анимации.
Констрейны
651
Совет. Установите высоту отображения временной шкалы максимальной, чтобы
«видеть звук» более крупно.
Для взрослых. Если вы думаете, что четырехкратная высота - предел мечтаний, вы приятно
заблуждаетесь. С помощью MEL-команд
global string SgPlayBackSlider;
timeControl -e -h 128 SgPlayBackSlider;
вы можете задать какую угодно высоту временной шкалы в пикселях.
Никаких средств склейки, разрезания, микширования звука MAYA не содержит. Для этого
есть соответствующие программы. Простейшие элементы монтажа имеются в TraX Editor, но они
ограничиваются прямыми склейками фрагментов, без возможности тримирования. Подробнее об
этом читайте в разделе про нелинейную анимацию.
Звук хранится в сцене как отдельный объект, у которого есть единственный анимируемый
атрибут offset, позволяющий задавать смещение начала проигрывания по времени. (Не забудьте
отключить в Outliner опцию Display=>DAG Objects Only.) В Attribute Editor вы также можете менять
имя ноды, ссылающейся на звуковой файл.
Для тех, кто все же хочет автоматически «привязаться» к звуку, могу лишь порекомендовать
плагин audioWave, входящий в состав Bonus Tools for MAYA. Он позволяет привязать любой числовой
атрибут произвольного объекта к амплитуде звука. Очевидно, что без предварительной обработки
звукового файла будет очень трудно избежать высокочастотной «тряски».
Еще раз про основной принцип анимации в MAYA
Даже если вы не дочитали эту главу до конца, а просто заглянули сюда ради любопытства,
то я с удовольствием еще раз вам напомню, что любая анимация объектов в MAYA, сводится к
манипуляциям с атрибутами этих объектов.
Итак:
Анимация в MAYA = манипуляции с атрибутами объектов
Если же вы прочитали эту безумную главу целиком, у вас может возникнуть некоторая
растерянность. Мало того, что в MAYA одно и то же действие можно выполнить различными
способами, так еще и типов и методов анимации существует столько, что не очень понятно, чему
же отдавать предпочтение.
652
Книга Сергея Цыпцына
№
Выбор типа анимации в конкретном случае: общий подход
Собственно, в определении предпочтений (а точнее, в адекватном выборе методов
анимации для той или иной задачи) и состоит искусство технического аниматора. Вернемся к
вышеописанным примерам.
Часы. Данную анимацию можно было сделать и с помощью обычных ключей (использовав
тип тангенсов Stepped). Однако, чтобы иметь возможность заставлять часы бегать взад и вперед
с переменной скоростью, проще всего использовать expression в совокупности с динамическими
атрибутами.
Когда при описании сцены превалируют термины «движение», «скорость», «хаотичность»,
имеет смысл задуматься о процедурной анимации. Это, очевидно, слишком общий совет, чтобы
использовать его буквально, однако вам стоит задуматься над тем, в каких словах описывать
будущую анимацию. Это поможет вам определиться с методами.
Телескопическая антенна. Положение звеньев описывается словами типа: «если первое
звено вытянулось больше, чем на некоторое расстояние, начинает двигаться второе звено, иначе
ничто не двигается, кроме первого звена и т.д.». Здесь, конечно, на ум сразу приходит технология
Set Driven Key, которая отлично описывает случаи типа «если здесь вот так, тогда там вот эдак».
Однако описать логику типа «если вот так, то ничего не делать» с помощью анимационных кривых
Set Driven Key довольно затруднительно, поэтому на помощь опять приходят expressions.
Шлагбаум. С первого взгляда понятно: речь идет о зависимости движения одного объекта
от другого. Фраза «когда паровоз близко, опустить шлагбаум» сразу определяет логическую
связь и поэтому остается выбрать между Set Driven Key и expressions. Использование последних
также возможно в этом случае, но редактировать высоту шлагбаума или близость паровоза через
expressions будет весьма ненаглядно и неудобно. Использование констрейнов в этом случае
бессмысленно, так как поворот шлагбаума зависит не от позиции паровоза, а от расстояния между
двумя объектами и не описывается в терминах «смотреть на» или «следовать за».
Коленвал. Передача вращений от одного вала к другому предполагает, что один объект
целиком зависит от второго и поэтому первый кандидат на использование - это констрейны.
Ориентация друг относительно друга типа «смотреть вдоль оси» сразу наводит на мысль об их
использовании. Конечно, с помощью вездесущих expressions можно решить и эту задачу, так
как в принципе зависимости углов поворота с трудом, но выписываются. Собственно, немного
стереометрической тригонометрии (или тригонометрической стереометрии) - и всё. Но
тригонометрия дает нам решения с особыми точками и всяческими сингулярностями, что чудовищно
затрудняет программирование. А вот механическая суть задачи абсолютна ясна: "смотри туда-то,
верх там-то".
Примечание, Один из не доказанных полностью, но весьма убедительных майских
постулатов гласит следующее: «любую анимацию можно сделать с помощью
expressions, вопрос только в длине кода». Похоже, что это так. Поэтому прежде, чем
начать решать очередную задачу настройки объекта для анимации, попробуйте
сначала использовать все остальные методы. Пусть expressions останутся вашим
последним шансом.
Кривошип. Здесь вращательно движение переводится в поступательное, а не наоборот,
поэтому использовать констрейны для содержательной части конструкции не представляется
возможным. Обратившись к литературному описанию задачи типа «если вал повернулся настолько-
то, поршень должен проползти до сюда», можно призвать на помощь технологию Set Driven Key и,
отбросив гордость, быстропроставить штуктридцатьключей, устанавливающихзависимость позиции
поршня относительно угла поворота вала во всем диапазоне вращений последнего. Это, пожалуй,
будет самый быстрый способ практического решения задачи. Менее доступный способ (поскольку
не все ведь помнят теорему Пифагора) заключается в методе пристального взгляда и ухватывании
сути или принципа зависимости перемещений от вращений с дальнейшим программированием с
помощью expression. Констрейны в данной конструкции играют вспомогательную роль и служат не
только согласователями движения, но и «поставщиками» информации об абсолютном положении
Констрейны
653
ИМИ!
объектов в пространстве. Это, кстати, одно из довольно частых применений констрейнов.
Кроме выше описанных методов для анимации некоторых конструкций (типа кривошипа), можно
применять методы инверсной кинематики, описанные ниже. Перевод перемещений в углы поворота
костей может использоваться как альтернатива констрейнам или expressions и применяться не
только внутри несчастных персонажей.
Кубик Рубика. Это довольно нетипичный способ применения деформеров для решения
твердотельной задачи, требующий нетривиального мышления или альтернативных методов
расширения сознания (например, холотропного дыхания). Я благодарю Володю Забелина за этот
пример. Обычно применение деформеров можно описать как дополнительную или параллельную
задачу, играющую вспомогательную роль по отношении к основной анимации. Кроме того,
необходимость применения того или иного типа деформаций обычно довольно очевидна и основана
на здравом смысле. Помните о том, что Blend Shape - король всех деформаций, а кластеры -
рабочие лошади.
Как вы могли заметить, собственно анимации в вышеприведенных примерах было весьма
немного. Львиная доля усилий была потрачена на подготовку объектов к анимации. В этом состоит
еще один терминологический парадокс: как правило, говоря об анимации, речь идет о подготовке
сцены (или части сцены) к анимации. Особенно это заметно при разговоре о персонажной анимации,
перейти к которой я сейчас собираюсь. Впрочем я уже давно рассуждаю о ней на пространствах
этой главы. Чем вышеупомянутые конструкции отличаются от персонажей? Ничем! Их тоже надо
придумывать, разрабатывать, настраивать, тестировать. Более того, если для антропоморфных
персонажей вы, как правило, можете попробовать подыскать уже существующее решение в виде
скелетона, готового к анимации, то моделируя, например, гусеницу танка или снегоуборочную
машину вы имеете дело с весьма хитрым персонажем, требующим довольно интенсивной
подготовки к анимации. После таких мизантропических заявлений можно, наверное, переходить
к персонажной анимации, в узком смысле этого термина.
Как я стал инструктором
Студенты часто спрашивают меня, как я докатился до такой жизни, что стал инструктором,
преподающим MAYA. Началось с того, что я пал довольно низко. Полгода я безвылазно сидел в
довольно глубоком, но уютном подвале, в одной небольшой частной студии, пребывая в должности
технического директора и ежедневно разбирая MAYA 1.0 на части. Впрочем, реально началось все
годом раньше...
В мае 1998 года компания Alias | Wavefront собственноручно убила будущие продажи AAAYA
в России, выпустив версию MAYA для WindowsNT. Все вокруг почему-то резко расхотели покупать
дорогие станции от Silicon Graphics за 30-40 тысяч долларов и еще быстрее передумали приобретать
MAYA за тридцать две тысячи долларов (без налогов и растаможки!). Однако инерция бизнеса
гораздо сильнее инерции мышления, и я продолжал себе работать в компании Steepler Graphics
Group, продавая и Silicon Graphics и Maya. Точнее, все еще пытаясь продавать, но чувствуя, что
скоро этому придет конец.
Конец подкрался незаметно и с другой стороны, но это случилось чуть-чуть позже...
А тем временем я лихорадочно соображал, куда ринуться в летний отпуск. Время на
подготовку виз, билетов и маршрутов было безнадежно упущено, и все, что оставалось мне и троим
моим друзьям, это взять последние из оставшихся билеты до Стамбула и попытаться отдохнуть
диким образом, вспоминая коктебельские вылазки. Добравшись до туретчины, мы сумели
закрепиться на несколько дней на берегу Мраморного моря и смягчить акклиматизационный удар
активным ничегонеделанием на песчаном пляже. Небольшое теплое море с молочно-белой водой,
расположенное внутри материка между Черным и Эгейскими морями и отделяющее Европу от
Азии, довольно быстро нам наскучило. Отчаявшись ждать заказанного в местном прокате джипа
с откидным верхом, мы с Антонио рванули обратно в Стамбул и добыли удивительную машину
- Фиат-Тофаз, нечто вроде турецких этнических Жигулей, с колоритным дизайном и мегаваттными
тормозами.
На следующий день, вооружившись картой турецкой местности, мы двинулись вглубь
страны, подальше от цивилизации. Довольно быстро проехав все побережье миниатюрного
Мраморного моря, мы выскочили к проливу Дарданеллы, открывающему выход в Эгейское
654
Книга Сергея Цыпцына
№
море. Зрелище представилось потрясающее: многокилометровая река-труба, вдоль которой
дует сильнейший ветер и снуют туда-сюда десятки, если не сотни отнюдь не крошечных судов.
С восторгом промчавшись вдоль этой бесконечной трубы, мы уперлись в паромную переправу
и обнаружили: Европа кончилась. Впереди и справа было Эгейское море, а слева бушевал
пролив, на другом берегу которого начиналась шокирующая Азия. Не без труда погрузившись на
паром, мы к обеду все же сумели переправиться на другой материк и продолжили углубляться в
малотуристические места. С большим удивлением обнаружив, что легендарная Троя находится
на территории Турции и, более того, прямо на пути нашего следования, мы, не раздумывая,
свернули на пыльную дорогу, которая и привела нас к невнятным раскопкам и кусочкам каменных
заборчиков, символизирующим былое великолепие Трои. Не обнаружив ни Брэда Пита, ни
съемочной группы, мы наткнулись лишь на отвратительного деревянного троянского коня высотой
с трехэтажный дом. Не став исследовать его внутренности, мы покатились дальше по азиатскому
берегу Эгейского моря, пока не попали на сказочную территорию. Эта область была, вероятно,
центром турецкого туризма в семидесятых годах, до тех пор, пока не случился феномен Анталии.
В результате нам удалось снять огромный двухэтажный дом, стоявший прямо на пляже. Вокруг
пустовали чудом сохранившиеся остатки туристической индустрии, и местные жители впадали в
длительный восторг при виде четырех туристов, жаждущих всего и сразу. В подвалах у местного
начальника пляжа мы разыскали доску и парус для серфинга, старый акваланг и еще массу
экзотических вещей. Целыми днями мы болтались в море на большом карбасе, лихо ведомым
начальником пляжа, ныряли, носились на доске, жарили устриц и думали, что мы в раю. Но выход
из рая нам указал Антонио: проснувшись однажды утром, он заявил, что у него безапелляционный
аппендицит. Погрузив его в наше чудо автотехники, мы бросились на поиски местного госпиталя.
Им оказалось довольно большое здание с бесконечным коридором, битком-набитое болезными
аборигенами. В этом коридоре жизнь кишела всеми своими оттенками: перед нами вдруг с
грохотом распахнулись двери одной из комнат и оттуда пулей выкатились высокие носилки,
на которых лежал только что прооперированный дедушка преклонных лет, задумчиво глядя на
нас. Хотя носилки стремительно умчались в комнату напротив, их никто не сопровождал! После
увиденного моральное состояние Антонио резко ухудшилось, зато физическое стало кардинально
улучшаться. В результате местный фельдшер не нашел никакой угрозы для его жизни, и мы
радостно выпорхнули из этого удивительного заведения обратно к себе в рай. Отрезанные в этом
раю от цивилизации, мы еще не знали, что в России акккурат в это время случился кризис и скоро
мы все поменяем работу, и многое другое...
Вернувшись к майским продажам, я обнаружил, что дела стали совсем плохи, Постепенно
забрезжила мысль, что этот период в моей жизни заканчивается. Я ведь уже два года отработал
в удивительной компании Steepler Graphics Group. Отработал с большим удовольствием, если
не сказать с вдохновением. Неформальная обстановка, начало рабочего дня в одиннадцать
утра, обучение за рубежом, поездки на выставки Siggraph, NAB, IBC, интересные проекты,
образованнейшие коллеги, студия в Лос-Анжелесе - все это стало для меня отличной возможностью
войти в индустрию компьютерной графики. Дима Озерец, директор компании, предвидя ближайшее
послекризисное будущее и свой отъезд в Америку, поступил достаточно благородно: чтобы не
оставлять людей без работы, он организовал слияние компании со своим злейшим историческим
конкурентом, фирмой Joy Company. Процедурно слияние прошло довольно гладко, и в новом
синдикате под названием SVGA никто не был уволен. Однако дух компании был безвозвратно
утрачен. Кроме того, добираться каждое утро на улицу Будайскую, в депрессивные коридоры
общежития ВГИКа, было совершенно невыносимо, особенно после хороших офисов Стиплера
около «Парка культуры». Последствия кризиса и полная смена атмосферы в компании привели к
тому, что лучшие специалисты стали покидать судно по собственной воле. Я оказался одним из
первых, поскольку получил предложение, от которого не смог отказаться...
И вскоре безвылазно сидел в уютном подвале, разбирая MAYA на части и собирая обратно.
Минуло полгода, и, невзирая на отсутствие продаж, компания Alias IWavefront прислала своих
представителей в Россию - проводить презентацию MAYA 2.0. С большой помпой был арендован зал
в отеле «Мариотт» на Тверской и разосланы приглашения реальным и потенциальным клиентам.
Каким чудом глава бельгийского офиса Барт Нэл нашел меня в моем подвале, я не знаю. Тем не
менее, я с удовольствием согласился помочь ему с переводом демонстрации. Не сказав, правда,
при этом, что вторую версию MAYA российские первопроходимцы Интернета выкачали уже пару
месяц назад и что я был в курсе всех их нововведений...
Презентация программного обеспечения - вещь довольно бесхитростная. Демонстратор
имеет сценарий, то есть последовательность действий, отступать от которых запрещается.
Также он имеет набор фраз, которые обязан произнести. Ни больше, ни меньше. Однако в
Констрейны
655
1ШШ
Москве все случилось иначе. Честно сказать, я просто не удержался. Демонстратор по имени
Скотт, робко запустил новую AAAYA и сказал, что интерфейс программы претерпел значительные
изменения, после чего последовал перевод фразы, комментарии по этому поводу, обзор этих
изменений и выражения восторга по их поводу на могучем русском языке. Затем Скотт пугливо
продемонстрировал пару этих изменений и вопросительно посмотрел на меня, я воспользовался
заминкой, завладел мышкой, перевел информацию на русский, продемонстрировал еще десяток
новых возможностей, ответил на внезапные вопросы и невинно посмотрел на Скотта. Он боязливо
сказал пару предложений про улучшения в области моделинга, я с нетерпением дождался конца
второй фразы и разразился длинной восторженной речью по этому поводу, сопровождаемой бурной
демонстрацией этих улучшений. Сначала Скотт был сильно удивлен, насколько много русских
слов требуется для перевода лаконичных английских демо-фраз, однако, почувствовав неладное,
конфузливо заикнулся о новом окне HyperShade. Тут меня прорвало. Я разложил HyperShade на
экране вдоль и поперек, вывернул его наизнанку, сравнил с Multilister, заставил упасть, запустил
заново, ответил на шквал вопросов и через двадцать минут целомудренно посмотрел на Скотта в
ожидании очередной фразы для перевода. Скотт все понял, не стал обижаться и в дальнейшем
произносил только ключевые слова типа «анимация» или «рендеринг», провоцируя очередной
залп восторгов, комментариев и критики. Излишне упоминать, что презентация несколько
подрастянулась, однако назвать ее скучной не осмелился бы самый законченный пессимист.
Аудитория была возбуждена и довольна, АЛАУА- великолепна, а я получил, наконец, возможность
высказаться. После демонстрации Скотт сконфуженно заявил Барту, что наверное в Россию не
стоит привозить демонстраторов и что эти безумные русские знают все гораздо лучше, несмотря
на полную засекреченность бета-версий.
После этого Барт подошел ко мне и совершенно искренне сказал, что хочет помочь мне
стать инструктором и для этого необходимо несколько раз съездить в Бельгию на обучение и
экзамен. Это было в мае 1999 года, а в июле, преодолев кошмары получения бельгийской визы, я
уже летел в Брюссель. Так я стал инструктором АЛАУА.
656
Книга Сергея Цыпцына
Деформеры
Основная идея
В принципе вы можете деформировать объекты, просто перетаскивая их компоненты и
редактируя таким образом их форму. Однако для некоторых характерных деформаций удобно
иметь некоторые манипуляторы, быстро изменяющие форму объекта. К тому же, если модель
довольно сложная, в дополнение к существующему набору контрольных вершин хочется иметь
дополнительный и не такой насыщенный набор компонент или манипуляторов, позволяющий
осуществлять более «грубое» и глобальное редактирование. Примером такого набора могут служить
решетки Lattice, имеющие небольшое количество точек для редактирования формы объекта.
Квинтэссенцией такого подхода является деформер Wrap, позволяющий деформировать один
объект (или объекты) с помощью формы другого объекта. В этом случае форму деформируемого
объекта можно изменять с помощью набора контрольных вершин другого объекта. Очевидно,
что этот дополнительный набор компонент должен быть меньше и проще в использовании, чем
«родные» точки деформируемого объекта.
Такие новые наборы компонент могут быть оперативно созданы в любом количестве и
удалены в любой момент.
Вывод. Помните, что большинство деформеров- это просто дополнительные
комплекты контрольных вершин или удобных манипуляторов, в дополнение к
компонентам деформируемого объекта.
Возможно, вы уже поэкспериментировали с деформерами и даже, продравшись сквозь
некоторое количество упражнений, упустили из виду одну важную вещь.
Деформеры действуют на компоненты объектов, а не на сами объекты. Перед созданием очередного
деформера не обязательно выбирать сам объект: можно выбрать только часть его компонент.
Причем выбранные компоненты не обязательно должны принадлежать одному объекту.
Отсюда следует, что деформируемыми могут быть все объекты, имеющие компоненты, а не
только поверхности. Форма кривых также может быть модифицирована с помощью деформеров.
Более того, деформирующие решетки Lattice также могут быть объектом деформации, так как
имеют собственные компоненты типа Lattice Points. Даже капризные частицы можно заставлять
изменять свою траекторию, накладывая на них нужный деформер.
Любой деформер можно рассматривать как дополнительное средство моделирования,
позволяющее изменять некоторые участки поверхности целиком, с помощью удобных
манипуляторов. Зачастую бывает удобнее быстро «согнуть» модель, создав деформер, настроив
Деформеры
657
ними
его атрибуты и удалив его, убив историю, чем таскать точки вручную.
Терминологический комментарий. Я употребляю термин «деформер» на основе устной
майской традиции. Более литературный термин, «деформатор», не сильно отличается на слух, но
пишется длиннее и звучит как-то не по-русс... - то бишь, не по- майски. Кроме того, неправильное
истолкование этого термина просто исключено.
Типичный ритуал применения деформеров.
Создание и удаление деформеров
Перед созданием и применением деформера надо выбрать объект для деформаций. Это
может быть один или несколько деформируемых (то есть имеющих компоненты) объектов, набор
вершин или даже все вместе: и вершины и объекты.
После выбора следует создать нужный деформер изменю Deform и заняться редактированием
его атрибутов в Channel Box или в Attribute Editor (если это Lattice или Wrap, то можно, очевидно,
редактировать их форму на экране).
Если вы используете деформер как средство моделирования, возможно, вам очень скоро
захочется удалить его, оставив на поверхности лишь результат деформаций. Однако удаление
самого деформера приведет к исчезновению всех деформаций, им вызванных. Для того, чтобы
удалить только деформер и сохранить результат, следует просто выбрать деформируемый объект
и удалить на нем историю (Edit=>Delete by Type=>History). MAYA сама удалит деформер и все, что
с ним связано.
Итак, овладев искусством создания и удаления деформеров, вам остается только изучить
их типы и атрибуты, последовательно перебрав их в меню Deform. Я вкратце опишу основные
типы и даже приведу экзотические примеры, а затем остановлюсь на более тонких моментах
использования деформеров и их внутреннем устройстве.
Типы деформеров. Нелинейные деформации
В меню Deform=>Create Nonlinear находятся некоторое количество пунктов для создания
нелинейных деформеров. Нелинейные деформации описываются некоторой математической
функцией и позволяют деформировать выбранную геометрию некоторым характерным,
процедурным образом, то есть изменяя параметры деформации целиком в виде значений
атрибутов, а не редактируя компоненты вручную. Они служат для выполнения некоторых типичных
и часто встречающихся глобальных деформаций типа скручивания, сжатия с сохранение объема
или волнообразных искривлений. Напомню, что перед их применением не обязательно выбирать
объект целиком, а можно выбрать лишь часть компонент.
Примеры бытового применения нелинейных деформеров довольно банальны и часто
иллюстрируются использованием их в целях моделирования. Я приведу более радикальный
пример их использования в качестве замены (или дополнения) динамический полей для создания
658 Книга Сергея Цыпцына
№
эффекта вихря. Коль скоро частицы имеют компоненты, они, следовательно, представляют
собой деформируемые объекты. Проверим это на практике. (Если вы совсем не знакомы с
динамикой, загляните в соответствующие главы. Впрочем, для выполнения этого примера это
необязательно.)
Деформация частиц
Создайте в новой сцене источник частиц: Particles=>Create Emitter.
Чтобы сделать из него тонкую, расходящуюся вертикальную струйку, установите для него
в Channel Box следующие атрибуты:
emitterType=Directional;
directionX=0;
directionY=1;
directionZ=0;
spread=0.1.
Теперь проиграйте анимацию, выберите частицы и создайте для них нелинейный
скручивающий деформер: Deform=>Create Nonlinear=>Twist.
Вокруг частиц появится манипулятор деформера, располагающийся явно не в начале
коодинат.
Примечание. Большинство деформеров создаются не в начале координат, а в
центре области, окружающей выбранные объекты. Вы может переместить
деформер после создания в удобную для вас позицию. Это же касается и ориентации
деформера - поворачивайте его так, как вам необходимо.
Задайте в Channel Box для манипулятора деформера translateX=translateZ=0, чтобы
сместить его в центр. Покрутите прямо в Channel Box значение endAngle у ноды twistl, отвечающей
за деформацию.
Проиграйте анимацию сначала, убедитесь, что частицы закручиваются. Чтобы сделать
довольно свирепый вихрь, установите endAngle=10000.
Обратите внимание, что траектории частиц перестают деформироваться, как только
они покидают область, обозначенную манипулятором деформера. Если вы хотите увеличить эту
область, поиграйте с атрибутом highBound.
Деформеры
659
Если вы хотите, чтобы частицы не вылетали за границу деформера, ограничьте им время
жизни. Выберите частицы, откройте Attribute Editor и в закладке particleShapel установите в
разделе Lifespan Attributes следующие значения:
Lifespan Mode=Constant;
Lifespan=8.
Значение атрибута Lifespan подберите так, чтобы частицы умирали, не долетев до верхней
границы деформера.
Пытливые умы конечно заметили, что в Attribute Editor присутствуют две одинаковые
закладки для формы частиц.
Первая (particleShapel) соответствует недеформированным частицам, и по-прежнему
определяет все динамические свойства, а вторая (particleShapel Deformed) соответствует
частицам после деформации. Если вы хотите написать expression или изменить время жизни,
нужно пользоваться первой закладкой. Если же хотите изменить визуальный тип частиц, то это
надо делать во второй закладке.
Зайдите в закладку particleShapel Deformed, спуститесь до раздела Render Attributes и
установите Particle Render Type=Streak.
Можете также нажать кнопку Current Render Туре и установить Line Width=2 и Tail Size=2.
660
Книга Сергея Цыпцына
Вернемся к деформерам.
Сохраните сцену (twisterStart.ma).
Если это вихрь или даже смерч, ему положено изгибаться.
Выберите частицы и создайте для них нелинейный изгибающий деформер:
Deform=>Create Nonlinear=>Bend.
Опять возникнет манипулятор деформера, находящийся явно не в центре координат.
Поместите его туда, установив в ноль все его атрибуты translate.
Затем выберите в Channel Box ноду bendl и задайте значение curvature=0.3, чтобы изогнуть
поток частиц. Поиграйте также в атрибутом highBound, чтобы задать границу действия этого
деформера.
Оживим немного статический вихрь. Прежде всего, ему положено хаотически извиваться
в разные стороны. Вооружившись терпением, быстро поставьте некоторое количество ключей на
атрибут curvature - это заставит поток изгибаться «туда-сюда».
Тем, кто особенно ленив, я предлагаю выбрать bendl на экране или в Outliner, открыть
Attribute Editor и там в закладке bendl разыскать атрибут curvature и вписать для его значения
следующую формулу:
=0.3*noise(time);
Деформеры
661
High Bound [2 000 ' J
Нажав Enter, вы создадите нехитрый expression, который будет изменять атрибут деформера
bendl и гнуть поток из стороны в сторону.
Для пущей метеорологичности предположим, что наша струя должна еще вращаться
вокруг собственной вертикальной оси. Этого просто добиться, проанимировав атрибут rotateY
манипулятора bendHandlel.
Если вам, как обычно, лень возиться с ключами и бесконечностями в Graph Editor, просто
откройте Attribute Editor для bendHandlel и впишите для rotateY следующее заклинание:
=frame*5;
Это задаст равномерное вращение потока вокруг вертикали (угол поворота в градусах
равен номеру кадра, умноженному на пять).
Тут можно было бы поставить точку. Однако некоторых «юных метеорологов» может
смутить правильность формы и равномерность потока. Чтобы вручную немного «искривить» струю
и задать области, где частицы двигаются с ускорением или с замедлением, воспользуемся еще
одним типом деформеров.
Решетки Lattice. Free Form Deformation
Выделите частицы, когда они достигли границы и создайте для них деформирующую
решетку: Deform=>Create Lattice.
Вокруг частиц появится решетка. И опять не в центре.
При попытке сдвинуть решетку в центр, частицы также смещаются вместе с ней, что
полностью нарушает все картину. Чтобы сдвинуть решетку, не трогая частиц, а заодно немного
растянуть ее, чтобы поток целиком помещался внутри нее, сделайте следующее.
Выберите в Outliner два объекта: ffdl Lattice и ffdIBase.
Затем сдвиньте их по горизонтали в центр и растяните в стороны, чтобы поток помещался
внутри.
662
Книга Сергея Цыпцына
Теперь нажмите над решеткой правую кнопку мыши и выберите компоненты решетки
Lattice Point.
Выберите второй и третий ряд точек и сожмите их с помощью Scale Tool, а затем
приподнимите немного наверх.
Это сделает струю тоньше в указанной области. Кроме того, в начале потока частицы
начнут лететь быстрее, так как там деформирующая решетка более «разреженная».
Деформеры
663
Однако если хорошенько подумать, выяснится, что деформирующую решетку надо было
бы применить к потоку до создания нелинейных деформеров, чтобы сначала струя растягивалась
и пережималась решеткой, и только потом изгибалась и скручивалась остальными деформерами.
Таким образом, возникает понятие порядка деформаций. О нем я поговорю подробнее позже,
а сейчас посмотрим, как можно исправить положение. Конечно, можно быстро переделать все
заново (в половине случаев, этот метод - самый быстрый). Однако попробуем обойтись без него и
изменить порядок деформаций вручную.
Нажмите над частицами правую кнопку мыши и в выпавшем меню выберите lnputs=>AU
Inputs.
Появится окошко List of input operations for particlel.
В нем перечислены все операции, имеющие историю и применявшиеся к выбранному
объекту. В данном случае это список деформеров. Список этот читается снизу вверх. Решетка
Lattice фигурирует в нем под дивным именем Ffd1(ffd1) и под номером три.
Перетащите в этом окне средней кнопкой мыши надпись Ffd1(ffd1) с третьей позиции вниз
на первую позицию, отпустите ее над Nonlinear(twistl). Порядок деформаций поменяется, это
сразу будет заметно при анимации.
664
Книга Сергея Цыпцына
Теперь вы можете взять два верхних ряда точек решетки и как следует их растянуть и
приподнять, чтобы создать «шапку» у вихря. Держите постоянно в уме порядок деформаций - это
поможет предсказать движение частиц.
Про то, как выбрать подходящий тип визуализации и просчитать изображение, можно
узнать в главе про частицы.
Примечание, Для решетки Lattice можно задать поведение деформированного
объекта за пределами решетки. По умолчанию, он там просто не деформируется.
С помощью атрибута Outside Lattice для ноды ffd в Attribute Editor можно задать
мягкое затухание деформаций (Falloff) или продолжение деформаций (АН) за
пределами решетки.
Важное примечание для любителей частиц. При подстановке объектов в деформированные
частицы с помощью Particle Instancer возникнут проблемы. Если аккуратно открыть
Option Box операции Particles=>lnstancer, можно прицепить инстансируемые объекты именно к
деформированному «шейпу» (particleShapel Deformed). Однако основная проблема в том, что для
него не работают expressions! А без них толком настроить Instancer вряд ли удастся. Выход состоит
в следующем: прицеплять Instancer надо все-таки к недеформированным частицам. Для них надо
завести per-particle атрибут типа vector и назвать его, например, deformed Pos. Далее нужно создать
runtime expression простого вида: "particleShapel. deformedPos= particleShapel Deformed,
position". Затем в атрибутах для Instancer надо вместо обычной связи position=worldPosition, выбрать
position= deformedPos. Таким образом, позиция деформированных частиц будет передаваться
недеформированному «шейпу». Также можно поступить и с остальными атрибутами.У данного
трюка есть один маленький недостаток. Инстансированные объекты будут отставать от частиц на
один кадр, правда, это будет заметно только на очень больших скоростях.
Деформеры
665
нмш
Устройство решеток Lattice и работа с ними.
Двойные решетки. Алгоритм деформации
Как и в случае большинства деформеров, для создания решетки достаточно выбрать
объект или часть компонент и выполнить Deform=>Create Lattice.
Имя решетки обычно начинается с "ffd", что означает free form deformation (деформация
произвольной формы). В отличие от нелинейных деформеров, задающих только определенный тип
искажений формы, решетки позволяют деформировать объект произвольно, редактируя вручную
компоненты решетки под название Lattice Points.
Терминологический комментарий. Lattice переводится с английского как «решетка»,
поэтому особых трудностей с переводом термина не возникло. Но в устной майской традиции все
же чаще всего встретишь употребление термина «латтис», с ударением на любом слоге.
Коль скоро решетки имеют компоненты, они сами по себе - деформируемые объекты.
Следовательно, их можно деформировать с помощью других деформеров, включая такие же
решетки.
Посмотрим повнимательнее на принцип работы этого деформера. Каждый раз, когда вы
создаете деформационную решетку, вы реально получаете две решетки.
Если вы заглянете в Outliner, то увидите, что рядом с основной решеткой, с именем типа
ffdlLattice, существует еще дополнительная базовая решетка, названная ffdIBase (я называю ее
«базовой» лишь по созвучию с ее именем). Основную решетку вы можете видеть и выбирать на
экране. Именно ее редактируют за компоненты Lattice Point. Базовая решетка видна только в
Outliner, пока ее не выберут, и ее форма остается нетронутой.
Основная идея и алгоритм работы решеток заключается в том, что степень деформации
определяется разницей между формами основной и базовой решеток. Когда вы таскаете за
666
Книга Сергея Цыпцына
точки основной решетки, соответствующие точки базовой решетки остаются на месте. MAYA
вычисляет расстояния между точками этих решеток и деформирует объект пропорционально этим
расстояниями в тех местах, где необходимо.
Кроме того, на экране вы можете выделять только основную решетку. Поэтому когда,
например, вы пытаетесь выбрать ее целиком и передвинуть, то сдвигается весь деформируемый
объект, так как точки основной решетки «уезжают» от точек базовой, a MAYA вычисляет и применяет
плоско-параллельную деформацию, воспринимаемую как смещение объекта.
В некоторых ситуациях необходимо передвинуть или растянуть решетку относительно
деформируемого объекта, не трогая сам объект. Например, решетка создалась вокруг объекта, но
ее положение и ориентация относительно объекта вас не устраивают. Иногда случается так, что
объект не влезает в решетку и надо ее растянуть и повернуть. Во всех этих случаях следует выбрать
обе решетки и провести необходимые трансформации с ними. Деформируемый объект меняться
при этом гарантированно не будет, так как точки решеток при поворотах или перемещениях друг
относительно друга не смещаются.
Примечание. Этот принцип относится не только к решеткам, но и к некоторым
другим деформерам, например, к Wrap или Wire. Если после создания деформера
вы видите, что в Outliner рядом с ним появился объект с названием типа xxxBase,
то можете быть уверены, что этот деформер работает по вышеописанному
принципу - деформации вычисляются пропорционально разнице между формой
базового и основного деформеров.
Напомню, что решетки удобно рассматривать как новый комплект контрольных точек
для объекта, позволяющий делать производить глобальное редактирование формы объекта с
помощью небольшого числа точек. Количество точек решетки можно задавать либо при создании
деформера, либо для уже существующего деформера, отредактировав в Channel Box атрибуты S-
T-U-Divisions у ноды ffdnLaticeShape.
Для того, чтобы изменить количество ячеек решетки после того, как вы отредактировали
ее точки, необходимо сначала вернуть ее в первоначальную форму. Это можно сделать с помощью
операции Deform=>Edit Lattice=>Remove Lattice Tweaks (удалить смещения точек решетки).
Среди полезных атрибутов самой решетки можно выделить параметр Local, включенный по
умолчанию. Он определяет, что каждая точка решетки будет оказывать влияние не на весь
деформируемый объект, а лишь на его компоненты в области, определяемой атрибутами localln-
fluence. Эти атрибуты определяют окрестность влияния, измеряемую в ячейках сетки.
Деформвры
667
IlIUMi
Если двигать сам деформируемый объект, а решетку оставить на месте, то «вылезая»
из решетки, объект стремиться занять свою первоначальную форму. Это не всегда желательно,
поэтому для определения того, как ведет себя часть объекта не влезающая в решетку, существует
атрибут Outside Lattice. С помощью него можно даже задать «мягкое» возвращение (Falloff) к
первоначальной форме - по мере удаления от решетки.
Когда решетка создается для подвижных объектов, то хорошей идеей может быть
«припарентивание» решетки к объекту для совместных движений. В этом случае полезной будет
также группировка основной и базовой решеток вместе во избежание разъезжания. Все эти опции
можно включить в Option Box операции Create Lattice.
Wrap deformer. Решетка произвольной формы.
Обобщенные деформации
Деформационные решетки типа Lattice имеют строго определенную структуру, задающую
строго прямоугольную форму. У пытливых умов может возникнуть вполне предсказуемый вопрос:
а можно ли деформировать форму одного объекта формой другого объекта. То есть вместо
прямоугольного набора точек решетки использовать компоненты произвольного объекта.
Для таких целей имеется деформер типа Wrap. Для его создания необходимо сначала
выбрать деформируемый объект (или объекты), а затем выбрать деформирующий (влияющий)
объект (influence object). После этого следует выполнить операцию Deform=>Create Wrap.
Терминологический комментарий. Деформирующий объект часто называют «объектом
влияния» (influence object), подчеркивая его свойство влиять на форму и поведение других
объектов.
В качестве «объекта влияния» может выступать любая сплайновая кривая, либо
полигональная или сплайновая поверхность.
Так же, как и в случае с решетками, в дополнение к деформирующему объекту в сцене
появляется его копия с суффиксом Base. Все деформации вычисляются пропорционально разнице
между формами основного деформирующего объекта и базового объекта.
Создайте полигональный цилиндр, растяните его по вертикали и задайте побольше
горизонтальных сечений (subdivisionHeight=20).
Создайте сплайновую сферу, растяните ее по вертикали в форме яйца.
Теперь выберите сначала цилиндр (как деформируемый объект), а затем сферу (как
деформирующий) и выполните Deform=>Create Wrap.
Убедитесь, что в Outliner возникла скрытая копия сферы nurbsSpherelBase, являющаяся
базовой формой для деформера Wrap.
Выберите сферу на экране и потащите за одну из ее контрольных вершин.
668
Книга Сергея Цыпцына
Атрибут Weight Threshold деформера Wrap, позволяет задать степень влияния точек
деформирующего объекта, в зависимости от их близости к поверхности деформируемого объекта.
Это позволяет управлять гладкостью деформации.
Атрибут Max Distance позволяет определить радиус влияния точек деформера. Значение
ноль означает, что область влияния бесконечна.
Применение деформера Wrap довольноразнообразно. Прежде всего этовсяческиекосвенные
деформации. Например, у вас есть высокополигональная модель и вы собираетесь привязать ее к
скелету. Вместо того, чтобы привязывать модель напрямую, а потом часами возиться с настройкой
скининга, проще взять низкополигональную копию модели, привязать ее к скелету, а затем
сделать ее деформером Wrap для высокополигональной модели. Настроить скиниг в этом случае
будет проще, а все трансформации скелета будут передаваться сначала на низкополигональную
модель, и затем автоматически, через Wrap-деформер, на высокополигональную. Такой способ
называют непрямым (косвенным) скинингом (indirect skinning). Этот же метод часто используется
и с решетками Lattice, когда к скелету привязывается только решетка, а основная модель
деформируется с помощью решетки.
Другим примером могут служить мышечные деформации. Изготовив прототип мышцы, вы
можете прикрепить его к нужной кости скелетона и назначить объектом влияния на основную
модель, прискиненную к скелетону. Деформируя форму мышцы, вы будете изменять поверхность
модели. Связав угол поворота кости со степенью деформации мышцы1 через функцию Set Driven
Key, вы можете получить автоматическое сокращение мышцы при сгибе конечности.
Я еще вернусь к деформеру Wrap в главе про настройку персонажей, а сейчас вкратце
опишу два его частных случая.
Деформеры Sculp и Wire
Из-за своей «произвольной» природы деформер Wrap нельзя назвать эталоном образцовой
производительности, он к тому же и не обладает большим количеством настроек. Кроме того,
его действие вычисляется на основе координат его контрольных точек, а не самой поверхности.
Поэтому производимые им деформации могут быть не всегда достаточно гладкими.
Есть два частных случая этого деформера, позволяющие деформировать объекты с помощью
сплайновой кривой или сплайновой поверхности. Причем деформации вычисляются не на основе
разницы между основными и базовыми контрольными точками, а в зависимости от взаимного
расположения деформера и поверхности, а также многочисленных атрибутов-настроек.
Деформер Sculp позволяет использовать в качестве деформирующего объекта либо сферу-
манипулятор, либо произвольную NURBS-поверхность. В последнем случае производительность
резко снижается и сильно зависит от «насыщенности» NURBS-поверхности. Количество настроек
этого деформера столь велико, а популярность его столь невелика, что не имеет смысла
останавливаться на нем подробнее.
1 См. ниже про атрибут envelope.
Деформеры
669
Деформер Wire позволяет деформировать поверхность с помощью кривой, по принципу
схожему с Wrap-деформером. Однако количество настроек и производительность делают его
более эффективным в тех случаях, когда нужно «потащить» поверхность за конкретное место или
создать «волну» на поверхности.
Так как в одном деформере может быть несколько деформирующих кривых, то создание
этой деформации оформлено в виде инструмента Deform=>WireTool, а не в виде простой операции,
как для остальных деформеров. Он имеет массу настроек-атрибутов и некоторое количество
дополнительный операций в меню Deform=>Edit Wire.
Совет. Если хотите «прогнать волну» с помощью деформера Wire, не забывайте
выбрать основную кривую и спрятанную базовую кривую, чтобы перемещать их
вместе.
Wire-деформер очень полезен при моделировании и позволяет «ущипнуть» или выдавить
углубление на поверхности, не путаясь в рядах контрольных вершин. Особенно если принять во
внимание, что вы можете создавать «кривые на поверхности», о которых говорилось в главе про
моделирование.
Анимация губ персонажа - еще один пример применения этого деформера.
Кроме того, Wire-деформер имеет ряд замечательных тайных свойств, подробнее о которых
вы можете прочитать в разделе про практические аспекты настройки персонажей.
670
Книга Сергея Цыпцына
№
Jiggle-деформер. Остаточные явления
Хорошая анимация органических форм, не говоря уже о рисованных персонажах,
невозможна без остаточных движений. Любой внезапно остановившийся объект (или же резко
сменивший направление движения) обязан как-то деформироваться - если только он не являет
собой фотореалистичный космический корабль. Для автоматизации создания таких остаточных
деформаций и служит Jiggle-деформер.
Перед его созданием разумно выбирать не весь объект, а лишь те его части (в виде
компонент), которые предполагаются «мягкими», а значит будут деформироваться при движении
и остановках. Уши слона-шпиона или ноги ожиревшего динозавра - вот первые кандидаты на
применение Jiggle.
После создания этого деформера MAYA анализирует движение деформируемого объекта и
создает необходимые «запаздывания» в движении вершин объекта. Можно представить себе, что
к оригинальному объекту прикрепляется его копия, притом таким образом, что каждая вершина
привязывается небольшой пружинкой к соответствующей вершине изначального объекта.
Жесткость и затухание этих мысленных пружинок определяются атрибутами stiffness и damping.
Чтобы запаздывания в движении не проявлялисьодинаково для всех вершин, можно отредактировать
их веса, покрасив их с помощью инструмента Deform=>Paint Jiggle Weights Tool. На более темных
участках остаточные движения будут менее заметны.
Иногда полезно применять Jiggle-деформер не к самому объекту, а, например, к
решетке Lattice, которая влияет на поверхность и двигается вместе с ней. Это позволяет достичь
более гладких движений и требует меньше времени для просчета остаточных деформаций,
так как вычисления производятся для немногочисленных точек решетки, а не для вершин
деформирующегося объекта.
Следует понимать, что остаточные деформации вычисляются «на ходу», то есть каждый
раз прямо во время анимации. В этом смысле Jiggle-деформер можно условно отнести к динамике
частиц и пружин. Для оптимизации проигрывания анимации и улучшения интерактивности после
окончательной настройки атрибутов имеет смысл запоминать движения деформируемых компонент
в кэш-файл, как это делается для частиц или для динамики одежды (Deform=>Create Jiggle Disk
Cache). После создания кэш-файла деформации больше не просчитываются, а читаются с диска.
Очевидно, что если анимация объекта изменилась, кэш-файл нужно пересчитать.
Кластеры - группирование компонент и объектов
Рабочими лошадками в мире деформеров являются кластеры. Они позволяют быстро
создавать локальные деформации в нужных местах, настраивать их вес и область действия.
Идея кластеров состоит в том, что вы можете выбрать любые компоненты или объекты и создать
для них удобный манипулятор (Deform=>Create Cluster), позволяющий двигать, вращать или
растягивать их как единый объект. Формально говоря, вместе с кластером создается новая trans-
form-нода, с помощью которой можно не только трансформировать выбранные компоненты и
объекты, но и ставить на них ключи, писать expressions, в общем анимировать их, как угодно.
В отличие от группировки объектов (Edit=>Group), также создающей новую transform-ноду,
кластеры позволяют «группировать» не только объекты, но и компоненты. Кроме того, кластеры,
в отличие от групп, обладают еще массой полезных свойств, определяемых их атрибутами.
Основное свойство кластеров - их «всеядность». Они могут включать в себя любые компоненты
любых объектов, а также сами объекты вперемежку с компонентами. Даже парочку частиц можно
объединить в кластер и оттащить от общего потока.
Деформеры
671
Анимация формы кривой часто делается с помощью кластеров. Движение всяких плавников,
хвостов, ушей и прочих болтающихся деталей создается с помощью кластеров, включающих в
себя нужные компоненты поверхностей.
Очевидно, что если вы создаете кластеры, например, для плавников плывущей рыбы, то
чтобы не терять их из вида, будет полезно «припарентить» их к основной геометрии, чтобы они
«плыли» рядышком. Но тогда, очевидно, мировые координаты кластера будут изменяться и это
должно вызывать деформацию. Для таких случаев у кластеров есть атрибут Relative, который
задает, что деформации будут происходить только при непосредственном перемещении самого
кластера, а все трансформации вследствие движения родительских объектов и групп не будут
оказывать влияния на деформацию. Причем по умолчанию этот атрибут включен (Relative=On), так
что вы можете смело включать кластеры в иерархию вашей модели.
Но главное свойство кластеров заключается в том, что они перемещают компоненты
деформируемых объектов не одинаковым образом, а в соответствии с их весами. При создании
кластера все компоненты, попадающие в него имеют вес, равный единице, и поэтому перемещаются
вслед на манипулятором кластера (в виде буквы С) все вместе и одинаково. Однако есть
возможность отредактировать веса точек, входящих в кластер, чтобы изменить степень влияния
кластера на них и обеспечить гладкие деформации.
Если вы, к примеру, анимируете движение ушей тушкана с помощью кластера, разумно
предположить, что точки на кончиках ушей должны смещаться сильнее при движении кластера,
чем точки в основании ушей (см. в tuskan.ma).
Конечно, вы всегда можете выбрать контрольные точки поверхности, открыть Component
Editor и там, в закладке Weighted Deformers, вручную вписать веса точек. Однако такой метод
годится, пожалуй, только для кривых, но не для поверхностей.
Для деформированных кластером поверхностей можно задать веса точек, покрасив
области влияния в черно-белые оттенки, используя Paint Cluster Weights Tool.
Для этого сначала удобно передвинуть сам кластер, создав деформацию, и только потом
выбрать поверхность и взять в руки инструмент раскраски весов Paint Cluster Weights Tool. Во время
рисования и области и степень влияния кластера будут обновляться интерактивно. Очевидно, что
672
Книга Сергея Цыпцына
более светлые участки означают большие веса точек и подвержены большему влиянию кластера,
а более темные области меньше подвержены деформации. Черные участки не деформируются
вообще.
Совет. Во время раскраски весов используйте операцию Replace с осторожностью
и всегда задавайте совместно с ней небольшое значение Opacity для кисти. Для
плавного распределения цвета хорошо подходит операция Smooth. Для усиления
влияния (добавление белого цвета) используйте операцию Add с небольшим
значением Value, для уменьшения влияния - операцию Scale и значение Value, немного
меньшее единицы.
Во время рисования удобно временно выбирать кластер, передвигать его и снова
возвращаться к рисованию весами для настройки деформации во всем диапазоне движений
кластера. Для этого имеет смысл сделать небольшую временную анимацию кластера и двигать
его, щелкая мышкой по таймлайну и не выходя из режима рисования.
Пример использования кластеров: кубик Рубика.
Типичное применение кластеров обычно подразумевает работу с компонентами и
деформацию кривых и поверхностей. Однако в некоторых случаях они могут использоваться
для анимации наборов простых объектов, когда использование группировки или иерархической
анимации не представляется возможным. В этом случае кластеры используются в качестве
«временных групп» для анимации только на определенном интервале времени. Обычные группы
не позволяют одному объекту входить в несколько разных групп, кластеры же допускают такое
неоднократное вхождение. Рассмотрим характернейший пример (я благодарю Володю Забелина
за его идею и реализацию).
Создайте в новой сцене модель кубика Рубика.
Если вы все сделаете правильно, у вас в сцене должно появиться двадцать семь маленьких
кубиков (я предполагаю, что кубик Рубика классический, три на три, без дополнительных
украшений - см. сцену rubikStart.ma).
Подумайте, как бы вы стали последовательно вращать стороны этого кубика. Для каждой
грани из девяти кубиков явно требуется свой центр вращения. Однако группировка не поможет,
так как некоторые кубики входят сразу в три грани и должны независимо вращаться в составе
каждой их них. Воспользуемся кластерами.
Выделите верхнюю грань (9 кубиков) и объедините их в кластер (Deform -> Create Cluster).
Деформеры
673
Нажмите клавишу «s».
Это поставит ключи на все атрибуты только что созданного кластера.
Перейдите в двадцатый кадр.
Поверните выбранный кластер на 90 градусов вокруг оси Y.
Снова нажмите «s».
Теперь, находясь в двадцатом кадре (с повернутой верхней гранью), спрячьте, от греха
подальше, имеющийся кластер (Display=>Objects Display=>Template).
Затем выделите 9 кубиков на боковой грани и создайте для них еще один кластер.
Тут же нажмите «s», чтобы поставить ключи на все атрибуты нового кластера.
674
Книга Сергея Цыпцына
Перейдите в сороковой кадр и поверните кластер на 90 градусов вокруг нужной оси.
Сразу нажмите «s», чтобы поставить ключи.
Если хватает терпения, то находясь в сороковом кадре, спрячьте второй кластер (Display=>Objects
Display=>Template).
Затем выделите 9 кубиков на следующей боковой грани и создайте для них еще один
кластер.
Тут же нажмите «s», чтобы поставить ключи на все атрибуты нового кластера.
Перейдите в шестидесятый кадр и поверните третий кластер на 90 градусов вокруг нужной
оси. Опять нажмите «s», чтобы поставить ключи.
Продолжайте эту «сказку про белого бычка», пока не соберете кубик Рубика.
Сохраните сцену (rubikFinal.ma).
Важно понимать, что каждый кластер используется только для одного поворота грани.
Если мы решим изменить поворот какой-нибудь грани, все последующие кластеры становятся
абсолютно непригодными - анимация «разъедется». Придется их «убить» и пересоздать анимацию
с момента исправления.
Совет. Если хотите создать анимацию собирающегося кубика, то красить его
нужно в том кадре, где заканчивается анимация.
Подумайте, как можно было бы выкрутиться в этом случае, не применяя кластеры.
Примечание. Пытливые умы конечно же сообразят, что можно поместить пивот
всех кубиков в центр и ставить каждый раз ключи на повороты всех кубиков. Это
решение работает, но подумайте о редактировании такой анимации. А что, если
вдруг грани захочется не только покрутить, но и подвигать - в угоду безумному
режиссерскому замыслу?
Еще немного теории деформаций.
Общие свойства всех деформеров. Атрибут Envelope
В принципе изложенного выше материала достаточно, чтобы довольно эффективно работать
с деформерами. Однако, если вы хотите уметь решать проблемы не только переделыванием
сцены заново и понимать принципы работы деформеров более глубоко, я советую вам прочитать
следующие разделы, относящиеся к работе абсолютно всех деформеров. Не скажу, что это
Деформеры 675
особенно сложная теория для взрослых, однако она требует некоторой внутренней мотивации для
прочтения и небольшого напряжения мышц мозга. Частично она перекликается с материалами
главы про изнанку MAYA, так что если вы уже прочитали ее, вам будет гораздо проще разобраться
с деформерами.
Абсолютно все деформеры имеют атрибут envelope (диапазон). Его значение изменяется от
нуля до единицы и задает, насколько сильно действует деформер. Если envelope=1, то деформер
работает в полную силу, при envelope=0 он полностью выключен. Этот атрибут очень удобно
использовать для анимации постепенного появления деформаций, так как он «мягко» включает
действие деформера.
Например, вы можете создать решетку Lattice на плече персонажа и с ее помощью
смоделировать форму бицепса. Если установить для решетки envelope=0, бицепс исчезнет. Связав
этот атрибут с помощью функции Set Driven Key с углом поворота локтевой кости скелета, вы
можете задать плавное появление бицепса при сгибе руки в локте.
Примечание. Атрибут envelope может принимать значение, равное двум, и в
этом случае созданная вами деформация как бы «преувеличивается». Более того,
его значение может быть отрицательным - и в этом случае деформация как бы
«выворачивается» наоборот.
Даже когда значение envelope равно нулю и деформер вроде бы выключен, MAYA не
перестает вычислять его действие. Если вы хотите полностью заблокировать работу деформера
и вычисления, с ним связанные, установите для него в Attribute Editor, в разделе Node Behavior,
значение Node State=HasNoEffect.
Порядок деформаций
Совершенно очевидно, что порядок применения деформеров имеет значение. Если вы
создадите цилиндр и сначала его согнете в форме буквы «С» с помощью Bend-деформера, а затем
растянете по вертикали с помощью Squash-деформера, то результат будет совсем иной, чем если
бы вы сначала растянули цилиндр, а затем согнули его.
676
Книга Сергея Цыпцына
Некоторые пользователи слышали про такое понятие как «стэк деформаций» и очевидно
жаждут заполучить сведения о способе, каким можно изменять порядок деформаций. В АЛАУА нет
подобного отдельного понятия для деформаций. Если вы помните, история (History) включает в
себя все действия, которые производились над объектом, как операции моделирования
(Construction History), так и деформации.
Посмотреть список всех операций, производившихся над объектом, можно, нажав правую
кнопку мыши над ним, и в выпавшем меню выбрать lnputs=>All Inputs...
После этого откроется окно List of input operations for, в котором представлена вся история
(History) объекта в виде списка операций. Историю следует читать здесь снизу вверх, то есть
операции, применявшиеся к объекту раньше, находятся в списке ниже.
Чтобы изменить порядок деформаций, надо просто потащить средней кнопкой мыши
нужный деформер и бросить его в новое место.
При перетаскивании порядок следования операций изменяется следующим образом:
элемент списка вставляется под тот элемент, на который он был «сброшен».
Примечание, В окне List of input operations for,., можно заблокировать действие той
или иной операции, изменяя атрибут nodeState для ноды, соответствующей этой
операции.
Очевидно, что нельзя перетаскивать и менять порядок операций, относящихся к
моделированию (Construction History).
Как только вы меняете порядок деформаций, MAYA тут же отображает результат на экране.
Деформеры
677
Промежуточные объекты (Intermediate Objects)
Если вы заглянете в закладки Attribute Editor для деформированного объекта ил и исследуете
его дерево зависимостей в Hypergraph, то обнаружите, что изначальная, недеформированная
форма объекта сохраняется в сцене - она только становится невидимой, причем не простым
выключением атрибута visibility. Эта форма, очевидно, представляет собой копию ноды типа
shape и имеет имя типа nurbsSphereShapelOrig, подчеркивающее, что это форма изначального,
«оригинального» объекта.
Очевидно также, что исходная форма нужна для вычисления деформаций, поэтому MAYA,
чтобы не путать пользователя, просто прячет ее хитрым образом, но так, чтобы она не была видна
на экране, ни в OutUner, ни в Hypergraph.
Вы всегда можете увидеть ее на экране, просто выбрав деформированный объект и
выполнив Deform=>Display Intermediate Object. Другой «ручной» способ заключается в том, что в
закладке в Attribute Editor, соответствующей этой оригинальной форме, надо выключить галку
Intermediate Object. Тогда в увидите в OutUner или Hypergraph, что деформированный объект имеет
две «формы», то есть две ноды типа shape.
678
Книга Сергея Цыпцына
Загадочный Tweak
Исследуя деформированные объекты, вы наверняка столкнулись в постоянно возникающей
загадочной нодой типа tweak. Для того, чтобы понять ее предназначение, проделайте простой
эксперимент.
Создайте полигональную сферу и хорошенько согните ее с помощью деформера Bend.
Затем выберите любую вершину и попытайтесь потянуть ее вверх.
Выяснится, что вершина смещается совсем не туда, куда вы ее тянете. И это вполне
предсказуемо, особенно если взглянуть на порядок деформаций.
Представьте, что вы сначала перетащили вершину, а затем согнули объект. Очевидно,
что после деформации вершина «уедет». Когда вы таскаете точки на деформированном объекте,
MAYA как бы быстро возвращается к оригинальной форме, передвигает вершины, а затем сгибает
объект обратно, то есть перетаскивание вершин происходит до деформации. Поэтому вершины
перемещаются весьма непредсказуемо. Возможно, вы захотите перетаскивать вершины после
деформации, но не убивая при этом историю и не ликвидируя деформеры. Поменять местами
перетаскивание и деформации можно в окне List of input operations, описанном выше. Надо просто
перетащить ноду tweak на самый верх в списке операций.
Чтобы переставлять местами перетаскивание и деформацию, MAYA должна запоминать
результаты вашего «ручного» редактирования точек в отдельной ноде, эта нода и называется
tweak.
Эта нода всегда создается при создании деформеров или скининга. В ней запоминается
информация о перетаскивании точек, происходящем после создания деформеров.
Если вы переставите ноду tweak на самый верх в списке операций, то есть поместите ее после
всех деформаций, то перетаскивание точек на деформированной поверхности снова станет
нормальным и предсказуемым.
Деформеры
679
Если, однако, после изрядного ручного редактирования вы начнете менять степень
деформации (то есть атрибуты деформеров), результат, возможно, будет не совсем предсказуем
для вас. Поэтому надо всегда помнить и представлять себе порядок деформаций.
Применение ноды tweak не ограничивается возможностью переставлять операцию ручного
редактирования объекта в списке деформаций. Главное достояние этой ноды - единственный
анимируемыи атрибут envelope, такой же, как у всех деформеров. С его помощью вы можете
плавно включать/выключать результат перетаскивания точек. Установите envelope=0, и все
смещенные точки «вернутся» на поверхность.
Например, вы смоделировали лицо персонажа, вставили кости, сделали скининг и
открываете рот с помощью вращения одной из костей. Когда рот открылся очень широко, вам
вдруг захотелось подредактировать форму носа. Конечно, можно выбрать точки на носу, создать
кластер, настроить-покрасить веса точек и потом взяться за увязывание движений кластера и
кости, отвечающей за открывание рта. Однако есть и другой способ (я не говорю, что он более
хороший, но зато однозначно более быстрый).
Вы просто редактируете форму носа вручную, таская за вершины. Затем с помощью функции
Set Driven Key устанавливаете: если рот закрыт, то envelope=0 для ноды tweak, а если рот открыт,
то envelope=1. Связь устанавливается между поворотами нужной кости (driver) и атрибутом
envelope ноды tweak (driven).
680 Книга Сергея Цыпцына
Порядок деформаций, определяемый при создании деформеров
Возникает резонный вопрос, а нельзя ли задавать порядок деформаций еще при создании
деформеров?
Оказывается, в Option Box абсолютно всех операций, создающих деформеры (кроме
Wrap), есть закладка Advanced, в которой можно задать в каком порядке они будут располагаться
в истории объекта.
Это делается с помощью параметра Deformation Order. Его назначение не так очевидно,
как может показаться с первого раза. Он определяет не порядок следования деформеров друг за
другом, а порядок расположения создаваемого деформера и деформируемого объекта в дереве
зависимостей.
Если Deformation Order=Default, порядок деформаций в точности совпадает с той
последовательностью, в которой вы создавали деформеры. В Hypergraph можно увидеть, что между
исходной формой объекта и деформированной формой находится последовательность деформеров.
Каждый новый деформер добавляется в дерево зависимостей перед деформированным объектом.
Такое создание деформеров происходит и при выборе Deformation Order=Before.
Деформеры
681
Если же выбран Deformation Order=After, новый деформер создается в дереве зависимостей
после деформируемого объекта. Поэтому в этом случае возникает дополнительная промежуточная
копия объекта, хранящая информацию о том, что было перед созданием каждого деформера.
Если в случае Deformation Order=Before, деформеры просто передавали друг другу поток данных
о поверхности, теперь каждый их них сохраняет свой результат в промежуточной копии объекта,
которая подсоединяется к следующему деформеру.
Если вы создадите несколько объектов с опцией Deformation Order=After, а затем включите
отображение промежуточных объектов(0е^гт=>01$р1ау Intermediate Object), то увидите (в Out-
liner или Hypergraph), что деформированный объект имеет несколько «форм», то есть нод типа
shape.
682
Книга Сергея Цыпцына
Еще более экзотичная ситуация возникает при Deformation Order=Split. В этом случае при
создании деформера в сцене возникает новая деформированная копия объекта, не связанная
с предыдущими деформациями. История как бы раздваивается, и вы можете видеть результат
разных деформаций на разных объектах, оригинальная форма которых одна и та же.
Но самая удивительная ситуация возникает когда используется опция Deformation
Order=Parallel. В этом случае созданный деформер действует на объект параллельно, то есть его
действие смешивается с предыдущими деформациями, созданными до него. В этом случае в
Channel Box или в Hypergraph нетрудно обнаружить ноду parallelBlender, отвечающую за усреднение
действия двух или нескольких деформеров. В атрибутах этой ноды есть веса, позволяющие
задавать степень влияния каждого деформера, присоединенного к этой ноде. Пытливые умы могут
заметить, что тип этой ноды обозначен в Attribute Editor как blendShape. Наиболее просвещенные
пользователи, конечно, в курсе, что эта же нода используется для трехмерного морфинга, о
котором речь пойдет ниже. Так что создание деформеров с опцией Parallel - это автоматическое
использование морфинга под именем parallelBlender.
Членство в партии деформеров.
Вступление и выход из партии.
Партиции и эксклюзивные деформеры
Когда вы создаете новый деформер, MAYA автоматически порождает служебный объект,
который называется «сет» (set). Этот объект просто содержит список компонент, на который этот
Деформеры
683
деформер действует. Если перед созданием деформера вы выбрали сам объект, в новый сет
попадают все компоненты этого объекта. (Напоминаю: все деформеры работают не с объектами,
а с их компонентами.)
После создания деформера можно изменять количество компонент, на которые он
действует (замечу, что один деформер может влиять на компоненты разных объектов). То есть
можно исключать компоненты из списка-сета или, наоборот, включать в него новые.
Проще всего это делать с помощью инструмента Edit Membersip Tool (редактирование
членства). Перед его использованием удобно выбрать деформер, область влияния которого
вы собираетесь редактировать - хотя выбирать деформеры можно и в процессе использования
инструмента. Как обычно, при работе с инструментами курсор принимает агрессивную форму, и
при выбранном деформере на экране подсвечиваются компоненты, на которые он влияет.
Кроме того, в Help Line появляется такая подсказка:
Add with Shift+LMB. Remove with Ctrl+LMB.
Это означает, что для того, чтобы выключить влияние деформера на некоторые компоненты,
надо просто выбрать их, нажимая Ctrl. И наоборот, если надо сделать так, чтобы деформер
воздействовал на новые компоненты, надо выбрать их, нажимая Shift. Термины «добавить» и
«удалить», используемые в подсказке, просто означают, что вы добавляете компоненты в сет,
соответствующий этому деформеру, или удаляете их из него. Таким образом, задача редактирования
области влияния сводится к манипулированию содержимого сетов, связанных с деформерами.
Для любителей точного редактирования имеется возможность увидеть имена и изменить количество
компонент, входящих в сеты с помощью Windows=>Relationship Editors=>Deformer Sets.
684
Книга Сергея Цыпцына
Примечание. Мне часто часто задавали вопрос: как заставить уже созданную
решетку Lattice воздействовать на вновь созданный объект, иными словами,
как «внести» объект под влияние существующей решетки (или любого другого
деформера). Самым быстрым способом мне представляется использование MEL-
команды nonLinear, однако нормальным людям я посоветую выбрать решетку,
затем выбрать Edit Membersip Tool, а потом ткнуть мышкой в нужный объект.
На экране появятся его компоненты, которые следует быстро выбрать, нажав
Shift.
Сеты используются не только при создании деформеров, но и во многих других целях,
например, для создания списка объектов, на которых назначен один и тот же материал. Подробнее
про сеты вы можете прочитать в главе про изнанку MAYA, а здесь я лишь упомяну, что вы всегда
можете выбрать в сцене некоторое количество объектов и/или компонент и объединить их в сет.
В отличие от группы, при создании сета не создается новой ноды transform, новый сет никак не
меняет иерархию сцены, его нельзя двигать или вращать. То есть сет - это формальный список
компонент или объектов. Более того, при удалении сета удаляется только список, сами объекты
из списка остаются в целости и сохранности.
При работе с деформерами сеты создаются автоматически, поэтому вам не надо заботится
об их формировании. Но знать об их существовании все же полезно.
Совет. После создания деформера не изменяйте количество компонент
деформированного объекта (с помощью Construction History или ручного добавления/
удаления): ведь тем самым вы измените нумерацию вершин, а это будет иметь
катастрофические последствия для работы деформера.
По умолчанию одни и те же компоненты могут находиться под влиянием нескольких
деформеров. Однако в некоторых случаях вы, возможно, захотите, чтобы деформеры были
эксклюзивными, то есть не допускали вхождения своих компонент в сеты других деформеров.
Чтобы обеспечить это, надо объединить несколько деформеров, а точнее их сеты, в партицию
(Partition). Деформеры, принадлежащие к одной партиции, не допускают вхождения одних и тех
же компонент в разные сеты, и поэтому являются эксклюзивными (в рамках своей партиции)
В Option Box операции создания любого деформера в закладке Advanced есть опция
Exclusive, выключенная по умолчанию. Если ее включить, создаваемый деформер «заберет» все
выбранные компоненты из-под влияния других деформеров (то есть из других сетов) и включит
их в свой список-сет. Это произойдет, если все эти деформеры принадлежат одной партиции,
которую можно выбрать в поле Partition То Use.
Если вы совсем запутались, я еще раз, по-другому, повторю ту же мысль: при создании
деформеров компоненты объединяются в сеты (sets). Иногда эти сеты объединяются в партиции
(partitions). Сеты, принадлежащие к одной партиции, не могут содержать компоненты друг друга.
Подробнее про партиции читайте в главе про изнанку MAYA. А сейчас перейдем к морфингу.
Деформеры
685
ШЖУ.
Трехмерный морфинг. Смешанные формы - BlendShape
Анимировать форму в MAYA можно различными способами (впрочем, как и делать все
остальное). Предположим, вы хотите анимировать форму кривой. В принципе вы можете выбрать
в нужном кадре все контрольные точки кривой, нажать клавишу «s», перейти в следующий
ключевой кадр, отредактировать форму, снова выбрать все контрольные точки кривой, опять
нажать «s» и так далее. Такой способ имеет право на жизнь, но, наверное, только для кривых.
Вы должны понимать, что если ваша кривая содержит, к примеру, двадцать точек, при первой же
постановке ключа в сцене возникнет шестьдесят анимационных кривых (по три для каждой точки).
Редактировать такую анимацию будет уже невозможно.
Более гибкий подход включает в себя использование кластеров, созданных только для
нужных точек кривой. Однако количество анимационных кривых, созданных для каждого кластера,
все равно довольно велико и делает задачу редактирования произвольной анимации формы кривой
довольно затруднительной.
Очевидно, что для анимации формы необходим более общий подход, не связанный с
необходимостью контролировать положение контрольных точек.
Обычно термин «морфинг» ассоциируется с плавным преобразованием одной формы (или
изображения) в другую. В MAYA морфирование объектов делается с помощью технологии Blend
Shape (смешивание форм) и устроено следующим образом.
Всегда можно выбрать два объекта и применить к ним операцию Deform=>Create Blend
Shape. После этого в истории этих объектов появится нода с одним атрибутом, изменяющимся
от нуля до единицы. Нетрудно догадаться, что увеличение этого атрибута будет вызывать
морфирование одного объекта в другой, а точнее говоря первого во второй. Однако дело не
ограничивается лишь парой объектов. Если выбрать несколько поверхностей (или кривых), по-
прежнему возникнет одна нода, но с некоторым количеством атрибутов, отвечающих за морфинг.
Если последовательно «подергать» за эти атрибуты, можно заметить, что каждый из них отвечает
за морфинг последнего выбранного объекта во все остальные.
Примечание. Возможно, некоторые неискушенные умы ожидали, что в этом случае
возникнет ситуация, когда при морфинге один объект будет последовательно, друг
за другом, принимать все формы, определенные остальными объектами. Такое
поведение не является задаваемым по умолчанию, однако путем редактирования
Option Box операции Create Blend Shapes его можно организовать.
Давайте потренируемся.
Создайте сплайновые сферу, конус и цилиндр.
Выберите конус, цилиндр, а затем сферу.
Откройте Option Box операции Deform=> Create Blend Shapes.
Снимите галку Check Topology.
Нажмите Create.
Поглядите в Channel Box.
Для выбранной сферы там обнаруживается операция, определяемая нодой blendShapel.
686
Книга Сергея Цыпцына
Пошевелите атрибуты с именами nurbsCylinderl и nurbsConel. Очевидно, что каждый из
них отвечает за морфинг сферы либо в цилиндр, либо в конус.
Сфера, которая была выбрана последней, становится базовым объектом (base object),
а все остальные объекты, участвующие в операции Create Blend Shapes, становятся целевыми
объектами (target objects), то есть целью для морфинга базового объекта.
Терминологический комментарий. Если с базовыми объектами все более менее понятно,
то перевести термин "target" довольно непросто. Прямолинейные майщики легкомысленно ввели
устный термин «таргет», пользуясь, как обычно, методом прямой транскрипции и совершенно не
думая, как люди будут писать книги и статьи на эту тему. Что ж, дабы не разрушить и без того
окончательно и бесповоротно пошатнувшееся здоровье литературного редактора, я буду, так и
быть, говорить о «целевых» объектах, стыдливо указывая в скобках английский термин и имея в
виду «цель» для морфинга...
Таким образом, в результате операции Create Blend Shapes деформируется всегда
только один объект, тот, который был выбран последним. Этот базовый объект может не только
принимать формы всех остальных, но и деформироваться в смешанную форму (Blend Shapes).
Если установить все атрибуты ноды blendShape в единицу, базовый объект примет усредненную
форму всех остальных объектов.
Одно из основных применений морфинга, как нетрудно догадаться - это лицевая анимация.
Создав модель головы или лица персонажа, можно сделать некоторое количество копий этой
поверхности. Затем можно отредактировать каждую копию, смоделировав определенную эмоцию:
радость, печаль, удивление, гнев на падающую Майю, досаду или восторг.
Выбрав все эти копии плюс исходную модель и применив операцию Create Blend Shapes,
вы получите несколько атрибутов, плавно переводящих ваш персонаж от одной эмоции к другой.
Более того, задав смешанные значения атрибутов, вы можете получить довольно экзотические
эмоции: смех сквозь слезы, восторг от падающей Майи. Все эти атрибуты можно анимировать
всеми известными вам способами. Таким же способом можно делать и более «низкоуровневые»
деформации: поднятие брови, подмигивание, сокращения отдельных мышц. Чем больше
промежуточных форм вы сделаете, тем больше вариантов управления формой вашей модели
будет у вас в руках. И тем сложнее и «многослойнее» будет ее анимация.
Деформеры
687
Такой же подход используется для анимации речи: изготавливаются маски, соответствующие
произнесению наиболее характерных гласных и согласных, затем создается нода blendShape,
после чего надеваются наушники и начинается расшифровка речи - в нужные моменты атрибуты
устанавливаются в значения, соответствующие определенной фонеме, ставятся ключи, потом
происходит переход к следующей фонеме, и так далее.
Применение Blend Shape, конечно, не ограничивается лицевой анимацией. Сокращения
мышц, влияющих на кожу, также удобно делать с помощью морфинга, чтобы потом связать его
атрибуты с поворотами нужных костей. Деформацию пути, по которому движется объект, никто не
запрещает сделать с помощью Blend Shape.
Все модели, представленные в этой главе, были изготовлены Мишей /1апицким (в раннем
периоде его творчества).
На этом рассказ про морфинг можно было бы и закончить, так как использование его
довольно несложно, а применение весьма четко очерчено. Однако вот несколько полезных
комментариев.
Окно для работы с Blend Shapes
В отличие от всех других деформеров blendShape удостоен чести иметь отдельное окно,
для работы с ним и редактирования его атрибутов.
Такое окно можно вызвать через Window=>Animation Editors=>Blend Shape... В этом окне
отображаются атрибуты всех объектов типа blendShape, существующих с текущей сцене, поэтому
хорошей привычкой может стать адекватное именование этих объектов сразу после очередного
создания морфинга.
В этом окне находятся удобные слайдеры для управления атрибутами и некоторое
количество кнопок для работы с объектом blendShape. Кнопки Select и Close выбирают и удаляют
сам объект, отвечающий за морфинг. Reset АН и Key АН обнуляют или ставят ключи на все атрибуты.
У каждого атрибута есть собственная кнопка Key, для постановки ключа на него.
Необычно здесь то, что атрибуты можно переименовывать. Это позволяет давать
деформациям осмысленные названия. Например, если вы сделали маски для различных эмоций,
можно переименовать соответствующие слайдеры (атрибуты), отвечающие за соответствующие
деформации, чтобы их имена стали названиями этих эмоций.
Для взрослых. Реальные имена атрибутов, отвечающих на морфинг, выглядят так: blend-
Shape1.w[0], blendShape1.w[1] и т.д. При создании деформера этим атрибутам дополнительно
даются «псевдонимы» с помощью команды aliasAttr. В окне Blend Shape вы просто меняете имена
этих «псевдонимов», но не самих атрибутов.
688
Книга Сергея Цыпцына
Окно Blend Shape похоже на микшерский пульт, где вы можете смешивать различные
формы, задавая «уровень» каждой деформации и одновременно контролируя анимацию. Если вы
больше привыкли к традиционному, горизонтальному расположению слайдеров, к такому виду
можно переключиться с помощью меню Option=>Orientation=>Horizontal.
Примечание. Значения атрибутов, определяющих морфинг, могут принимать как
значения большие единицы, так и отрицательные значения. В первом случае MAYA
как бы преувеличивает (экстраполирует) деформацию, продолжая обозначенную
вам тенденцию. Во втором случае MAYA «инвертирует» морфинг в другую сторону,
задавая переход не в направлении целевой формы, а от нее. В обоих этих случаях
вы получаете новые формы, о которых, в общем-то, и не подозревали и которые
не моделировались вручную.
Устройство объекта blendShape.
Удаление и добавление новых целевых объектов
Если открыть Hypergraph и взглянуть на связи объекта blendShape, можно заметить, что
выглядит он как обычный деформер, забирающий информацию с исходной (недеформированнои)
формы базового объекта, вычисляющий деформации и новую форму объекта и передающий эту
информацию на новую геометрию. (Для таких исследований лучше использовать простую сцену со
сферой, цилиндром и конусом, описанную выше, иначе дерево зависимостей может стать слишком
Деформеры
689
«густым», чтобы в нем успешно разобраться). Как у остальных деформеров, в нем есть атрибут
envelope, мягко «включающий» и «выключающий» его действие.
Примечание. Подобно другим деформерам, Blend Shape имеет свой сет (blendShape-
1Set)f i/, следовательно у можно редактировать количество компонент объекта,
на которые он влияет. Выбрав сам объект Blend Shape и используя Edit
Membership Tool, вы можете удалить некоторые компоненты из-под влияния деформера,
защитив таким образом часть поверхности от морфинга.
Из Hypergraph следует, что деформер Blend Shape также сохраняет связи в исходными
целевыми формами. Поэтому, если вы будете редактировать любой из целевых объектов (targets)
даже после создания Blend Shape, это немедленно обновит соответствующий морфинг.
Таким образом, Blend Shape полностью сохраняет историю и связи со всеми объектами,
используемыми для морфинга. Удивительно, но даже после того, как вы оставите только базовый
объект, а все остальные удалите из сцены, Blend Shape не перестанет работать. Дело в том, что
все деформации (то есть перемещения контрольных точек) он запоминает «внутри», вместе со
связями с соответствующими атрибутами. Поэтому удаление исходных целевых объектов просто
убивает историю, однако сам деформер продолжает действовать.
Так удалять исходные формы или нет? Если вы настроили морфинг и полностью
удовлетворены его работой, можете удалить исходные формы (кстати, добавить новые можно
позднее). Это существенно разгрузит сцену и освободит приличный «шматок» памяти. Если вы
собираетесь редактировать исходные маски, просто спрячьте их и оставьте до нужного момента.
Кстати, при создании Blend Shape можно задать удаление всех исходных целевых форм,
включив в Option Box операции Create Blend Shape опцию Delete Targets.
Если вы решили смоделировать еще пару эмоций для своего пылкого персонажа, вы
690
Книга Сергея Цыпцына
можете приготовить соответствующие формы, выбрать их, а затем выбрать базовую форму (чтобы
MAYA знала, к какому морфингу добавлять новые формы). После этого выполните Deform=>Edit
Blend Shape=>Add. Так же производится удаление ненужных форм.
Совет. Если в результате безумных манипуляций со слайдерами в окне Blend Shape
вы получили экстраординарную форму и хотите добавить ее в существующий
морфинг как отдельную независимую форму со своим слайдером, просто нажмите
кнопку Add в окне Blend Shape. Появится новый слайдер, приводящий базовую форму
в это экстраординарное состояние.
Совместимость форм и принцип работы морфинга
Обычно формы для морфинга изготавливаются копированием в нужном количестве
базового объекта и редактированием его геометрии. Однако некоторые экстремальные умы
наверняка готовы к более радикальным экспериментам.
Создайте два полигональных примитива: сферу и плоскость.
Выберите сначала плоскость, затем сферу.
Откройте Option Box операции Deform=>Create Blend Shape.
Задайте параметры по умолчанию Edit=>Reset Settings.
MAYA поприветствует вас довольно невнятным замечанием:
Error: No deformable objects selected.
Странно, ведь выбранные объекты вполне деформируемые. Оказывается, это означает,
что ей просто не нравятся объекты, выбранные вами для морфинга.
По умолчанию, MAYA проверяет совместимость объектов с точки зрения морфинга,
отслеживая, например, одинаковое количество вершин на всех поверхностях. Однако вы можете
отменить такую проверку в Option Box операции Create Blend Shape, отключив опцию Check
Topology.
В этом случае вы делаете морфинг на свой страх и риск.
Повторив попытку для сферы и плоскости еще раз, с отключенной проверкой топологии,
вы получите вполне закономерный результат: сфера морфируется в плоскость.
Нетрудно даже понять алгоритм такого морфинга.
Вершины одного объекта переходят в вершины другого. Причем переход совершается «по
номерам». Первая вершина одной поверхности переходит в первую вершину другой, вторая - во
вторую, и т.д. А то, что у поверхностей разное количество вершин, никого уже на волнует: ведь
вы сами отменили проверку их количества, сняв галку Check Topology. Так как у сферы количество
вершин гораздо больше, оставшиеся точки просто останутся на месте. Обратите также внимание,
что в данном случае играет важное значение порядок нумерации вершин на полигональных
объектах.
Деформеры
691
Наиболее ультрарадикальные экспериментаторы могут попробовать морфировать
полигональную поверхность в сплайновую или наоборот. MAYA сделает это, не поморщившись:
вершины полигональной сетки будут стремиться к контрольным точкам сплайновой поверхности.
Лишние точки просто останутся неподвижными.
Однако если вы решите скрестить сплайновые поверхности с разными количеством точек
(как в примере с конусом, сферой и цилиндром), результат окажется более удачным, чем можно
ожидать. Дело в том, что нумерация вершин на сплаиновых поверхностях не произвольна, как для
полигонов, а четко определена - это строки и столбцы, содержащие возрастающие номера вершин.
Это дает возможность MAYA использовать для морфинга сплаиновых поверхностей другой алгоритм
деформации, нежели простое притягивание вершин с одинаковыми номерами. Контрольные точки
при морфинге как бы равномерно распределяются вдоль поверхности целевого объекта.
Примечание, Сплайновые поверхности бывают замкнутыми (периодическими)
и открытыми, причем по обоим направлениям вдоль поверхности. При
морфировании следует учитывать это. При попытке морфировать плоскость в
сферу вас наверняка ожидает неудача, так как плоскость при таком морфинге не
превратится в замкнутую поверхность, а останется «открытой сферой». Если
хотите добиться успеха, откройте замкнутую сферу перед морфингом. Следите,
чтобы по обоим направлениям поверхности имели одинаковую «открытость» или
«замкнутость».
Последовательный морфинг
В некоторых случаях хочется смоделировать некоторое количество объектов, а затем
создать морфинг таким образом, чтобы базовая форма принимала последовательно все формы
этих объектов при увеличении всего одного атрибута. Для таких случаев в Option Box операции
692
Книга Сергея Цыпцына
№
Create Blend Shape имеется опция In-Betweens (промежутки). Если включить ее, созданный Blend
Shape деформер будет иметь всего один атрибут, отвечающий за морфинг. При его изменении
от нуля до единицы базовая форма (последний выбранный объект) будет последовательно
«пробегать» все остальные целевые формы. Такой «промежуточный» морфинг является частным
случаем общего метода смешивания форм и применяется по необходимости.
Морфинг групп и иерархий
Предположим, вы сделали паровоз, состоящий из многих запчастей, объединенных в
группу. Затем скопировали его и, путем неистового редактирования всех объектов, составляющих
паровоз, превратили его в самолет. А теперь хотите, чтобы стремительно мчащийся паровоз
неожиданно морфировался в самолет и весело вспархивал с рельс в голубое небо.
Нет проблем. Выбирайте верхнюю группу самолета, затем группу, содержащую паровоз, и
выполняйте операцию Create Blend Shape. MAYA сама разберется, как и что морфировать. Каждый
объект из одной иерархии будет морфироваться в соответствующий объект из другой. Единственное
требование для успешного морфинга иерархий заключается в том, чтобы порядок соответствующих
объектов в иерархии (группе) был одинаковым. Если вы используете копирование для изготовления
новых форм, проблем не возникнет. В противном случае поменять порядок объектов в группе или
иерархии можно, перетаскивая объекты в Outliner средней кнопкой мыши.
Локальный и глобальный морфинг
По умолчанию объекты морфируются локально. Точки базовой формы стремятся к
позициям точек целевого объекта вне зависимости от того, где находится этот объект и какой
размер он имеет. Поэтому вы можете предварительно располагать целевые объекты где угодно:
при создании морфинга они будут как бы временно перенесены в положение базового объекта и
там будет вычисляться деформация. По этой причине не вздумайте делать операцию Freeze
Transformation перед морфингом.
Однако если вы хотите, чтобы точки морфируемого объекта стремились к абсолютным
мировым коодинатам точек целевого объекта, можете задать при создании опцию Origin=World.
Это можно сделать и позже, после создания морфинга, установив соответствующий атрибут. В
этом случае морфируемыи объект будет стараться принять не только форму целевого объекта, но
и его размер, а также будет смещаться в его позицию.
Симметричный морфинг
При работе с лицевой анимацией вы рано или поздно столкнетесь с проблемой изготовления
симметричных масок. Учитывая, что нумерация вершин на полигональных сетках совершенно
произвольна, простые методы зеркалирования моделей могут быть непригодны, да и не все
поверхности моделируются идеально симметрично. В этом случае могу порекомендовать поискать
на сайте www.highend3d.com скрипты и плагины для подготовки симметричных форм специально
для деформации Blend Shape (например, symWork от Володи Забелина).
Некоторые замечания по поводу лицевой анимации
Анимация мимики представляет собой одну из коварнейших задач. Если речь идет о
символических и совсем нереалистичных персонажах, у которых глаза вылазят из орбит, а рот
действительно растягивается до ушей, тут как раз проблем нет. Деформеры позволят вам «плющить»
персонаж, как вам угодно. Однако когда речь заходит о пафосной экстрафотореалистичной
анимации, все становится не так просто.
Благодаря традиционным методам типа Projection Mapping и модной технологии Normal
Maps, стало возможным изготовление очень реалистических лиц и даже голов. В самом деле,
несложно сфотографировать голову с разных ракурсов и использовать полученные изображения в
качестве текстур. Однако с анимацией мимики существуют большие проблемы. Как только любая
суперреалистичная голова начинает говорить или просто кривляться, становится ясно, что это
Деформеры
693
шшш
компьютерная анимация. Можно рассуждать о том, почему так происходит (например, требуется
слишком много деталей или амбиентных движений), но факт остается фактом - человеческий
глаз без труда определяет, где настоящая мимика, а где компьютерная. Фанаты анимации могут
обвинить меня в нефотореалистическом шовинизме, однако я буду упорствовать и даже изложу
свою версию ограниченности традиционной лицевой анимации.
Дело в том, что благодаря системам Motion Capture стало возможным довольно ловко
обманывать человеческий глаз в случаях, когда нужно анимировать движения корпуса персонажа,
его рук или ног. В самом деле, если данные о движении снимаются с реальных людей, то будучи
перенесенными на скелет персонажа они выглядят убийственно реально. (Кстати, перенос таких
реальных движений на обычных нереалистичных персонажей полностью их, персонажей, убивает.
Они становятся невыразительными и вялыми).
Датчики в системах Motion Capture крепятся на вполне определенные места: плечи, локти,
запястья, колени, лоб и т.д. Для этих мест существуют вполне определенные соответствия на
компьютерном скелете, поэтому движение переносится один в один.
Существуют также системы захвата мимики, когда на лицо актера наклеиваются блестящие
маркеры и ведется съемка этого лица специальной камерой. Потом данные о движениях маркеров
даже довольно успешно вычисляются специальной программой и получаются трехмерные
траектории соответствующих точек поверхности лица.
Проблема только в том, что эти траектории некуда «приклеить»! Нет на лице (точнее,
«в лице») костей и суставов, в отличие от скелета персонажа. Создание кластеров приводит к
проблеме взаимодействия этих кластеров, и контрольные вершины слишком многочисленны.
Конструкции из Blend Shapes оказываются слишком громоздкими и абстрактными. Все решения
будут приблизительными, а для достоверности требуется абсолютная точность.
Кроме того, традиционный подход к анимации мимики заключается в изготовлении
большого количества Blend Shapes и хитроумного их смешивания. Таким, образом вся мимика
представляется как последовательный морфинг.
Если же посмотреть анатомически на то, как двигается лицо, становится понятно, что
одним из решений может быть «мышечный» подход, когда управление мимикой ведется не в
терминах смены выражений лица, а в терминах сокращений лицевых мышц. Напомню, что речь
идет о реалистичной анимации лица, как самостоятельной задаче.
Порывшись в Интернете, я обнаружил несколько упомянутых выше «мышечных» решений
для тела персонажа. Все найденные мной программы для «липсинка» (от lip sync - синхронизация
движения губ с фонограммой) и для управления мимикой основаны лишь на традиционном морф-
подходе.
И лишь одна программа приятно меня удивила, тем более, что это отечественная
разработка. Пакет называется Life Studio: Head и производит его российская компания Life Mode
Interactive.
Управление мимикой в данном пакете производится на основании использования
огромного количества анатомически корректных мышц. Каждая мышца отвечает за сокращение и
деформацию собственного участка поверхности лица. Низкоуровневые мышцы могут объединяться
в более удобные макро-мышцы для эффективной анимации. Для каждой мышцы можно менять
область и характер влияния, делать тонкую настройку параметров. Пакет также включает в
себя все необходимые средства для лицевой анимации: хорошие текстуры, наборы аксессуаров
(очки, волосы), генератор случайных лиц. Однако главное его технологическое преимущество
- анатомический мышечный поход. Этот подход позволяет выделять характерные лицевые мышцы,
присущие отдельным расам, или изменять возраст или даже пол лица, управляя одним параметром,
который контролирует модификацию нужных мышц.
Кроме того, пакет имеет встроенный модуль для автоматической генерации речи в
соответствии со звуковым файлом, подаваемым на вход. В отличие от традиционных решений,
выдающих высокочастотный «дребезг» в области губ, этот модуль не использует принцип
расшифровки речи в виде фонем. Вместо этого звук раскладывается на три составляющие формы
рта: рот открыт (звук «а»), рот растянут (звук «и»), рот вытянут вперед (звук «у»). И все! При этом
получается потрясающий результат, демонстрирующий плавную мимику, а не трясущиеся губы.
Насколько я знаю, этот модуль уже продается в виде отдельного плагина к MAYA.
На сайте производителя (www.lifemi.com) можно скачать пробную версию пакета Life
Studio: Head и посмотреть примеры работы, сделанных с его помощью.
694
Книга Сергея Цыпцына
Практические советы по использованию деформеров
В заключение хочу привести исключительно полезные практические советы от
Миши Бажуткина, касающиеся «продвинутой» работы с деформерами в контексте работы с
персонажами.
Используйте Wrap и Wire деформеры
Wrap-деформер - более гибкий деформер, нежели Lattice-деформер (решетка), но и более
капризный и медленный. Это - плата за то, что он позволяет работать с различными топологическими
формами. В сочетании с другими типами деформеров пользователи MAYA получили мощный
инструмент для сетапа персонажей. Но среди прочих я хотел бы выделить именно Wrap и Wire
деформеры. Так как именно они, работая в связке, решают проблемы в случаях, когда деформеры
типа Cluster и Skin Cluster уже бессильны.
Оптимизируйте количество объектов
Очень часто в процессе настройки Wrap-деформера нужно корректировать форму сетки
объекта влияния и это требует постоянной синхронизации ее с базовой (Base) сеткой. В этом случае
проще соединить атрибут worldMesh «базовой» сетки с атрибутом inMesh управляющей и делать
поправки на «базовой» сетке, а все изменения будут автоматически переноситься на управляющую
сетку. Это дает большую гибкость в настройке персонажа и экономию времени. Более того, мы
получаем еще одно преимущество. После такого соединения все изменения в управляющей сетке
будут происходить относительно базовой, и их всегда можно будет обнулить, установив в ноль - с
помощью Channel Box (закладка CVs) - перемещения выбранных вершин сетки.
В тех случаях, когда Base-объект неподвижен, можно избавиться и от него. Тогда его
функции будет выполнять Original Shape объекта влияния. Для этого после создания деформера
выделите объект влияния и примените к нему Cluster-деформер. И сразу же удалите появившейся
контрольный объект этого деформера (в виде буквы «С»). И если до этих операций история объекта
влияния была чиста, то теперь в ней появиться новый Original Shape соединенный с его старым
Shape. Естественно, вместо Cluster-деформера можно использовать любой другой деформер. Мне
же он приглянулся за свою простоту. Теперь все, что осталось сделать - это соединить атрибут
«worldMesh» Original Shape с атрибутом «basePoint» деформера. Далее для подстройки объекта
влияния очень удобно использовать меню Deform => Display Intermediate Objects. Эта команда
делает видимым ранее скрытый Original Shape. После чего, перейдя в компонентный режим, можно
сделать исправления. А скрыть Original Shape можно, вызвав меню Deform => Hide Intermediate
Objects. Все выше перечисленные действия имеют отношение и к Wrap и к Wire деформерам.
Деформеры
695
Подстройка Wrap Base и Wire Base объектов
После того как вы с помощью Wrap-деформера построите новые формы вашей модели,
вы наверняка заметите некоторые искажения в сетке. В основном они незначительны, но крайне
неприятны, с художественной точки зрения. Самое интересное то, что это, скорее всего, произошло
из-за не очень точного построения базовой сетки объекта влияния. Трудно заранее предугадать
с высокой точностью позиции вершин этой сетки на этапе моделирования. Все делается, что
называется, на глазок. Например, для Wrap-деформера большую роль играет расстояние от
контрольной точки до поверхности деформируемого объекта. Но ничто не мешает нам, уже
после того, как эта сетка построена и получена с помощью деформера первая тестовая форма,
подкорректировать позиции Base-объекта. Этот метод, хотя и не решает всех проблем, связанных
с работой Wrap-деформера (и не только его), но в значительной степени поможет вам сделать
тюнинг, что уже немаловажно.
Эту технику можно применить и для подстройки начальной формы кривой Wire-деформера,
относительно которой будет происходить дефомация поверхности. После того как Wire-деформер
создан, нужно увеличить значение его атрибута scale. Затем одновременно двигать точки кривых
wire и wireBase. При этом будет хорошо видно, как качественно изменяется форма поверхности
после деформации. После такой настройки нужно будет опять выставить атрибут scale в единичное
значение и двигать только точки wire-кривой.
Чтобы свести мелкие искажения к минимуму, можно также отредактировать Original
Shape деформируемой поверхности. При начальном моделировании еще нельзя предусмотреть
правильное расположение ее точек относительно управляющей сетки Wrap-деформера. Двигая
ее вершины и глядя на финальную форму модели после деформации, можно добиться более
качественного результа работы деформера.
Уменьшить количество искажений в деформируемой модели можно так же небольшим
значением атрибута smooth в transform-ноде объекта влияния.
Начинайте деформировать с простых и округлых форм!
В качестве базовой формы, с которой будет работать деформер, старайтесь использовать
ту форму, когда объект наименее искажен. Идеальная для «привязки» поза похожа на ту, в которой
персонаж находился бы погруженным в воду, причем с полностью расслабленными мышцами.
Если же в вашей работе придется иметь дело с округлыми формами (например, при деформации
лица частенько попадаются такие фонемы, как буква «О» и ей подобные), имеет большой смысл
делать «привязку» именно с этой формы. Хотя бы потому, что из других произвольных форм
вылепить круглую форму без искажений в сетке часто просто невозможно. Не страшно, если вы
изначально построили модель не по этим правилам (например, голову с закрытым ртом). Сохранив
ее как шаблон, потом, с помощью деформаций, вы создадите ее снова, и это будет гораздо
проще, чем наоборот. При работе с моделью головы также имеет большой смысл хранить модель
с симметричной формой. Она вам обязательно пригодится при построении других симметричных
и несимметричных форм.
696
Книга Сергея Цыпцына
№
Меняем тип Wrap алгоритма
В седьмой версии Maya - в окне Create Wrap Options - появилась возможность выбора
типа влияния полигонального Wrap-объекта. Раньше это можно было сделать только после
создания Wrap-деформера, с помощью атрибута inflType объекта влияния. Если сравнивать
результат работы этих режимов, можно увидеть, что в режиме Points между контрольными
точками деформируемая поверхность провисает, как ткань, которую подняли за кончики, но в
целом деформация выглядит гладко. А вот в режиме Faces такого провисания нет, зато возникают
«заломы» на деформируемом объекте вдоль ребер объекта влияния. Также в режиме Faces, когда
при деформации управляющей сетки деформера происходит «перехлест» соседних ребер (edges),
зависимые вершины деформируемого объекта «слетают» в нулевую позицию. Это происходит из-
за того, что алгоритм Wrap-деформера сталкивается с ситуацией, когда расчет позиции вершины
не определен. Это хорошо видно, когда у деформируемого объекта «сетка» намного плотнее, чем
у объекта влияния. Поэтому при настройке Wrap-деформера нужно выбрать приемлемый ^\ля вас
тип влияния, проверяя его на экстремальных позах.
Wrap не любит изменения масштаба объекта влияния
К сожалению, Wrap-деформер не любит, когда в больших диапазонах изменяется
масштаб объекта влияния. При этом с деформированной поверхностью происходят неадекватные
вещи: например, при уменьшении - сильные искажения мелких деталей, а при увеличении -
разглаживание деталей. Из-за этих погрешностей в алгоритме деформера в подобных случаях
его лучше не использовать. Но если его нечем заменить, делайте тогда «привязку» при самом
меньшем из возможных масштабов объекта влияния.
Чего следует избегать при работе с Wrap-деформером
Есть у Wrap-деформера одна неприятная особенность: если в истории объекта до самого
Wrap-деформера что-то меняется, он каждый раз пересчитывает «привязку» точек (распределение
влияния вершин объекта влияния на деформируемой поверхности). К сожалению, у Wrap-
деформера отсутствует возможность кэшировать данные «привязки». Например, если до него
стоит Blend Shape-деформер с анимированными каналами. Такая последовательность деформеров
в истории объекта будет сильно замедлять его деформации во время воспроизведения анимации.
Это также относиться к ситуации, когда используются два Wrap-деформера, находящиеся один за
другим в истории объекта. Второй деформер будет работать намного медленнее, чем первый, из-за
того, что он каждый раз пересчитывает «привязку», когда первый деформер изменяет геометрию.
Не помогает даже исключение «лишних» точек из сета (Set) второго и первого деформеров.
Однако выход из этой ситуации есть. Их даже два! Метод параллельных деформаций и
замена Warp-деформера на Skin Cluster.
Wrap-деформер и параллельные деформации
Если в сетапе вашего персонажа необходимо использовать несколько Wrap-деформеров,
причем так, что они будут влиять на разный набор вершин, можно использовать метод параллельных
деформаций. Этот метод избавит Wrap-деформер от постоянного пересчета «привязки». Но не
следует забывать о том, чтoWrap-дeфopмep может иметь сразу несколько влияющих объектов.
Метод параллельных деформаций дает больше возможностей, чем несколько влияющих (influence)
объектов одного Wrap-деформера. Например, вы можете «привязывать» весь деформируемый
объект (или его часть) к разным влияющим объектам. А они, в свою очередь, могут быть разной
топологии и по-разному деформированы. И между этими влияющими объектами можно плавно
переключать влияния с помощью вспомогательного деформера (parallelBlender), в качестве
которого выступает известный всем Blend Shape-деформер. Единственный неприятный момент в
том, что, в отличие от остальных деформеров, Wrap-деформер обделили: при его создании из его
настроек убрали дополнительную закладку с параметрами, которые как раз и позволяют создавать
его в этом режиме. Но с помощь MEL это можно исправить. Для начала первый Wrap-деформер
создается, как обычно, из меню MAYA. Но второй нужно создать с помощью следующей команды:
Деформеры
697
щщш
deformer -type wrap -parallel
Тогда Maya, помимо нового Wrap-деформера, создаст еще и ноду parallelBlender, а оба
Wrap-деформера свяжет с ней так, что с помощью ее атрибутов можно будет управлять весом
каждого деформера. Только далее вам придется связать второй Wrap-деформер с влияющим
объектом и его копией (базовым объектом) с соответствующими атрибутами при помощи MEL или
Connection Editor. Это потому, что команда deformer ничего такого не делает. В качестве подсказки
можете использовать связи первого Wrap-деформера с его объектами.
Этот очень полезный механизм может пригодиться и в других случаях, где деформации
можно складывать или разделять между разными частями объекта. Он позволяет значительно
уменьшить время просчета деформаций, в отличие от стандартного последовательного режима,
когда деформеров достаточно много и не все нуждаются в пересчете. Ведь в последовательном
режиме информацию нужно передавать от одного деформера до другого, при этом заставляя
каждый деформер пересчитывать деформацию, даже если это не нужно.
Wrap-деформер в составе Skin Cluster-деформера
Второй метод, как заставить работать совместно несколько Wrap-деформеров - это
включить управляющие объекты в Skin Cluster в качестве «geometry influence». Подробнее об этой
операции вы можете прочитать в советах по «скинингу». В отличие от обычного Wrap-деформера,
Skin Cluster-деформер не пересчитывает «привязку» к контрольным точкам управляющих объектов.
К тому же вы получаете еще одну возможность - делить их взаимное влияние с помощью весов
Skin Outer-деформера. И в отличие от предыдущего способа параллельных деформаций, этот
метод гарантирует то, что влияние нескольких управляющих объектов для каждой вершины
деформируемого объекта может быть нормализовано, то есть в сумме будет составлять
единицу. Это очень полезно для деформации лица, когда несколько управляющих объектов
могут имитировать мускулатуру. И конечно же, есть возможность сочетать Wrap-деформацию с
деформацией костей. В случае, когда влияние костей не нужно, то есть в состав Skin Cluster-
деформера должны войти только «geometry influence» объекты, можно для создания деформера
привязать объект к временно созданной кости. Затем добавить управляющие объекты с помощью
меню Skin=>Edit Smooth Skin=>Add Influence. После чего удалить кость.
Всем хорош данный метод, но все же он имеет недостатки. Во-первых, в отличие от Wrap-
деформера, Skin Cluster-деформер не реагирует на изменение значений трансформа базовых
(Base) управляющих объектов, хотя это редко когда нужно. Во-вторых, он работает медленнее,
чем Wrap-деформер, хотя деформации и выглядят лучше. Похоже, что это результат постоянной
оптимизации работы Wrap-деформера, которая не коснулась аналогичного кода в Skin Cluster-
деформере.
Wire и его dropoff-локаторы
Возможности этого деформера незаслуженно опущены в документации Maya. Его
главные достоинства в том, что он работает быстро и качественно. Но мало кто знает (а тем
более использует) некоторые его функции, которые появляются при создании на управляющей
кривой dropoff-локаторов. Ведь именно они позволяют не только гнуть, но и масштабировать и
698
Книга Сергея Цыпцына
№
закручивать объект относительно кривой, что незаменимо, например, для анимации губ. Стоит
только на управляющую кривую поставить два dropoff-локатора, как у Wire-деформера появятся
возможности скручивать не хуже, чем у Twist-деформера! После создания локатора к деформеру
автоматически добавляется набор динамических атрибутов: locatorEnvelope - множитель к общему
атрибуту envelope - и locatorTwist - относительное вращение. А также атрибуты param и
percent, которые можно увидеть только в Attribute Editor, или выделив сам dropoff-локатор. Удобно
управлять этими параметрами с помощью Show Manipulator Tool, наглядно передвигая локатор по
кривой и изменяя, если нужно, дистанцию влияния деформера в данной точке. Изменяя все эти
значения, можно увидеть, как Wire-деформер интерполирует эти значения между локаторами
вдоль кривой.
К сожалению, у деформера в этом наборе отсутствует атрибут locatorScale, его атрибут
scale управляет масштабом относительно всей кривой. Но выход из этой ситуации есть. Если
такой контроль нужен, можно использовать последовательно два Wire-деформера. Первый будет
управлять масштабом, а второй гнуть и скручивать. Для этого нужно выставить атрибут scale в
нужное значение (например, 2), а уже атрибутами locatorEnvelope управлять величиной масштаба
в выбранных участках. Это действие даже можно автоматизировать, если сделать Driven Key от
ноды arcLengthDimension, которая будет измерять длину управляющей кривой и, в зависимости от
этого, расширять или сужать объект в нужных областях.
Будьте готовы к тому, что у параметров locatorTwist есть неприятная особенность: обычные
ключи и Driven Key ставятся в радианах, но связываются с нодой, как градусы. Это, конечно же,
недоработка программистов. Рекомендую поправлять значения ключей в Graph Editor, а перед
тем, как поставить новый ключ, копировать его значение из Channel Box в буферную память.
Если у Wrap-деформера имеется один dropoff-локатор, его атрибуты будут влиять на весь отрезок
кривой. Таким образом, помимо scale появится еще возможность делать операцию twist.
Пример такого влияния находится в файле wire_for_lips.mb
Wire + Wrap
Еще один трюк. Я уже упомянул о том, что можно добиться хороших результатов объединив
мощь этих двух деформеров. Эта комбинация используется для анимации лица, когда нужно
добиться очень качественного и реалистического движения кожи персонажа. Wrap-деформер
- хороший деформер, но в тех местах, где сетка обрывается или загибается во внутреннюю
сторону, как это происходит с области губ, больше подходит Wire-деформер. Так Wrap отвечает за
деформацию лица в целом, а Wire-деформер за области губ (глаза, брови и прочее - по желанию).
При построении управляющей Wrap-сетки для лица можно сильно упростить себе задачу, если
заставить деформироваться управляющую wire-кривую той же управляющей wrap-сеткой, что и
для деформируемого объекта.
Таким образом, в области губ управляющая wrap-сетка не замкнута и топологически
радиальная. В этой области строится замкнутая кривая, чьи вершины точно совпадают в
пространстве с крайними вершинами wrap-сетки.
После чего создаются два Wrap-деформера от одной управляющей сетки, один для
деформируемого объекта, а другой для управляющей wire-кривой.
Это можно сделать за один раз, выделив три объекта (причем последним из них должен
быть управляющий wrap-объект) и вызвав меню Deform => Create Wrap.
Затем создаем Wire-деформер для деформируемого объекта (меню Deform => Wire Tool с
параметрами), но при этом переключив параметр Deformation Order в режим Parallel.
Теперь Wire и Wrap деформеры параллельно деформируют наш объект. Осталось только
разграничить их зоны влияния, чтобы не было двойной трансформации.
Деформеры
699
Самый простой способ сделать жесткую границу, выделив поочереди каждый деформер, и
инструментом Edit Membership Tool удалить для каждого из них ненужные вершины. Но чаще всего
желательна мягкая граница. Однако встроенные в Maya средства, к сожаленью, не позволяют
этого сделать. Чтобы не прибегать к программированию, попробуем приспособить для этой цели
сам Blend Shape-деформер, который уже был автоматически создан Maya в процессе и назван
parallelBlender. В Maya 7.0 у Blend Shape-деформера появилась возможность маскировать каждый
канал. Но при попытке зайти в окно инструмента Paint Blend Shape Weights Tool, выясняется, что
не на чем рисовать! Более того, вызываем окно Blend Shape и там не находим нашего деформера.
Для того, чтобы случилось это чудо, нужно обнулить одноименный атрибут деформера parallel-
Blender. Этот атрибут делает его невидимым, чтобы он не смешивался с традиционным Blend
Shape-деформером. Поэтому для того, чтобы он стал доступным для нормальной работы, нам
нужно выделить его и запустить команду:
setAttr .parallelBlender 0;
Но этого не достаточно для того, чтобы начать красить веса каналов. Нужно еще зайти в
окно Blend Shape и переименовать каналы деформера, например: wrap и wire. Теперь уже, открыв
Shape Weights Tool, можно приступить к раскраске весов параллельного деформера.
Лучше начать рисование с маски канала wire (Wire-деформера), проверяя работу деформера
в действии. Так как зона действия деформера в нашем случае зависит от маски, стоит сильно
увеличить значение его атрибута dropoff Distance, например, до 100. Затем эту маску следует
записать в файл, пользуясь закладкой Attribute Maps / Export. Затем, обнулив маску канала wrap,
импортируем (закладка Import) этот файл и инвертируем его, так же, как описано в разделе
«Советы по скинингу» для Cluster-деформера.
Этот способ не самый изящный, к тому же требует от объекта наличие корректного UV-
маппинга, если он полигональный. Если каналов не два, а более, лучше начинать с маски Wrap-
деформера, как самого большого по площади влияния. Более простой способ раскрашивания
заключается в выделении группы faces, относящихся к одному деформеру, и назначение им
единичного или нулевого значения влияния с помощью заливки кнопкой Flood в режиме
Replace. Затем делается инверсия выбора на компонентном уровне и новой группе назначается
противоположное значение влияния. И в самый последний момент, когда все зоны уже
определены, в режиме Smooth для каждого деформера нажимается определенное количество раз
кнопка Flood. Это создает плавный переход между влиянием разных деформеров в пограничных
зонах. Очень важно, чтобы количество нажатий было одинаково для каждого деформера, иначе
результирующее влияние на эти вершины будет не единичным, то есть не нормализованным, что
приведет к двойным транформациям.
Пример распределения весов этим способом находится в файле wrap_and_wire.mb
Будем надеяться, что в следующих версиях Maya еще больше расширятся возможности
деформера Blend Shape, чтобы для таких случаев в режиме parallelBlender была возможность
700
Книга Сергея Цыпцына
№
рисовать веса с автоматической нормализацией, как это делается при раскраске весов Skin Clus-
ter-деформера.
Wrap для одежды
Очень часто при построении одежды приходиться прибегать к помощи Wrap-деформера. Эта
необходимость возникает в ситуации, когда проще для симуляции построить сетку гораздо проще
по топологии, чем финальную для рендера. Но лучшим решением этой задачи не будет полный
Wrap одежды, а частичный. Дело в том, что одежда содержит большое количество полигонов,
который Wrap-деформер обрабатывает достаточно медленно. Не помогают даже параметры weight-
Threshold и maxDistance, которые созданы для оптимизации и быстродействия деформера, и,
вследствие отсутствия кэша данных «привязки», ваши сцены обречены на долгое открытие. Чтобы
избежать этого, можно добавлять дополнительные элементы, такие, как карманы, воротник и
прочие накладные элементы одежды поверх симулирующегося объекта, «врапируя» их кусочками
одежды, находящимися под ними. Это позволит сильно оптимизировать Wrap. Для разбиения
одежды на куски, я использую инструмент Edit Polygons => Extract (с включенным параметром
Separate Extracted Faces). А он, на замену исходному объекту, образует группу из несколько новых
объектов, содержащих те полигоны, которые вы выбрали на одежде перед его применением.
Первоначальный объект он скрывает, поэтому придется включить Visibility объекта transforml (так
теперь называется исходный объект), выделить его скрытый Shape и выключить параметр
Intermediate Object. Новые «кусочные» объекты будут служить объектами влияния Wrap-деформеров
для каждого из накладных элементов. По окончании всех настроек их нужно будет скрыть. После
применения операции Extract в истории каждого из этих кусков имеется нода polyChipOff, и с
помощью ее атрибута localTranslateZ можно сдвигать их полигоны по нормали, что может быть
полезно для настройки Wrap-деформеров одежды с «толщинкой».
Wrap как непрямой скининг
Используя Wrap-деформер вместо Skin Cluster-деформера, мы выигрываем только в
нескольких случаях. Во-первых, этот способ позволит нам привязать типологически сложную
сетку к костям, «прискинив» более простую управляющую сетку Wrap-деформера. Дело в том,
что настройка весов плотной и неравномерной сетки инструментом Paint Skin Weights Tool - задача
совсем не простая, а порой и невыполнимая. Во-вторых, этим способом можно привязать к костям
сразу несколько объектов, а управлять одним. И в-третьих, это позволяет достаточно быстро, при
хорошем планировании, подменять однотипные деформирующиеся объекты. То есть для больших
проектов, где требуется достаточно быстро подготовить к анимации персонажей, как правило,
второго плана, этот способ заслуживает большого внимания.
Но увы: у «непрямого скина» множество недостатков. С некоторыми, такими, как
недостаточное быстродействие, можно еще смириться, другие можно обойти. Но есть среди них
недостаток, который в некоторых случаях ставит крест на использовании Wrap-деформера.
Это неконтролируемое распределение влияния вершин объекта влияния. При настройке
деформации очень часто сталкиваешься с тем, что деформируемая поверхность в некоторых
областях реагирует на те вершины объекта влияния, которые нежелательны. Это из-за того, что
тела персонажей представляют собой сложную поверхность, где для каждой зоны нужен особый
подход, а настройки у Wrap-деформера одни - на все тело. Даже возможность использовать
множество управляющих объектов в составе одного Wrap-деформера не решит этой проблемы.
Деформеры
701
Просто учит сложной графике
Мы погружаем студентов в учебу. Занятия начинаются в 10 утра и заканчиваются не раньше 10 вечера.
Мы дорожим каждой минутой обучения, поэтому наши студенты могут жить и учиться в одном здании.
Наши преподаватели — профессионалы в различных областях компьютерной графики.
Они преподают в свободное от производства время не чаше одной недели в месяц.
Мы живем своим делом. Мы умеем рассказывать о сложных вешах простыми словами.
RealTime
/school/
За восемь лет мы обучили более 1600 человек из России, США, Китая, Франции, Англии, Германии,
Канады, Израиля, Словакии, Чехии, Белоруссии, Украины, Аатвии, Аитвы, Эстонии,Казахстана,
Таджикистана, Киргизии, Армении, Грузии, Азербайджана, Молдавии.
Список тех, кто доверил нам обучение своих сотрудников — наша лучшая рекомендация
«Арт. Лебедев Групп»» • «EGG» • ОАО «Первый канал>» • «UKK» • РАО «Газпром>» • «TVStudio» • «КомпьютерПресс» • «MDMPalas>» •
СТС • «3d Art» • ОАО «Московская телекоммуникационная корпорация» (КОМКОР) • «TVMaxima» • ЗАО «Издательство Семь
Дней» • «Gorod Info» • ЗАО «НТВ-ДИЗАЙН» • «Argus International Studio» • Киностудия «Союзмультфильм» • АО «АВТОВАЗ» •
«Gamez Magazine» • ОАО ПЕРВЫЙ КАНАЛ «ОРТ-ДИЗАЙН» • Музей Московского Кремля • 000 «Графарт» • Киностудия «КВ-фильм
продакшн» • «Illuzion Studio» • ФГУ «ГИКМЗ Московский Кремль>» • «AllianceMedia» • Фонд Сороса • «APR Advertising» • Центр
подготовки космонавтов • «Afcom • ЗАО ИД «Комсомольская Правда>» • «IBA» • ОАО «Сургутнефтегаз» • «ВаЫсЬ design» •
Телекомпания «Класс!» • «Alive-Graphics» • ОАО «Аэрофлот-Российские авиалинии», г. Химки • «Binatone» • Российское
Национальное Авиа-Космическое Агентство, г. Екатеринбург • «Clarence S.R.C.» • «Студия Артемия Лебедева» • «DTVMA
Production Centre» • Продюсерский центр А. Кончаловского, г. Москва • «DigttAMa studio» • ЦУП «КОНСТРУКТОР» • «SMS MEDIA
SOLUTIONS» • Анимационная студия «РЕН-ТВ» • ОАО «ВымпелКом» • «СКПЕТЕРБУРГ», г. Санкт-Петербург • «АВВУ^ОЯТШЕ
HOUSE» • Национальный Банк Республики Казахстан • ТВК «6-КАНАЛ», г. Красноярск • Международный Университет Бизнеса
и Управления • «EastLine» • «Полезные страницы За рулем» • «PE-Studio» • КБ «Сиббизнесбаню» • «Flasber.Ru» • «GiproGas»*
«Glover Inc.» • Центр Бакулева • ОАО «Новая Телефонная Компания» • «Matrix Studio» • ОАО «Нижнетагильский
металлургический комбинат» • «Telesens Ukraine Ltd» • ЗАО <ЛУКОЙЛ Пермь», филиал «Ватойл», г. Когалым • «GUDPDSU» •
Издательство «Атлант» • ПЭО «Татэнерго» • «Russian Oil Export» • ТРК«Наш дом» • «New Channel» • #4 < 7д*7» • «MOONLighters
А.С.Design lab» • ОАО «Комбинат Праздничных Вин» • «TRIART Graphics Studio» * PA «Комар» • «IBA/MINSK/JD» • «NMG Company»
• Интернет-кофейня «Кукушка» • «SmartP» * Студия «Махаон>» • «UR Studio» • ФГУП «Атомтехэнерго» * ISP «Nordnet» • ЗАО АКБ
«Газбанк», г. Тольятти • «TopEilm» • 000 «Издательство Эксмо>» • 7VC «Panorama» • ТРК «Новый век», г. Казань • «Rigit
Remarket» • Всероссийский Центр глазной и пластической хирургии, г. Уфа • «NTComputers» • Издательство «Экономика и
образование» • «IKC Krane Safety*» • ОАО «Белгородский молочный комбинат» • «Mala Kurdan» • 000 «Золотой ВЕК» •
«7RANST0R» • «Союзэкстрт» • «LeriLTD» • ИКЦ«Экспресс» • «MatrixStudio» • 000 «Академия» • «TekoEilms» • Студия «Пилот»
• «TVS» • Фонд «GenEx» • Музыкальный телеканал «Enter Music Television*», г. Киев • «RaGtime» • «Ulter-West» • «Православное
Видео>» • «Росароз» • «Уренгойгазпром» • «Цвет-ИнМарК» • 0JSC «SeverTransConv» • UBTec «Флюгер. Информационные бизнес
системы» • Академическая филармония им. Д. Шостаковича • ВЦ «Балтик-Экспо>» • ГТРК «Алания» • ГТРК Самара • ГУП«КБП>»
• ЗАО «ИнформЗащита» • 340 «Концепт» • ЗЛО ТД «Сувенир Арт» • ЗЛО «ЭКОНИКАТехно» • ИЦ «Энергопрогресс» • Киностудия
ЕАЕ • Марш-медиа • НГДУ «Быстринскнефть» • НПКФ «МЕДИКОМ-МТД» • 040 «Белгородэнерго» • Национальная вещательная
компания «Саха» • ОАО «Краснодаргражданпроект» • ОАО «Металлургический комбинатАзовсталь» • 000 «ИТЕРАХолдинг» •
000 «ББДО-маркетинг» • 040 «Усть-Иличскхлеб» • ОТТРКЯмал • ОДУ Урала РАО «ЕЭС России»» • «Проект EMS» программы Tads
EU • 000 «5,Л/еЬ«т» • 000 «Ж» • 000 «Мелорама» • 000 «Мшена» * 000 «Пи ЭсАй»» • 000 «Солнечный Дом ДМ» • 000 МНП
«Геодата» • 000 «ТестТВ» • Маркетинговое агентство «Vnilinx» • 000 «Юнилевер СНГ» • ОТРК «Югра» • ЯРГЖ «Новый
Уренгой» • РЖ «Белорусский металлургический завод» • Студия «Классика» • Студия «Стороны^* • Студия «Надым ТВ» •
Студия «СанИнформ>» • Телеканал «1+1 >» • ФГУ «ЦЕНТРГЕШФОНД» • ФГУП«ВИАМГНЦРФ> • ФГУП «ЦНИИ-Курс > • Свердловский
областной общественный фонд «Лидер в бизнесе» • Филиал АО «еДевелопмент А1г>» • Филиал ЧКОО «Октавиан интернешэнл
лимитед» • «Поверхность ТВ», г. Киев • ОАО «ТЯЖМАШ» • ТРК «Норд», г. Югорск • 000 «Уникум СИМ» • ОАО «ЗМЗ», г. Заволжье •
ГУИР ФАПСИ • ОАО «Томсктелеком»» ЦИС • «Дизайн Групп Проект» *ИП< Давыдов» • 000 «Метка Со» • «Нитер-КрымТВ» • <Я)5
Design Group» • РГ «Союз», г. Тюмень • ЯП77 «Хабаровсгражданпроект>», г, Хабаровск • 340 «Лз/>д» * ГУ «Информационно-
маркетинговое агентство МК и ДР РС(Я)>», г. Якутск, Республика Саха • ЗЛО АКБ «ЦентроКредит» • «H-studio Desigm •
Видеостудия «AVDomem • ИТЦ «Сканкод» • Журнал «Moscow. The Official city guide» • 000«ЛИССИ» • PA «Максима» •Рекламная
компания «АДВ-Медиа», г. Новосибирск • 000 «ЛИДЕР» • 000 «Проф-Проекпр», г. Люберцы • Фото дизайн студия «Элита-
Проджект» • Компания «Smith&Hartman» • 340 «Музыкальный арсенал» ОПТ, г. Тюмень • О40 ТК«Сфера», г. Нижневартовск •
000 «Смешарики», г. Санкт-Петербург • Часовая компания «Денисов» • «Гипроград-мультимедиа», г. Николаев • 340 «MB-
ПРИНТ», г. Нижневартовск • ЗАО «Бизнеслинк Реклама», г. Санкт-Петербург • РГ «Мелехов и Филюрин>», г. Новосибирск •
Дизайн-студия «Оринянский»^ • ОАО «Западно-Сибирскийметаллургический комбинат», г. Новокузнецк • 040 «Дизайн-центр»,
г. Гомель, Республика Беларусь • 000 «СКЭЛКО», г, Лесозаводск • Студия «Новой электроники» • РА «Скрин-ТВ», г. Архангельск
• SIA BEICOBAITIC, г. Рига, Латвия • 000 «АСК Фриз» • 000 «АМеерсон с Партнерами» • 000 «Студия Парадокс» • Студия
дизайна «Slogger» • «KSI Corporation» • 000 «ЯМБУРГГАЗДОБЫЧА» • 0А0«РЖД>», филиал «Оренбургскийлокомотиворемонтный
завод», г. Оренбург • «HANTWEBstudio», г. Рига • 000 «ВИСС-Белгород», г. Белгород • РА «Дискавери», г. Москва • Кинокомпания
«UnitedMultemedia Project» • Телекомпания «Держава»» • Информационно-консалтинговая группа «Цезарь», г. Тюмень • Филиал
ГУ ОГТРК «Ямал-Регион», г. Новый Уренгой • 040 «Нижфарм», г. Нижний Новгород • 000 «Интер-Коншинент>», г. Киев •
Лаборатория Мультимедиа Пермского Государственного Университета • 000 «Форум Дизайн», г. Наро-Фоминск • Студия
«Excellence» • 340 «Авиакомпания Волга-Днепр>», г. Ульяновск • Дизайн-студия «Vazari» • ОАО «Точка отсчета» • 000 «Премьер
диджитал>» • Тимашевское телевидение «ТТВ>», г. Тимашевск, Краснодарский край • ТРК «Наш дом>», г. Каменка •
Архитектурное бюро «Классикш» • ОАО «Конноспортивный комплекс Битца» • «STUDIO 49», г. Москва • «TMA-Draft» • «СТС-
ПЕРМЬ», г. Пермь • РА «Золотаярыбка» • ГК «Mirax» • 340 «ССС-900», г. Новосибирск • Дизайн студия «Парк» • IP «UETUV0S
TELEKOMAS» sport club • 040 «Ависма>», г. Березники, Пермская обл. • 000 «Дом современной упаковки» • Смоленский учебно-
тренировочный центр, г. Десногорск • 000 <Ландшафтное бюро Зеленая точка»» • Студия «Зебра» • Хабаровский центр
дистанционного обучения, г. Хабаровск • Телекомпания «Все для Вас» • ГУЛ «КБП>», г. Тула • 340 «АйПи-Тел», г. Электросталь •
«Интерсвязь», г. Жуковский • VON Hagens Plastination (Dalian) Co. ltd. • ФГУП ГТРК «Чувашия», г. Чебоксары • PA «Sport
Technology», г. Мурманск • «КонцернЛемо», г. Санкт-Петербург • 000 «Каспийгазпром», г. Махачкала • ЗАО «Микояновский
мясокомбинат» • 000 «ТРАНСПРЕСС» • «Informap Rus» • О40 «МОСЭНЕРГО», филиал ГРЭС-24, г. Новомичуринск • Технический
центр «CPS» • 000 ИД «РИПОЛ классик» • 000 «МИКРиэлт» • 000 «Мебельное ателье ПОРТАЛ», Башкортостан • АБ «АРБАТ» •
ЗЛО «РЕАЛЭСМЕДИА» • 000 «ТВ КУПОЛ», г. Санкт-Петербург • Подарок каждому, кто придет к намучиться с этой книгой •
ТРК «Цивилизация» • «Новый диск», г. Ярославль • «ARTSTUDIO FAMILY» • «ЭнерКомСервис», г. Сургут • Журнал «Mobility-Уфа»,
г. Уфа • 000 «Стройинформгрупп» • «ТПО-5 Бюро Платонов» • 000 «Росинтер» • КРЦ «Слава» • ОАО Институт «Гомельпроект
>», г Гомель • PA «Das-marketing», г. Алматы • ТМСА Ермакова • ОАО «Запсибгазпром», г. Тюмень • «Gorimpex>»• PA «Good»,
г. Алматы • «Хантымансийскэлектросвязь», г. Ханты-Мансийск • 000 «Агентство Инвестиций в Недвижимость» •
000 «Производственная группа Виктория», г. Рязань • 000 «Звездная Линия», г. Курск • «Дискомпроект», г. Москва
Книга первая
с.1 - 704
Цыпцын Сергей. Понимая MAYA
Главный редактор: Михаил Шатилов
Литературный редактор: Владимир Болотников
Координатор: Иван Пахомов
Верстка и дизайн: Александр Костин (KostinPublishing)
Корректор: Вера Позднякова
Подписано в печать 05.04.2007
Формат издания 60x90/8
Уч. печ. л. 50. Тираж 3000. Заказ № 70624
Первый завод 1 - 1500
Печать: ООО "Август Борг" 121009, Россия,
Москва, Шубинский пер., д. 2/3
Информационная поддержка: www.cgtalk.ru
Отдельное спасибо: Real Time scool
Издательство: ООО "Арт Хаус медиа", Россия, 115035, г. Москва, а/я 42
Заказ книги: director@protodesign.ru
Все права защищены.
© Цыпцын Сергей, 2007
® 2007 Издательство ООО "Арт Хаус медиа".
Внимание! Книга защищена законом об авторских правах.
Ни одна часть или изображение из этой книги не может быть опубликовано, перепечатано,
отправлено электронным способом или другим любым способом без специального письменного
разрешения издательства! Все эксклюзивные права на ее содержание принадлежат издательству.
О любых нарушениях и незаконных копированиях просьба сообщать в издательство по адресу:
Россия, 115035, г. Москва, а/я 42; e-mail: director@protodesign.ru