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

ponimayka1

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

Довольно схематическая формула говорит о том, что выход равен полусумме двух входов. Причем не уточняя, что именно подается на вход и что присоединяется к выходу. Оказывается expression может существовать сам по себе, без связей с другими объектами.

.I[0] и .|[1] суть обозначения атрибутов input[0] и input[1], которые, как можно догадаться, присутствуют у ноды expression1. О[0] соответствует имеющемуся атрибуту output[0].

Совершенно очевидно, что если вы, орудуя мышкой и используя Connection Editor, присоедините «а входы (input[n]) ноды expression1 какие-либо атрибуты кубиков, а выход (output[0]) также лрисоедините к нужному атрибуту сферы или тора, то expression снова заработает определенным вами образом, и MAYA, с большой долей вероятности, даже правильно отобразит его формулу в Expression Editor.

Данный эксперимент, позволяет представить expression как ноду совершенно общего назначения, с произвольным количеством входов и выходов. Конечно, такой радикальный взгляд на природу expressions несколько необычен, но в целях привыкания к логике MAYA попробуйте иногда представлять их именно так.

Вопросы мироздания и философии. Единство и борьба противоположностей. Expressions против Nodes. Кто главный? Элементы маразма. Области применения противоположностей Материал изложенный далее, требует некоторой подготовки, поэтому если вы пока еще морально не готовы столкнуться с малопонятными вещами, можете пропустить остаток главы. Кроме того, уровень абстракции и обилие общих рассуждений могут нанести психический урон незакаленным творческим натурам. Если же вы действительно готовы разобраться во внутренностях MAYA читайте дальше! Ну, а тем, кто метит в технические директора или в разработчики, изложенное ниже следует выучить наизусть.

У некоторых пытливых умов может возникнуть резонный вопрос: в чем принципиальная разница между expressions и нодами? Когда применяются одни и когда другие? Если и те и другие представляют из себя «ящик» с несколькими входами и выходами, которые можно присоединять «другим объектам, то кто из них имеет преимущество? На первый взгляд, может показаться, что преимущество у expressions, так как ноды представляют собой «черный ящик», алгоритм работы которого изменить невозможно, а формула, по которой работают expressions, легко редактируется. Однако все не так просто.

Обрисую, по возможности, хотя бы «на пальцах», ограничения и преимущества обоих участников противостояния.

Главное преимущество expressions в том, что они могут быть практически мгновенно созданы заново или отредактированы. Алгоритм их работы прозрачен и задается формулой на языке MEL, которую можно копировать или менять. Но вот на этом преимущества expressions заканчиваются. Дальше начинаются ограничения...

Во-первых, совершенно непонятно, как должны выглядеть expressions, создающие, например, процедурные примитивы типа polySphere. Как написать формулу на MEL, которая берет на входе радиус и количество граней, а на выходе выдает полигональную геометрию, остается только догадываться. Можно, конечно, вычислить на основе этих данных координаты всех вершин для сферы и дальше, через команду polyCreateFacet, пересоздавать всю поверхность, однако делать это надо будет в каждом кадре или при изменении любого входа (ну, хотя бы радиуса сферы), боюсь, это, возможно, даже будет работать. Но, как уже догадались читатели, работать чудовищно медленно. Отсюда вытекает основное ограничение expressions низкая производительность.

Во-вторых, поскольку ехрressions пишут на языке МЕL который является интерпретируемым), выполняются они медленно. Конечно, «медленно» - понятие условное, так что вычисление положения сферы между двумя кубиками займет время, которое вы едва ли сможете заметить на экране, визуально. Однако когда это касается не одной, а сотен или тысяч вычислительных операций в каждом кадре, производительность expressions становится ощутимо недостаточной (в главе, посвященной MEL, есть пример попытки создать деформер, и там обозначены границы применения MELc точки зрения производительности).

Ноды написаны на языке С++ и откомпилированы для каждой операционной системы.

131

Скорость вычисления данных внутри них (то есть производительность нод) в десятки, а то и в сотни раз быстрее, чем выполнение команд для expressions. Поэтому их главное преимуществ. - скорость, тогда как главное ограничение тот факт, что пользователь никак не может измени» алгоритм работы конкретной ноды. Точнее, может... Но для этого надо изучить язык С++ запрограммировать на нем новую формулу, скомпилировать ее под имеющуюся операционную систему и затем подключить к MAYA как плагин...

Области применения expressions и нод можно приблизительно обрисовать так.

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

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

Конечно, можно нарушать эти «обывательские» правила и вместо expressions собирать нужную формулу при помощи соответствующих нод.

Откройте, например, файл noExpressionStart.ma.

В нем вместо expressions используется нода plusMinusAverage1, которая вычисляет среднее значение для двух входящих атрибутов (для этого атрибут operation для нее установлен в Average). Вы можете рассмотреть сцену подробнее в Hypergraph и убедиться, что она работает точно так же, как сцена expressionStart.ma, использующая expression.

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

nurbsSphere1.translateY=(pCube1.translateY*0.25*pCube2.translateY*0.75)

Надо думать, что в случае использования нод вам придется туго (посмотрите результат в файле noExpressionMulti.ma).

132

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

Например, создайте цилиндр.

Потом откройте Hypershade и создайте ноду samplerlnfo: Create=>General Utilities=>Sampler info. В сцене появится новый объект samplerlnfo1, отвечающий за доступ к информации об объектах непосредственно в процессе рендеринга. Обычно его соединяют с другими утилитами для анализа «вычисления цвета или других свойств в каждой точке поверхности.

Но вы можете открыть Expression Editor и просто создать expression типа:

if(samplerlnfo1.pointWorldY>0)lambert1.diffuse=

noiselsamplerlnfo1.pointWorldY*10)+1;

Смысл его заключается в том, что все точки на поверхностях с материалом lambert1 будут окрашиваться в некий рисунок, если их вертикальная координата положительна. Иными словами, таким образом вы кладете, некую текстуру на канал diffuse, причем рисунок этой текстуры определяете по формуле в своем expression. (Пример сохранен в materialWithExpression.ma.)

Для взрослых. Отсутствие возможности скомпилировать текстуру или материал, определенный с помощью expression, всегда вызывало у меня чувство горечи идосады. Сейчас, когда на смену «родному» рендереру программы MAYA пришел великий men­ tal ray со своим языком описания шейдеров, эта горечь немного смягчилась. Однако идея использовать expression для написания материалов, согласитесь, неплохая.

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

133

Загадочный атрибут Node State. Состояние ноды. Блокировка действия некоторых нод. Обновление экрана и оптимизация интерактивной производительности

Если вы не очень любопытны, этот раздел можно и не читать, однако не исключено, что здоровое любопытство и желание «во всем дойти до самой сути» не дает вам спокойно спать, пока вы не узнаете, для чего же предназначен совершенно мистический атрибут Node State, встречающийся у каждой ноды и мозолящий глаза в каждой закладке Attribute Editor в разделе Node Behavior.

Раз мы договорились рассматривать любую ноду в MAYA как некоторый вычислитель, было бы логично иметь возможность временно выключать и включать этот вычислитель.

Например, вы смоделировали супер-телескоп с помощью некоторого количества операции 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: skinCluster1 (Skin Cluster Node): Blocked is not supported on deformers. Switching to Has No Effect.

А затем сама устанавливает Node State=HasNoEffect.

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

Однако чтобы вы все-таки почувствовали разницу, хотя бы интуитивно, откройте файл expressionStart.ma (или любой другой содержащий expression), выберите сферу и найдите закладку expression1 в 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

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

Особенно часто такие секреты используются при рендеринге и в частности при использовании mental ray.

Выберите mental ray в качестве основного рендерера.

Разыщите в Outliner и выделите ноду mentalrayGlobals, а затем добавить к ней четыре динамических атрибута:

regionRectX=0, regionRectY=0, regionRectWidth=300, regionRectHeight=300.

Посмотрите теперь, что будет происходить при рендеринге сцены с помощью mental ray,

Закрепление одного объекта на поверхности другого

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

Как и положено в MAYA, способов решения такой задачи как минимум десять. Однако среди них нет ни одного, позволяющего выбрать два объекта, а затем выполнить пункт меню типа «Закрепить первый объект на поверхности второго, но быстро!». Например, Geometry Соn straint делает не совсем то, что нужно. Приконстрейненный объект будет свободно скользить по

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

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