Expressions maya что это
Expression Editor
Configuration
The text gets larger or smaller as you scroll.
Menus
The items in this menu control how you select expressions to edit. You can list all the expressions in the scene by name, objects and their attributes, or all the script nodes in the scene.
The items in this menu let you insert the names of useful MEL functions into the expression edit box.
Creating Expression
Selection lists
The Expression Editor displays a Selection list by default. This list displays either a list of objects and attributes, or a list of expressions you’ve created.
For a particle shape node, you don’t need to select an attribute from the Attributes list. You can create only one creation expression and two runtime expressions (before and after dynamics calculations) per particle shape node. The same expression appears for each attribute.
When you create a new expression, you can click an object from this list to select the default object to which the expression applies.
Expressions list
The Expressions list shows all expressions you’ve created in the scene. When searching for an expression to edit, click an expression from this list to display and edit its contents.
Hide the Selection list
You can hide the Selection list to lessen clutter in the window. To do so, click the triangle next to Selection (see previous figure).
Filter attributes from the Selection list
If a selected object has several attributes controlled by expressions but you’re not sure which attributes, you can select a filter to list only attributes controlled by an expression.
To filter attributes from the Attributes list
Only the object’s attributes controlled by expressions appear in the Attributes list.
Создание автоматной очереди: MEL, Maya Expressions
Решил написать про MEL и Maya Expressions, на примере создания стрельбы из автомата. Т.е. напишу про то, как автоматизировать создание автоматных очередей. Про один из вариантов решения задачи.
Сразу уточню, что я пишу урок про MEL, а не про то, как смоделировать автомат.
Создайте модель вспышки. Это может быть всё, что хотите: плоскость, флюид, пейнт эффект. Я решил не усложнять и использовать простые плоскости, на которых можно разместить текстуры с огнём. Размещаем её на место, где она должна быть, и замораживаем её координаты (Freeze Transformations).
Теперь нужно заставить её смахивать на выстрелы. Для этого открываем Expression editor. И выбираем создание экспрешена по имени:
Так нам будет удобно ориентироваться в экспрешенах автомата (они все будут находиться в одном месте).
Огонь мерцает сам. Но делает он это когда захочет. Нужно заставить его мерцать только когда нужно нам. Для этого потребуется новый атрибут, который можно будет анимировать. Выбираем модель автомата и создаём для него новый атрибут:
Теперь назовём его shoot и выберем тип Boolean. Т.е. переменная может иметь значения True или False, 1 или 0. Для определения стрельбы нашего автомата.
Назначаем на наш новый атрибут ключи (для промежутков стрельбы). И меняем экспрешен, умножая фунцию rand на новый атрибут shoot:
Теперь атрибут gun.shoot включает и выключает мерцание (для того чтобы чётко это увидеть, нужно не забыть включить проигрывание всех кадров в режиме реального времени). Далее немного усложняем экспрешен огня (добавляя различные трансформации). Так же можно добавить появление трассеров (тем же самым образом). И можно связать интенсивность света от вспышки.
Но это самый простой пример, который можно придумать.
Например, вы можете связать с этим атрибутом (.shoot) появление дыма (партиклы) из ствола. Ну много чего вы можете натворить с этим атрибутом 🙂 Можно добиться очень реалистичных результатов. Экспериментируйте!
И вот автомат уже подаёт признаки жизни. И управляется стрельба всего одним атрибутом. Но чего-то не хватает 🙂 А не хватает сыплющихся гильз. А гильз нам нужно очень много и чтобы они сыпались как надо в кучку, ударяясь друг об друга, катаясь по земле. И вообще были похожи на настоящие гильзы. Вот тут-то и придётся подключить MEL. Вам не нужно писать сложные физические уравнения. Их уже написали за вас. И называются они Maya Dynamic. Но этот чудо плагин не позволяет нам получить того, что мы хотим стандартными инструментами. Нужно писать собственные.
Я надеюсь, что вы знакомы с встроенным плагином Maya Dynamic. Интерфейс у него довольно удобен и понятен. Но в сложных сценах возможны тормоза, сбои, всё вплоть до вылетов. Так, что при создании скрипта, нужно не забыть про оптимизацию. А так же про «запекание» (bake keys).
Для начала нам нужно получить одну единственную падающую гильзу. Для которой мы напишем сценарий размножения. А потом для сценария напишем интерфейс, для последующего использования.
Создаём гильзу и отключаем её из просчёта (коллизии и активность)
(для того чтобы увидеть траекторию полёта, нужно включить активность гильзы, коллизии, игнор)
// объявляем переменные. int – целые, float – дробные, string – строковые (текст)
// так же есть vector, boolean (true или false)
// выключаем просчёт динамики, убирая галку state
setAttr rigidSolver.state 0;
// запоминаем имя нашей исходной гильзы
while ($t Rand initialSpinXYZ:»;
Есть ещё два момента, которые нужно учесть. Это то, что начальная скорость задаётся в глобальных координатах, а значит она статична. Т.е. гильзы будут лететь всегда в одном направлении. Это совсем несложно поправить, путём связывания значений начальной скорости с расстояниями от двух локаторов, которые указывают направление поворота начального объекта (эмиттера). И то когда эмиттер имеет констрейн, то его (констрейн) нужно вытащить из группы эмиттера, чтобы не захламлять сцену (он тоже будет дублироваться).
Если при работе со сценарием майя начинает ругаться, то решение проблемы вы найдёте в Script editor (почти всегда). Не забывайте ещё то, что динамика корректно работает только при проигрывании всех кадров (а не в реальном времени).
При крупном плане (падения гильз) эта методика запекания не годится. Лучше увеличить «время жизни» и запечь стандартными средствами.
Так же при написании сценария удобно выделять часть текста и нажимать ctrl+enter для проигрывания выделенного куска и это не затирает то, что вы написали ранее. Пользуйтесь хелпом, он на самом деле очень удобен. И имеет ответы на многие вопросы. Существуют великолепные редакторы текста с подсветкой операторов и подключаемыми синтаксисами (включая MEL). Мне лично очень нравится textpad. Многие рекомендуют писать сценарий в стороннем редакторе. Потому, что есть шанс потерять свой скрипт (майя также может рухнуть или свет вырубится 🙂 ). Размер шрифта в редакторах майя можно регулировать, зажав ctrl и колёсиком мыши (так обстоят дела не только в майя).
Иногда случается крупный план, и качества даже очень сложных уравнений явно не хватает. Чаще всего в таких случаях самый лучший выход – это не полениться и сделать всё руками. Но так же ещё можно преобразовать экспрешен в ключи и поправить там, где нужно. А ещё есть Trax Editor, но это уже другая история 😉
Приложение
Мало я написал про замечательную вещь Expressions. Подумал, что надо исправить это.
Опять на примере стрельбы 🙂 Но этот раз четырёх стволов, с дульным тормозом (не знаю как это точно называется). Так же это можно применить к ходу затвора.
y=Sin(x):
Значения Y меньше нуля нам не нужны.
y=Sin(x)>0:
Уже что-то в этом есть 🙂 Но нам нужны большие промежутки между скачками. А нужна нам для этого функция, которая будет обнулять график в нужный момент.
Sin(x)>0:
На графике видно, что Y может применять два значения: ноль и бесконечность. Так или так, да и нет, true и false. Т.е. это получится график Boolean и в майя будет принимать значения нуля и единицы.
Sin(x)>0;
Sin(2x)=y>0;
Два уравнения и график «поредел».
Но в майя всё куда проще и гибче. Такой график можно получить тысячами способов. И даже не обязательно помнить какие-то формулы из школы. Но операции с известными функциями, как правило короче.
Нужно построить зависимость от времени, т.е. Y=Sin(time), где Y – любой атрибут. Так же можно использовать переменные. Но помните, что большинство операторов из MEL не будут работать интерактивно.
Пишем expression подёргивания:
//объявляем переменную времени, умножая её на 10 (ускоряя)
// объявляем переменную «обнуления» графика
// назначаем ей в два раза большие промежутки между «выстрелом», для удлинения промежутков стрельбы
Стволы стреляют по очереди. Теперь их можно сгруппировать или сделать дочерними к локатору или остальной части ствола. Появление дыма и других явлений вы так же можете получить, используя атрибут смещения. Но про наложение остальных эффектов можно рассказывать бесконечно. Важно понять принцип и у вас не возникнет проблем с их реализацией.
Так же могу посоветовать раздобыть программки для отрисовки графиков. Мне лично нравится GrafEq. Очень удобно просматривать действия тех или иных функций, а так же тестировать и совершенствовать свои. Это может пригодиться не только в написании экспрешеннов, но и при написании своих шейдеров (на RSL их писать не очень трудно и интересно) Например, всем до боли известный checker:
Sin(u)*Sin(v)>0
Полностью раскрыть тему про MEL и Expressions, думаю, невозможно. И я не пытался. В интернете мало статей с аргументированием логики скрипта. А именно разбором готового несложного решения проще всего овладеть начальными знаниями (книги так же очень желательно прочесть). Не думайте, что кто-то уже решил все проблемы за вас. Более вероятно, что вы сами найдёте наиболее комфортное решение своей задачи, нужное вам в какой-то конкретной ситуации. Ведь написать абсолютно универсальное GUI (интерфейс программы) нереально.
Не хочу сказать, что данный материал является истиной последней инстанции, но я надеюсь, что он поможет новичку овладеть MEL. А знание MEL даже на невысоком уровне очень помогает в работе.
Надеюсь, что вам было интересно 🙂
Всем спасибо. С удовольствием отвечу на вопросы.
Animation expressions
Expressions are instructions you give Maya to control attributes over time. An attribute is a characteristic of an object, for instance, X scale, Y translate, visibility, and so on.
Though you can create an expression to animate attributes for any purpose, they’re ideal for attributes that change incrementally, randomly, or rhythmically over time.
Expressions are also useful for linking attributes between different objects—where a change in one attribute alters the behavior of the other. For instance, you can make the rotation of a tire dependent on the forward or backward movement of a car.
Expressions offer an alternative to difficult keyframing tasks. In keyframing, you set the values of attributes at selected keyframes in the animation, and Maya interpolates the action between the keyframes. With expressions, you write a formula, then Maya performs the action as the animation plays.
Expressions are often as simple as a few words or lines. In the following example expressions, note the variation in length and detail (rather than their purpose).
Example
Example
You can use an expression to animate any keyable, unlocked object attribute for any frame range. You can also use an expression to control per particle or per object attributes. Per particle attributes control each particle of a particle object individually. Per object attributes control all particles of a particle object collectively.
Управление улыбкой с Expressions
Мы с вами разобрались, как делать контроллеры, которые работают с двумя осями движения, например, контроллер Sneer и контроллер Grrr. И мы можем сделать контроллер для улыбки и грустного лица. Все что нам нужно сделать, это просто проделать то же самое, что и для этих двух контроллеров и скомбинировать их в один. У нас есть вот этот контроллер, и мы хотим, чтобы здесь, в левом верхнем углу, у нас была левая ухмылка.
Правая ухмылка в правом углу. А также чтобы уголок рта опускался справа или слева. Мы можем использовать те методы, которые мы использовали для предыдущих двух контроллеров Sneer и Grrr, просто скомбинировав их в один переключатель. Нужно будет применить одну хитрость, которая нам поможет, я научу вас ее делать. И первое, что нам нужно сделать, это убедиться, что у нас выбран контроллер Smile/Frown.
И перейду в Animation Editor > Blend shape. И давайте просто создадим выражение. Создадим одно, например для SmileRight, Create new expression. И выражение, которое мы сейчас будем делать для Smile_Left, будет таким же, какое мы делали для Sneer_Left. Это одно и то же. Я буду использовать параметры из Blend Shape, я скопирую и вставлю это выражение.
И затем мы умножали все на значение по Y, чтобы управлять степенью эффекта. Но мы сейчас работаем не со Sneer, мы работаем со Smile_Left, поэтому давайте откорректируем тут. Итак, blendShape1.M, это изменим на SmileL, знак «равно», тут должно быть не Sneer, это у нас Smile_frown, поэтому изменим на Smile_frown. Контроллер Smile_frown TranslateY «равно» 1 «плюс» контроллер Smile_frown TranslateX, и делим все пополам.
То же самое выражение, что и для контроллера Sneer, мы просто поменяли имена. Давайте свернем эти окна и посмотрим, что получилось. Если я поднимаю контроллер вверх, да, все работает. Переходим к значению 0, но давайте я покажу вам, какая у нас возникает проблема.
До нуля все работает хорошо, но когда Translate Y принимает значение ниже нуля, наша улыбка инвертируется. Это потому, что для этого контроллера у нас есть здесь отрицательное значение, в отличие от предыдущего контроллера, он останавливается на 0. Это происходит, поскольку наша Blend shape здесь идет ниже значения 1. Когда я перемещаю Y вверх и вниз, то вот этот переключатель работает нормально до 0, а после 0 улыбка принимает неправильную форму.
Нам нужно исправить это. Мы должны ограничить значение до 0. Мы можем использовать кое-какие полезные опции при составлении выражений. Сейчас в Мауа очень много функций, которые можно использовать для составления выражений, но я уже заранее выбрал нужные для нас, можно их сразу использовать. Нам нужно немного дополнить вот эту часть, где Smile_frown со значением Y.
Если значение Translate Y больше 0, мы будем использовать его. Если значение ниже 0, то мы будем использовать 0. Давайте проверим, чтобы наш синтаксис был правильно составлен. Max, скобочка открывается, 0, наше значение Smile_frown.Translate Y, скобочка закрывается, и дальше остается то же самое. Нажмем Edit, и мы ничего не увидим, когда бегунок опущен вниз.
И вместо Smile_Left я напишу Smile_right. Посмотрим, что получилось. Вот мои улыбки правым и левым уголком губ, и если я перейду в ноль, они обе пропадают. Следующее, что я буду делать, это то же самое, но с опущенными уголками губ. Давайте вернемся к окну Expression, вот наши Frown_Right и Frown_Left. Это будет немного похоже на контроллеры Grrr, правый и левый. Я выберу Grr_L. И здесь единственное отличие в том, что здесь у нас стоит минус в начале.
Это потому, что по Y наши губы идут вниз, а нам нужно перевернуть их направление на положительно с помощью умножения. Здесь это делается очень просто. Теперь, когда мы это поняли, перейдем в Smile_Left. Скопируем это выражение и вставим во Frown_Left. Еще раз, это готовое выражение, но нам нужно сделать так, что бы менялось значение по Y, поскольку по Y у нас должно быть отрицательное значение, вместо положительного.
Я нажимаю Create. Давайте посмотрим. Похоже, получилось. Теперь мы меняем приподнятый правый уголок на опущенный уголок. Можно сделать то же самое для левого уголка. Я перехожу сюда, выбираю Create New Expression для правого уголка. Frown_Left и Frown_Right будут почти одинаковыми, нужно будет только поменять знак. Я скопирую это выражение. Перехожу к Frown_Right, и нажимаю вставить.
Frown_Right эквивалентно этому, это наш переключатель, тут все верно. А это мой контроллер влево-вправо, помните, что влево-вправо сейчас отражено в обратном направлении, поэтому я поменяю этот знак с отрицательного на положительный, и это должно сработать. Нажимаю Create, и вот у нас есть улыбка сюда, улыбка сюда, и опущенные уголки рта сюда и сюда.
У нас получился отличный контроллер. Я очень надеюсь, что вы поняли, как это работает. Теперь можно сделать контроллеры для остальных деталей. Например, можно управлять бровями, используя этот метод. Я оставлю вам настройку бровей в качестве самостоятельной работы. Я тоже сделаю это самостоятельно. И мы продолжим на следующем занятии, подправим кое-что и сделаем контроллер для речи персонажа.
Управление веками персонажа с Expressions
Здесь нам нужно найти E_Uplid. Да, это то, для чего нам нужен контроллер. И нам нужно соединить этот бегунок с этим контроллером. Это можно сделать в Expression editor. Давайте перейдем в Window > Animation Editor > Expression Editor. Здесь у нас много разных опций.
Нам нужно, чтобы эти два параметра имели эквивалентные значения. Все просто, я выберу этот параметр, Blend shape1_E_Uplid_L. И соединю его с этим Lid_top_L.Translate Y. Первое, что мне нужно сделать, это выбрать этот контроллер, выделить его имя, и чтобы не вводить имя, я просто скопирую это. И сейчас нужно просто нажать на клавиатуре комбинацию Ctrl+C, если вы с PC, а если у вас Mac, то Command+C.
Теперь я перейду к этому параметру. Итак, мне нужно опять пролистать вниз и найти E_UpLidL. Давайте соединим это и это. Я перехожу сюда, к выражению, и вставляю, нажав Ctrl+V или Command+V на Mac. И вот мы вставили Lid_top_L.Translate Y. То же самое что и тут.
Теперь мне нужно также выбрать вот это имя, нажимаем Ctrl+C и вставить сюда же через символ «=». И что же я сделал? Я соединил вот этот параметр с этим, сделал их эквивалентными друг с другом. Если я нажму Create, видите, как эта запись подсветилась сиреневым. Тут что-то произошло. И теперь я соединил веко с контроллером.
Если я опускаю контроллер на «1 минус 0.2» и получаю 1.2. И если я введу сюда 0, здесь будет 1. Если введу 1, здесь будет 0. Чудеса математики! Вот так мы можем управлять веком, используя выражения. Можно использовать этот же способ и для второго века. Помните, что в случае с нижними веками, при неправильном направлении, нужно будет ввести «1+», а не «1-«.
Теперь вы поняли основы применения выражений. И на следующих уроках мы сделаем кое-что более сложное с помощью Expressions.