Уроки: Adobe After Effects

Эксперименты с выражениями в Adobe After Effects 6.0

Скачать файлы урока (98 kb)

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

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

Но обо всем по порядку.

 

Новый синтаксис

На мой взгляд, синтаксис стал гораздо более удобным и логичным.

Все объекты, методы и свойства, состоящие из нескольких слов теперь не нужно разделять при помощи разделителя "_" (например, audio_levels). Теперь это все представлено в "interCaps" формате. Например, audio_levels, теперь выглядит так - audioLevels.

Вместо кавычек типа " теперь можно использовать и одинарные.

Старый синтаксис по заявлению разработчиков тоже будет работать, но предпочтительнее использовать новый.

Улучшеннный wiggle()

Теперь можно настроить колебания wiggle() при помощи seedRandom(). Дело в том, что seedRandom() меняет значения, получаемые с помощью wiggle(), даже при одинаковых настройках последнего. Изменяя seedRandom(), при неизменном wiggle(), мы каждый раз будем получать совершенно различные значения. Посмотрите на следующие выражения:

seedRandom(13);

wiggle(3,35)

и

wiggle(3,35)

Хотя, в обоих случаях wiggle() постоянный, но значения выражения будут совершенно разными, благодаря seedRandom().

Однако, учтите, что wiggle() игнорирует параметр timeless seedRandom(seed, timeless=false). Он равен false по умолчанию.

Если вы хотите удерживать постоянное значение wiggle() на определенное количество кадров, то вы можете воспользоваться новой полезной функцией posterizeTime().

posterizeTime()

Аппарат выражений в AE 6.0 получил новую функцию posterizeTime(). С ее помощью вы можете управлять скоростью анимации. Например, значение wiggle() будет меняться пять раз в секунду в следующем выражении:

posterizeTime(5);

wiggle(5,35)

 

Конвертирование аудио в ключевые кадры

Это довольно интересный новый ассистент ключевых кадров («Convert Audio to Keyframes»). Он создает нулевой объект, называемый по умолчанию Audio Amplitude. Этот слой содержит три анимированных эффекта slider. Первый из них отображает в ключевых кадрах изменения громкости в левом канале, второй в правом, а третий в обоих каналах сразу. Вы можете теперь извлечь значения из этих эффектов с помощью выражений и применить к какому-то свойству. То есть сделать то, что раньше делалось в motion math с помощью скрипта layeraud. И соответственно изменению уровней громкости будут меняться свойства, которые извлекают значения из sliderов.

В примере, изображенном на иллюстрации, мы используем Convert Audio to Keyframes для того, что бы слой medium cyan изменял размеры в зависимости от уровня в правом канале, а слой medium yellow в зависимости от уровня в левом канале. Выражения простейшие…

 

Да кстати, если вы не находите motion math там, где привыкли его видеть в АЕ5.5Keyframe Assistant), то не пугайтесь. Где-то в help по скриптам в АЕ6.0, я прочитал, что по умолчанию motion math в шестой версии не устанавливается (учитесь, дескать, господа сами скрипты писать). Но, установка его в AE не представляет никаких проблем. Для этого просто перенесите файл MotionMath.AEX из папки After Effects 6.0'Support Files'Plug-ins'Professional'Keyframe Assistant'(MotionMath) на уровень выше, то есть в After Effects 6.0'Support Files'Plug-ins'Professional'Keyframe Assistant. Ну и заодно файлы языковой поддержки, если хотите использовать поддержку немецкого, французского или японского языков.

 

Текст

Все, кто попробовал новую версию AE, первым делом отмечали появление инструмента text. Наконец-то, говорили они, adobe пошевелился и внял многочисленным просьбам пользователей и создал хороший текстовый инструмент. Хотя, на днях я полазил по конференциям посвященным АЕ, и в общем то не все так гладко с этим инструментом, как выяснилось. Замечу, что лично, меня не одна из перечисленных там проблем не коснулась.

Инструмент text имеет достаточно большое количество настроек, и преимущества в удобстве работы по сравнению с text effect (который остался в наборе и бросать его окончательно, видимо, не стоит).

С помощью выражений и этого нового инструмента мы можем добиться весьма и весьма интересных эффектов.

Для начала создадим текстовый слой. Для этого мы можем пойти в меню layer>new>text (ctrl+alt+shift+t) или же просто щелкнуть инструментом «T» на нашей композиции. Обратите внимание, что вы можете создать как вертикальный, так и горизонтальный текст. Для этого кликните левой кнопкой мыши на «T» и подержите. Появиться выбор horizontal type tool или vertical type tool. Выберите horizontal type tool. Введите любое слово. Абсолютно все равно, какое. Я написал «hello world».

Теперь добавим выражение для свойства source text (текстовый слой > группа свойств text > свойство source text).

Начнем изучение возможностей выражений для управления свойствами текста. По умолчанию в поле выражений у нас появилось text.sourceText. Это значит, что текст, который мы ввели, остается без изменений и ничего с ним не происходит. А теперь давайте введем в поле выражений position[0]. Теперь у меня, вместо «hello world», появилась цифра 124 (значение координаты X текстового слоя). Если вы анимируете текстовый слой, то будет меняться сам текст, отображая значение X координаты в момент времени.

А сейчас давайте поговорим о том, что представляет, из себя в Java Script текстовая строка и буквы в ней. Текстовая строка в Java Script является массивом, включающем в себя последовательность букв. Каждая буква имеет свой индекс. Пробел игнорируется (то есть в слове он присутствует, но индекса не имеет). Индексирование начинается с 0.

Давайте разберем это на примере.

Имеется следующее выражение:

s="Hellow world";

s[1]

Первой строкой мы вводим переменную s, которая равна "Hellow world". Она является, по сути своей массивом, из которого мы во второй строке извлекаем букву, имеющую индекс 1. Это буква «е». Она то и будет выведена на экран.

Java Script поддерживает сложение строк. Например, итого выражения "Hellow"+"World" будет вывод на экран HellowWorld.

JavaScript поддерживает большое количество строковых свойств и методов. Большей частью они, к сожалению, в АЕ не поддерживаются.

Я приведу здесь все найденные мною поддерживаемые свойства и методы, что бы вам, не пришлось копаться в книгах. Но вообще-то, учебничек по Java, я бы порекомендовал под рукой иметь… По причине того, что Adobe все расширяет поддержку скриптов в AE. Так что неизвестно, что версии нам новые готовят.

 

Строковые свойства и методы

Свойства
Length - отражает длину строки

Методы
Для начала посмотрите на строковые методы, которые я нашел в справочнике по JavaScript.

anchor , big, blink, bold, charAt, fixed, fontcolor, fontsize, indexOf , italics, lastIndexOf, link, small, strike, sub, substring, sup, toLowerCase, toUpperCase, fromCharCode

Я попробовал их все, но реально в АЕ работают следующие:

fromCharCode() – извлекает символ по индексу из шрифтового набора

toUpperCase() – переход в верхний регистр

toLowerCase() – переход в нижний регистр

Это связано с тем, что большинство методов предназначены для web. А в АЕ имеется лишь ядро и встроенные объекты, но никак не вся мощь Java для броузеров. Ошибку АЕ правда при их использовании не выдает, но ничего кроме надписи «использован метод такой-то» получить не удается.

 

А теперь примеры на свойства и методы.

Данное выражение извлекает длину строки и выводит ее на экран вместо нашего текста:

s = 'hellow world';

s.length

 

Следующее выражение извлекает символы из набора заданного для вашего текста шрифта:

String.fromCharCode(90) + String.fromCharCode(49) + String.fromCharCode(50)

 

Если вы используете символ "'r" в строке, как здесь "abcd'refgh", то ваша строка будет в этом месте закончена и начата новая:

abcd

efgh

А сейчас давайте создадим, что-то более сложное. Например, сетку из шестнадцатиричных символов размером 8*4 символа. Символы будут меняться(что-то типа эффекта Numbers). Для этого в поле ввода выражений впишем следующее:

 

numRows = 4;

numChars = 8;

holdFrames = 5;

seed = Math.floor(time/(holdFrames*thisComp.frameDuration));

seedRandom(seed,true);

s = "";

j = 0;

while(j < numRows){

k = 0;

while (k < numChars){

c = Math.floor(random(48,64));

if (c > 57) c += 7;

s += String.fromCharCode(c);

k += 1;

}

s += "'r";

j += 1;

}

s

 

Давайте разберем его.

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

 

Время разделять

Еще один строковый параметр split(). Разберем его на примере.

s = "honesty,integrity,loyalty,compassion,empathy";

s.split(",")[2]

Задана переменная s, равная текстовой строке "honesty, integrity, loyalty, compassion, empathy". Нам нужно извлечь слово loyalty. Для этого используем split().

s.split(",")[2] обозначает, что будет извлечено слово после второй запятой.

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

 

 

holdTime = 1.0; // время задержки

s = "honesty,integrity,loyalty,compassion,empathy"; // переменная с текстом

j = Math.floor(time/holdTime); // переменная, возвращающая ближайшее целое число,

'' меньшее или равное аргументу time/holdTime

s.split(",")[j] // будет отображать слово после точки номер, которой будет равен j

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

Давайте порисуем

Еще одно нововведение в АЕ6, сразу бросающееся в глаза – это более тесная интеграция инструмента рисования в программу.

Для рисования два раза щелкните левой кнопкой мыши на нужном вам слое и выберите инструмент рисования. Сделайте один завиток. Во теперь можно и выражение добавить.

Добавьте выражение на свойство stoke end.

freq = 0.5;

50*(1-Math.cos(freq*time*Math.PI*2))

Будет происходить достаточно интересная прорисовка.

Давайте усложним нашу сцену, добавим выражение для управления цветом кисти.

if (index <=4){

linear(index,1,4,[0,1,1,1],[1,0,1,1])

}else if (index <= 8){

linear(index,5,8,[1,0,1,1],[1,1,0,1])

}else{

linear(index,9,12,[1,1,0,1],[0,1,1,1])

}

А теперь добавьте на rotation свойства stroke:

(index-1)*30

Последним шагом дублируйте наш слой 11 раз и получите конечную анимацию.

 

Выражения и новый инструмент (эффект) Liquify

Этот новый эффект позволяет получать очень интересные и органичные имитации жидкости. Давайте, применим его на любом понравившемся вам изображении, и создадим какие-то искажения. Теперь применим на свойстве Distortion Persentage выражение

freq = 0,6; // переменная, определяющая частоту обновления свойство

(1-Math.cos(freq*time*Math.PI*2))*50 // определяет величину свойства по текущему времени

Работа с трэкером

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

Приведу пример, когда нужно сделать «рой» цветных точек кружащихся вокруг головы дельтапланериста.

У нас имеются следующие слои: видео с дельтапланеристом и слои с цветными точками. Будем трэкать точки к видео. Далее я опишу методику для одного слоя. Для остальных слоев все будет идентично.

Перед тем, как начать трэкинг-анализ примените выражение к параметру Attach Point точки трэкинга:

L= thisComp.layer("Comp 1");

masterPos = L.motionTracker("Tracker 1")("Track Point 1").attachPoint;

masterPos + wiggle(4,45) – position

 

Теперь трэкайте и получите «рой» точек вокруг дэльтапланериста.

 

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

58982 Автор:
Актуальность: 62
Качество: 62
Суммарный балл: 124
Голосов: 4 оценки

Отзывы посетителей:

аватар
 
Andy Makaronni 2 0
Хорошая вещь. posterizeTime() максимально быстро дал необходимый результат. спасибо
аватар
 
elflesnoy 2 0
Пригодилось. Спасибо.
Зарегистрируйтесь, чтобы добавить комментарий.
Эту страницу просмотрели: 306 уникальных посетителей