Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ponimayka1

.pdf
Скачиваний:
123
Добавлен:
07.06.2015
Размер:
37.11 Mб
Скачать

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

Работа с секретными нодами. pointOnSurfacelnfo и rotateHelper

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

Прежде всего, можно заметить еще в Attribute Editor, что в закладке transform атрибуты translate и rotate помечены желтым, то есть имеют входящие связи от других объектов. Там же, в Attribute Editor, присутствуют некоторые закладки с загадочными именами типа nurbsTorus1Geom188Loc и nurbsTorus1Geom188Align.

В этих закладках можно определить тип этих нод, pointOnSurfacelnfo и rotateHelper, соответственно.

141

Как следует из документации к ноде pointOnSurfacelnfo, на вход к ней подается информация о поверхности и два числа, U и V координаты, которые однозначно определяют точку на поверхности. На выходе нода вычисляет трехмерные координаты этой точки, нормаль и касательные к поверхности в этой точке. U и V координаты можно найти в Attribute Editor в виде двух атрибутов: Parameter U и Parameter V, изменяя которые можно заставить конус перемещаться вдоль поверхности.

Таким образом, как следует из Hypergraph, нода pointOnSurfacelnfo, созданная для каждого конуса, вычисляет трехмерные координаты точки на поверхности тора, заданные атрибутами Раrameter U/V, и подает результат вычислений на атрибуты translate конуса, что заставляет его всегда «приклеиваться» своим пивотом к поверхности. Тут, вроде все, понятно, за исключением быть может, связи между поверхностью тора и нодой pointOnSurfacelnfo.

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

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

ипоказав его связи в окне Hypergraph, можно сделать следующие выводы:

142

Нода rotateHelper служит для того, чтобы развернуть объект перпендикулярно поверхности в данной точке. На входе она принимает от ноды pointOnSurfacelnfo вычисленные координаты нормали и одной из касательных в точке поверхности. Эти коодинаты подаются на ее входные атрибуты uр и forward. Получив два направления, «вверх» и «вперед», нода rotateHelper вычисляет три значения вращений, на которые надо развернуть объект, чтобы он смотрел своей локальной осью Y вдоль направления «вверх» (uр), а своей локальной осью X - вдоль направления -вперед» Howard). Три этих значения для вращений просто присоединяются на выходе к атрибутам rotate для конуса, чтобы он развернулся своей макушкой по нормали к поверхности, а осью X вдоль поверхности.

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

Первый способ: «нарисовать» объектом по поверхности, как было показано выше, затем удалить ненужные объекты и, с помощью атрибутов Parameter U/V у ноды pointOnSurfacelnfo, привести объект в нужное место на поверхности.

Второй: можно сделать все вручную, создав две ноды pointOnSurfacelnfo и rotateHelper с помощью команд

createNode pointOnSurfacelnfo; createNode rotateHelper;

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

Примечание. Нода rotateHelper - не «родная» для MAYA, а реализованная в виде плагина. Чтобы она создавалась и работала без проблем, надо в окне Plugin Man­ ager включить галочку напротив плагина rotateHelper.

Третий способ: если работа с нодой rotateHelper вас пугает, достаточно создать и присоединить, как положено, ноду pointOnSurfacelnfo для закрепления объекта на поверхности, а для ориентации его по нормали можно воспользоваться Normal Constraint.

Остается, правда, открытым один довольно серьезный вопрос. Нода pointOnSurfacelnfo работает только со сплайновыми поверхностями. А как же закрепить объект на полигональной сетке? Можно скачать с сайта www.alias.com соответствующий Bonus Tools Pack, расширяющий стандартные возможности MAYA. В состав этого дополнения входят такие ноды, как pointOnMeshlnfo и pointOnSubdlnfo, реализованные, как плагины. Однако количество усилий в этом случае, похоже, превысит разумные пределы.

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

Использование нод не по назначению. Real Trans Objects. Пересадка объектов вместо волос на произвольную поверхность

Коль скоро в MAYA с некоторых пор появились инструменты для работы с волосами, с том числе и для их укладки и причесывания, то в самом устройстве «майских» волос заложена возможность «засаживать» любую (а не только сплайновую) поверхность, и притом не только волосами, но и произвольными геометрическими объектами.

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

143

ноду для прикрепления любого объекта к поверхности, в частности к полигональной сетке.

Вновой сцене создайте полигональный тор, растяните его (scale =7) и, как обычно, добавьте

всцену сплайновый конус (или цилиндр).

Теперь без всякого контакта с динамикой волос выполните в Script Editor команду:

createNode follicle;

Обратите внимание: в Outliner тут же появится новый объект follicle1. На самом деле были созданы две ноды: одна типа follicle, имя которой follicleShape1, а другая типа transform, называемая folliclei . (Наиболее подкованные умы даже, возможно, сообразят, что folliclei представляет собой DAG-объект.)

Выбрав в Outliner новый объект, можно пойти в Attribute Editor и обнаружить там две закладки. Во второй закладке (follicleShape1) можно увидеть два атрибута Parameter U/V, определяющих, очевидно, в каком месте поверхности должно находится основание волоса.

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

Прежде всего, надо сообщить ноде типа follicle, с какой поверхностью она будет иметь

дело.

Для этого откройте Connection Editor.

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

Нажмите в Connection Editor кнопку Reload Left, чтобы загрузить атрибут pTorusShape1 в левую панель.

Затем выберите в Outliner объект follicle1 и опять нажмите стрелку вниз, чтобы выбрать ноду типа follicle (follicleShape1), а не transform.

Нажмите в Connection Editor кнопку Reload Right.

144

Сначала соедините атрибут World Matrix ноды pTorusShape1 с атрибутом Input World Matrix ноды follicleShape1.

Затем также присоедините атрибут OutMesh слева и атрибут Input Mesh справа.

Теперь нода follicleShape1 «знает», с какой поверхностью она работает, и потому будет однозначно вычислять трехмерные координаты точки, заданные атрибутами Parameter U/V.

145

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

Для этого достаточно загрузить ноду follicleShape1 в левую панель Connection Editor (не забываете про стрелку вниз), а конус - в правую панель.

Далее надо присоединить атрибуты Out Translate и Out Rotate слева, соответственно, к атрибутам Translate и Rotate конуса справа.

Конус мгновенно «прыгнет» на поверхность и повернется так, чтобы смотреть по нормали к поверхности своей локальной осью Z.

146

Дальше, конечно, можно быстро поколдовать с локальными осями, чтобы развернуть конус макушкой по нормали (например, в Attribute Editor задать для конуса Rotate Axis=90 0 0.)

Однако можно использовать более гибкий и функциональный подход. Отсоедините в Connection Editor атрибуты конуса от ноды follicleShape1.

У нас в сцене «пропадает» целый transform по имени follicle1, который грех не использовать. Глазастые, умы наверное, уже заметили на экране специальную иконку для него.

Выберите follicle1 в Outliner и загрузите его в правую панель Connection Editor.

Затем присоедините атрибуты Out Translate и Out Rotate ноды follicleShape1 слева, соответственно, к атрибутам Translate и Rotate ноды follicle1 справа.

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

Перетащите и бросьте в окне Outliner конус на follicle1 средней кнопкой мыши.

147

Преимущество такого подхода состоит в том, что мы теперь можем дополнительно вращать или смещать конус относительно точки «закрепления» на поверхности. Задайте для конуса rota- teX=90, и он развернется макушкой вдоль нормали к поверхности тора.

Чтобы задать положение конуса на поверхности, надо выбрать folliclei и в Attribute Editor, во второй закладке, установить нужные значения атрибутов Paramete U/V, задающих координаты точки на поверхности. Задайте ParameterU=ParameterV=0.5, и конус переместится на внешнюю часть тора.

Примечание 1. Как видите, нода follicle работает не только со сплайновым поверхностями, но и с полигонами. Однако вы должны понимать, что в отличт от сплайнов, полигональные поверхности не всегда имеют хорошие и равномерна распределенные UV-координаты, поэтому вам надо заранее позаботиться о тон, чтобы в том месте поверхности, куда вы собираетесь «сажать» ваши объекты, были адекватные значения UV-координат.

Примечание 2. Большое преимущество такого подхода в том, что в разделе Extra Attributes у ноды follicle есть атрибут Map Set Name, позволяющий задать, из какого UV-набора будут использоваться UV-координаты для определения положении точки на поверхности.

Примечание 3. В случае сплайновых поверхностей вместо атрибута outMesh надо присоединять атрибут Local от поверхности к атрибуту Input Surface ноды fol­ licle.

Полученная сцена сохранена как follicleConstraint.ma. Вы всегда можете открыть ее, кап образец, и исследовать связи между объектами в Hypergraph.

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

148

по их прямому назначению. Ведь MAYA это конструктор, поэтому если какой-то объект или нода подходят для выполнения «не свойственных» им задач, смело используйте их в своих целях.

Примечание.

Самые

проницательные

умы конечно

же,

обнаружат

в

тайниках

MAYA

вяло

документированные

ноды

furPointOnMeshlnfo и

furPointOnSubd.

Никто

не может запретить вам использовать их для решения

только что

описанной

задачи.

Эти же ноды

позволяют также определить,

в пределах какой

грани

(faceln-

dex) вы хотите задать точку

на поверхности.

 

 

 

 

 

Рассмотрим далее еще один пример «нелегального» использования нодовой архитектуры.

Цветокоррекция.

Использование анимационных кривых не по назначению

Для получения качественной картинки почти всегда в шейдерах приходится использовать разного рода текстуры, и в первую очередь текстуры для цвета. И почти всегда исходный материал для них приходится дорабатывать. Отчасти из-за специфики освещения (свет может быть сильным или даже цветным), отчасти для того, чтобы добиться точного цветового баланса между различными составляющими сцену объектами при рендеринге. Определенным образом можно «подправить» цветовой баланс используемой текстуры в Attribute Editor с помощью атрибутов из раздела Cotor Balance, но для более сложных правок приходиться пользоваться внешними программами, например, это Photoshop.

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

Откройте новую сцену.

Откройте HyperShade и выделите материал lambert1.

Перетащите его в рабочую область HyperShade и увеличьте его изображение.

Выбрав его, откройте Attribute Editor и назначьте на канал цвета какую-нибудь файловую текстуру. Возьмите, например, стандартное изображение:

X:\Program Files\Alias\MayaN.N\brushlmages\wrapCloud.iff

Можно заметить, что текстура назначилась не только на цвет, но и на прозрачность (это ненавязчивый «майский» сервис, распознающий альфа-канала в назначаемом изображении.)

Выберите в HyperShade материал lambertl и покажите его входные связи (Graph=>lnput Connections.)

Выделите связь, идущую на прозрачность материала (transparency), и удалите ее, чтобы лучше видеть текстуру, назначенную на цвет.

Попробуем встроить в наш материал конструкцию, функционально повторяющую известный и один из наиболее общеупотребительных инструментов Photoshop'a: Adjust Curves.

Очевидно, что между нодой file1 и нодой lambert1 надо вставить некие кривые, которые будут модифицировать полученный из текстуры цвет и отдавать его материалу lambert1.

149

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

Вопрос в том, как создать «пустые» анимационные кривые? Можно, конечно, установить ключи на какой-нибудь объект, а потом убрать в Hypergraph все связи анимационной кривой с другими нодами (в данном примере понадобились бы ключи и анимационная кривая от инструмента Set Driven Кеу). Однако проще сделать кривые с помощью команды createNode, создающей ноды определенного типа.

Итак, откройте Script Editor и выполните три набора команд, создающие три анимационные кривые, которые позволят нам модифицировать каждый из цветовых каналов (RGB) текстуры:

createNode animCurveUU n redColorCorrectionCurve; setKeyframe -f 0 -v 0;

setKeyframe -f 1 -v 1 ;

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 следует пара команд setKey­ frame, расставляющая два ключа на только что созданной кривой. Можно, конечно, было бы пытаться добавить ключи к пустой анимационной кривой «вручную», через Graph Editor, но поверьте мне: выполнить две MEL-команды гораздо проще. Длинные имена после флага -п для! создаваемых кривых совершенно ни к чему, это, так сказать, эстетские выкрутасы.

Теперь мы должны разорвать связь атрибутов file1.outColor и lambert1.color, затеи выход каждого из цветовых каналов текстуры (красного, синего и зеленого) подать на вход соответствующей анимационной кривой, а затем выходы анимационных кривых подать на соответствующие цветовые каналы материала lambert1

Выделите и удалите связь между file1.outColor и lambert1.color в HyperShade.

Затем откройте Connection Editor, выделите текстуру filel и загрузите ее в левую панель Connection Editor.

Для того, чтобы быстро разыскать созданные анимационные кривые, откройте Outliner и снимите в его меню галочку DAG Objects Only.

150

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]