Ponimayka1 - Стор 62

Expression Editor

Існує ще безліч прикладів використання 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. Звичайно в разі помилки, доведеться набирати все наново, проте задоволення спостерігати, як після введення «=» раптово роз'їжджається числове поле атрибуту, варте того.

Основні правила синтаксису для написання скриптів і expressions викладені у розділі, присвяченій Тут лише сформулюю найпростіші принципи складання expressions, дозволяють писати досить ефективні формули.

Перш за все, потрібно пам'ятати, що повне ім'я атрибута складається з імені об'єкта, з'єднаного точкою з ім'ям атрибута. Наприклад:

Реєстр букв виключно важливий. pTorus1 та PTorus1 - це різні об'єкти, а атрибуту rotatex Maya за умовчанням не знає (ви можете зробити його самі).

Для лінивих користувачів були додатково вигадані короткі імена атрибутів, щоб заощадити сили при наборі формул на MEL. pTorus1.rotateX і pTorus1.rx - це той самий атрибут. Коротких імен для об'єктів, як не прикро, не може бути в принципі.

Порада. Подивіться короткі імена атрибутів можна в Channel Box. Для цього в контекстному меню достатньо вибрати Channel Names = & gt; Short.

Також я раджу раз і назавжди включити відображення довгих (Long) імен атрибутів у Channel Box. З незрозумілої причини, за замовчуванням включений режим відображення «красивих» (Nice) імен, і це явно дезінформує користувача щодо правильного написання назв атрибутів. У цьому режимі в іменах атрибутів з'являються прогалини і всі починаються з великої літери, що не відповідає істині.

Знаючи імена атрибутів,ви можете складати, віднімати, перемножувати та ділити значення цих атрибутів за допомогою загальноприйнятих знаків. Використання дужок та найбільш уживаних функцій типу rand, noise, sin та cos не повинно викликати у вас труднощів. Нижченаведені приклади повинні розвіяти страх перед написанням нескладних формул.

Єдине, про що варто пам'ятати завжди, це те, що наприкінці кожного рядка (а точніше наприкінці кожного необхідно ставити крапку з комою).

pCube1.tx=(pTorus1.tx+ pTorus2.tx)/2; pCube1.tz=(pTorus1.tz+ pTorus2.tz)/2;

Якщо в одному рядку не міститься вся команда, можна без проблем перенести її на інший рядок.

Слід лише пам'ятати: точка з комою відокремлює одну команду від іншої.

З приводу роботи зі змінними ви можете докладніше прочитати в розділі про MEL, тут я лише зазначу, що результати будь-яких обчислень (зазвичай проміжних) можуть зберігатися в змінних, імена яких починаються зі знаку $.

$rot = pCube1.ry/180*3.14; pCube2.ry = sin($rot);

Крім того, спеціально для використання в expressions є дві спеціальні змінні для роботи з часом. Вони називаються time та frame та позначають поточний час

у секундах та у кадрах, відповідно.

У цьому розділі нам ще знадобляться умовні оператори, але їхнє використання я проілюструю на конкретних прикладах.

Перш ніж перейти до практичних прикладів використання expressions, я трохи зупинюся на різниці між expressions та скриптами, про які всі, без сумніву, чули. І ті й інші пишуться мовою MEL, але служать дещо різним цілям.

Різниця між скриптами та expressions. Порядок виконання expressions

Травневий скрипт - це набір команд на мові MEL, який виконується на вашу вимогу, тобто коли висамі його запустіть. Зберігається він, як правило, на диску у вигляді текстового файлу і не є частиною сцени.

Expression – це також набір команд. Але ці команди зберігаються як об'єкта і є частиною сцени, тобто зберігаються всередині неї. Ці команди виконуються не за вашим бажанням, а, взагалі кажучи, при зміні номера кадру при анімації. Щоразу, коли відбувається перехід до наступного кадру (або коли ви в черговий раз незграбно тицьнули мишкою в TimeLine), виконуються всі незаблоковані expressions, що є у сцені. Також виконання expressions відбувається в тому випадку, коли один з об'єктів, атрибути яких використовуються в expression, змінює значення цих атрибутів.

Таким чином, якщо ви програли двісті кадрів анімації, всі expressions, створені

ponimayka1

у сцені, виконаються по двісті разів. Тому expressions використовуються, зазвичай, задля інтенсивних розрахунків і обчислень, а завдання логічних зв'язків між об'єктами (точніше кажучи, між атрибутами об'єктів).

Приклади використання expressions. Годинник

Розберемо приклад використання expressions для «явної» анімації, тобто встановлення прямої залежності між атрибутом об'єкта і часом.

Виконайте в новій сцені стрілку годинника.

Розташуйте її так, щоб центр обертання знаходився на початку координат і обертання стрілки відбувалося навколо осі Z.

Назвіть стрілку sec, тому що вона відлічуватиме секунди. Якщо це занадто складно чи нудно, відкрийте файл clock.ma.

Виділіть у Channel Box атрибут rotateZ і в контекстному меню виконайте пункт Expres sions. У вікні Expression Editor, що з'явилося, введіть просту формулу

Натисніть кнопку Create.

стор

Змінний час містить час у секундах для поточного кадру.Відповідно, через одну секунду після початку анімації (тобто в двадцять п'ятому кадрі), значення time дорівнюватиме одиниці. За одну секунду секундна стрілка повинна повернутись на шість градусів (360 градусів розділити на 60 секунд дорівнює 6). Тому, щоб задати значення атрибуту rotateZ у градусах, ми помножили час у секундах на 6.

Примітка. У разі ім'я об'єкта можна було писати перед ім'ям атрибута. Про це я скажу трохи згодом.

Очевидно, щоб стрілка поверталася в інший бік, слід додати знак мінус. Крім того, поставимо "дискретне" обертання стрілки, щоб вона стрибком поверталася в нове положення тільки в тих кадрах, де значення часу дорівнює "цілим" секундам. Очевидно для цього потрібно взяти цілу частину числа, що містить час у секундах, тобто цілу частину змінної time.

Якщо ви закрили Expression Editor, дістаньтеся до нього знову, виділивши rotateZ в Channel Box і викликавши пункт Expressions.

Виправте формулу так: sec.rotateZ =

Натисніть Edit.

Тепер стрілка обертається щомиті ривками.

Встановіть діапазон анімації в 90 ТОВ кадрів - адже якщо 3600 секунд (тобто 1 година) помножити на 25 кадрів, це якраз 90 000 кадрів.

В установках анімації задайте Playback fps), щоб спостерігати реальний час на екрані.

Поверніться в нульовий кадр і скопіюйте об'єкт sec, таким чином виготовивши хвилинну стрілку. Назвіть її mtn та трохи підредагуйте її позицію та форму.

Editor

Хвилинна стрілка повинна обертатися в 60 разів повільніше за секундну. Тому expression для обертання буде зухвало простий.

Виділіть у Channel Box атрибут rotateZ і викличте Expression Editor. Введіть формулу:

min.rz=sec.rz/60; Натисніть Create.

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

Назвіть її hour.

Вона повинна обертатися в дванадцять разів повільніше за хвилинну, тому expression для неї виглядатиме наступним чином:

Тепер ви маєте процедурно анімований годинник. Швидкість обертання відповідає тепер реальному перебігу світового часу. Однак для створення нереалістичних ефектів хотілося б мати атрибут, який керує швидкістю обертання стрілок. Якщо головною у нас є секундна стрілка, додамо атрибут до неї.

Виберіть об'єкт sec і натисніть Modify=>Add Attribute.

Назвіть новий атрибут speed, вкажіть Maximum=10, Default=1. Натисніть кнопку ОК.

Тепер знову виділіть атрибут rotateZ у Channel Box і відкрийте Expression Editor. Виправте формулу для секундної стрілки:

стор

Запустіть анімацію та спробуйте міняти атрибут speed.

Таким чином, ви отримали контроль над швидкістю ходу годинника.

Для того, щоб зупиняти годинник або, навпаки, змушувати їх обертатися з шаленою швидкістю, ви можете ставити ключі на атрибут speed секундної стрілки.

Для того, щоб отримати збожеволілий годинник і залишитися в рамках процедурного підходу, виділіть атрибут speed в Channel Box, викличте Expression Editor і введіть формулу:

Це змусить змінюватися швидкість обертання безладно в діапазоні від 10 до мінус 10. Якщо ви захочете уповільнити (або прискорити) швидкість таких змін, введіть додатковий коефіцієнт у формулу:

Приручення Expression Editor

Деякі з вас, напевно, вже зіткнулися з деякими «нетактовностями» в поведінці Expression Editor. Якщо ви, друкуючи свою магічну формулу, раптом вирішилисекундочку вибрати інший об'єкт, щоб, наприклад, перевірити значення його атрибутів, усі ваші «друкарські праці» відразу зникнуть! Щоб зберегти свої нерви, надрукований текст, а заразом закликати до порядку Expression Editor, слід знати про два режими роботи з ним.

За промовчанням увімкнено перший режим, коли Expression Editor відображає expres sions лише для вибраного об'єкта. Тому при випадковому натисканні миші у вікні камери весь введений текст пропадає.

Другий, більш гуманний (на мій погляд) режим відображає у вікні Expression Editor всі наявні в поточній сцені expressions.

Ці режими перемикаються в меню Expression Editor за допомогою пунктів Select Filter=>By Object Name та Select Filter=>By Expression Name, відповідно.

Два цих режими відображають два ідеологічні підходи до expressions. Перший розглядає expressions як наприклад анімаційні криві, які жорстко закріплені за певними атрибутами і розглядаються тільки разом з об'єктом. У цьому режимі, щоб побачити код потрібного expression, недостатньо вибрати об'єкт: потрібно додатково у вікні Expression Edi tor вибрати атрибут об'єкта, який цей expression впливає. У цьому режимі дуже корисно обмежити відображення у Expression Editor тільки тих атрибутів, для яких вже створено expres sions. Це можна зробити в меню Expression Editor, вибравши Attribute Filter=>Connected to Expressions. Зауважте також, що у меню Object Filter також існують різні варіанти, які «фільтрують» відображення у списку Objects об'єктів тих чи інших типів.

Тут, мабуть, варто уточнити, що означає «expression впливає атрибут». Неформально висловлюючись, у разі expression «висить» на атрибуті. Формально кажучи, у дереві залежностей атрибут має вхіднузв'язок, що надходить до нього від expression. А з точки зору написання формул це означає, що в коді expression зустрічається вираз типу "object.attr=.", в якому ім'я атрибута стоїть в лівій частині оператора присвоєння. Як ви розумієте, в одному виразі може зустрічатися кілька таких виразів для різних атрибутів. Усі вони створюють зв'язок одного expression з цими атрибутами.

Другий режим ідеологічно передбачає, що ви розглядаєте expressions як самостійні об'єкти сцени, які виконують певні дії. У цьому режимі ви можете бачити у верхній частині вікна Expression Editor список всіх expressions, що вже є в поточній сцені (включаючи призначені для часток). Ви можете не боятися, що код expres sion пропаде при випадковому виборі об'єкта і спокійно редагувати будь-який expression просто вибираючи його зі списку. Не забувайте при цьому натискати кнопку Edit: вона зберігає результати вашого редагування, і її дія аналогічна до традиційної операції Save. Кнопка Reload повертає вас до останнього збереженого варіанта коду. Пам'ятайте, що після того, як ви змінили код expression, ваша сцена змінилася, і її потрібно буде зберегти для збереження нового варіанта expression.

Особисто мені ближчий другий режим роботи: як колишній програміст, я оперую з expres sions як із самостійними, а не з допоміжними об'єктами. Однак з точки зору загальної ідеології MAYA, можливо, послідовнішим буде використання першого режиму.