Анимация по маркерам без ключей в After Effects. Автоматизация прозрачности на выражениях +проект

Ссылки, описания, дополнительная информация для моих уроков на YouTube
Аватара пользователя

Автор темы
aeplug
Санта
Санта
Сообщения: 2802
Зарегистрирован: 18 мар 2016, 23:20
Откуда: С Ютуба
Благодарил (а): 18 раз
Поблагодарили: 274 раза
Контактная информация:

Анимация по маркерам без ключей в After Effects. Автоматизация прозрачности на выражениях +проект


Теги:

Сообщение #1 aeplug » 18 мар 2017, 13:34

Анимация-без-ключевых-кадров-по-маркерам.jpg
Анимация-без-ключевых-кадров-по-маркерам.jpg (36.59 КБ) 9796 просмотров
Анимация-без-ключевых-кадров-по-маркерам.jpg
Анимация-без-ключевых-кадров-по-маркерам.jpg (36.59 КБ) 9796 просмотров

Будем разбираться с выражениями в After Effects, создавая автоматическое появление (и исчезновение) слоя за счет прозрачности. Оказывается можно написать хитрое выражение, которое будет само в начале слоя поднимать его прозрачность от 0 до 100. А в конце - наоборот, сбавлять до нуля. Это выражение может работать с маркерами слоя для регулировки длительности эффекта появления/исчезновения или брать значения по умолчанию. Очень удобно сделать из всего этого пресет и использовать его для быстрой автоматической анимации без ключевых кадров.
https://www.youtube.com/watch?v=qqSNUaUmca8

Мое выражение после урока:

Код: Выделить всё

d1s = inPoint;
d2s = 0;
d2e = 100;
d3s = outPoint;
trans = 2;
if (marker.numKeys==2)
   {
   d3e = marker.key(2).time;
   d1e = marker.key(1).time;
   }
else
   {
   d3e = outPoint - trans;
   d1e = inPoint + trans;
   }
ease(time, d1s, d1e, d2s, d2e) - ease(time, d3s, d3e, d2s, d2e);

Чужое выражение, найденное в интернете давным давно:

Код: Выделить всё

transition = 20;       // transition time in frames
if (marker.numKeys<2){
tSecs = transition / ( 1 / thisComp.frameDuration); // convert to seconds
linear(time, inPoint, inPoint + tSecs, 0, 100) - linear(time, outPoint - tSecs, outPoint, 0, 100)
}else{
linear(time, inPoint, marker.key(1).time, 0, 100) - linear(time, marker.key(2).time, outPoint, 0, 100)
}

Краткое содержание урока


На стриме попросили рассказать про анимацию маркерами, да у меня и самого уже давно лежала найденная в недрах интернета заготовка, с которой я хотел разобраться. В основе такого метода лежат стандартные функции After Effects для интерполяции значений.
Функции для Interpolaton.jpg
Функции для Interpolaton.jpg (25.89 КБ) 9716 просмотров
Функции для Interpolaton.jpg
Функции для Interpolaton.jpg (25.89 КБ) 9716 просмотров

Их задача состоит в получении числа на входе, двух диапазонов для преобразования и пропорционального изменения исходного значения во второй диапазон:

Код: Выделить всё

ease(t, tMin, tMax, value1, value2)

  • t - исходное число, значение которого будет интерполировано
  • tMin - минимальное значение исходного диапазон
  • tMax - максимальное значение исходного диапазон
  • value1 - первое значение итогового диапазона (при t = tMin)
  • value2 - второе значение итогового диапазона (при t = tMax)
Причем value1 и value2 могут быть как больше, так и меньше друг друга. Например при использовании функции вида:

Код: Выделить всё

linear(time, 1, 2, 20, 80)

получим такой обрезанный график зависимости от исходного, постоянно возрастающего, значения времени, вписанный между 20 и 80 на участке с 1-ой до 2-ой секунды.
График преобразования.jpg
График преобразования.jpg (14.45 КБ) 9716 просмотров
График преобразования.jpg
График преобразования.jpg (14.45 КБ) 9716 просмотров

Таким образом, для получения нужного результат мы должны задать два диапазона для переменной времени time:
  1. от времени начальной точки слоя inPoint до времени первого маркера marker.key(1).time
  2. для изменения прозрачности от 0 до 100
График прозрачности.jpg
График прозрачности.jpg (50.83 КБ) 9716 просмотров
График прозрачности.jpg
График прозрачности.jpg (50.83 КБ) 9716 просмотров

Код: Выделить всё

d1s = inPoint;
d1e = marker.key(1).time;
d2s = 0;
d2e = 100;
ease(time, d1s, d1e, d2s, d2e)

Второй участок графика для спадания прозрачности после второго маркера делается также, но с учетом обратного преобразования с 100 до 0: от времени второго маркера marker.key(2).time до конечной точки слоя outPoint.

Код: Выделить всё

d1s = inPoint;
d1e = marker.key(1).time;
d2s = 0;
d2e = 100;
d3s = outPoint;
d3e = marker.key(2).time;
ease(time, d1s, d1e, d2s, d2e) - ease(time, d3s, d3e, d2s, d2e);

Двойной-график-прозрачности-для-двух-маркеров.jpg
Двойной-график-прозрачности-для-двух-маркеров.jpg (33.29 КБ) 9715 просмотров
Двойной-график-прозрачности-для-двух-маркеров.jpg
Двойной-график-прозрачности-для-двух-маркеров.jpg (33.29 КБ) 9715 просмотров

Еще я добавил в финальную версию выражения проверку наличия маркеров на слое через переменную marker.numKeys и (в случае отсутствия таковых) работу с настройками по умолчанию. Благодаря этому, выражение будет работать даже без маркеров на слое, что обеспечивает быстрое применение и готовность к работе с использованием пресетов.
:post_scriptum: Не забудьте посмотреть на полезные ссылки, там есть интересные скрипты для создания и управления анимацией через маркеры.

. :info: .
Полезные ссылки:

Проект прилагаю. Версия CC 2017.


Видео уроки для After Effects http://www.youtube.com/AEPlug
Платные консультации по работе в программах

Теги:



atatat
Наблюдатель
Наблюдатель
Сообщения: 50
Зарегистрирован: 05 июл 2016, 19:14
Благодарил (а): 3 раза
Поблагодарили: 1 раз

Сообщение #2 atatat » 18 мар 2017, 15:03

Самый полезный урок за этот год! Спасибо большое. Раньше тоже интересовался темой с маркерами, нашел что-то на англ сайтах, но не смог применить. Очень бы хотелось больше уроков на тему автоматизации, ведь это очень нужно в работе в АЕ!


Meh.21
Нуб
Нуб
Сообщения: 1
Зарегистрирован: 11 апр 2017, 15:15

Сообщение #3 Meh.21 » 11 апр 2017, 15:19

Доработал чутка для себя. Обработка >2 маркеров и 1го меркера (при этом затухание в конце не будет происходить)

Код: Выделить всё

d1s = inPoint;
d2s = 0;
d2e = 100;
d3s = outPoint;
trans = .5;

if (marker.numKeys==1)
   {
      d1e = marker.key(1).time;
     ease(time, d1s, d1e, d2s, d2e);
    }

if (marker.numKeys>1)
   {
      d3e = marker.key(marker.numKeys).time;
      d1e = marker.key(1).time;
      ease(time, d1s, d1e, d2s, d2e) - ease(time, d3s, d3e, d2s, d2e);
    }

if (marker.numKeys==0)
    {
      d3e = outPoint - trans;
      d1e = inPoint + trans;
      ease(time, d1s, d1e, d2s, d2e) - ease(time, d3s, d3e, d2s, d2e);
    }

Аватара пользователя

vladimir.rostripolka
Нуб
Нуб
Сообщения: 1
Зарегистрирован: 14 июн 2017, 11:34
Благодарил (а): 1 раз

Подскажите, может кто знает

Сообщение #4 vladimir.rostripolka » 14 июн 2017, 11:47

Спасибо за урок. Пытаюсь разобраться как привязать подобное выражение к масштабу? или любому другому имеющему 2 значения. С программированием знаком очень слабо. подскажите пожалуйста если кто разбирается как прописать. За ранее спасибо

Аватара пользователя

Автор темы
aeplug
Санта
Санта
Сообщения: 2802
Зарегистрирован: 18 мар 2016, 23:20
Откуда: С Ютуба
Благодарил (а): 18 раз
Поблагодарили: 274 раза
Контактная информация:

Сообщение #5 aeplug » 14 июн 2017, 13:16

vladimir.rostripolka писал(а):Источник цитаты подобное выражение к масштабу

измени последнюю строку на

Код: Выделить всё

t=ease(time, d1s, d1e, d2s, d2e) - ease(time, d3s, d3e, d2s, d2e);
[t,t]
Видео уроки для After Effects http://www.youtube.com/AEPlug
Платные консультации по работе в программах


Yurik
Не Нуб
Не Нуб
Сообщения: 38
Зарегистрирован: 17 апр 2018, 12:05
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сообщение #6 Yurik » 13 май 2018, 19:11

Извините, что поднял тему из подвала...
Очень нужно разобраться, но везде написано одно и тоже, но у меня не работает((
Что то не так в описании функции? или что то не догоняю?
В текстовом слое в Sourse вбиваю:
ease(time, inPoint, outPoint, 0, 100); реультат от 0 до 100, все норм.
Вбиваю:
ease(time, outPoint, inPoint, 0, 100); ничего не меняется, все равно от 0 до 100, а не наоборот.
Попробуйте сами, видимо
aeplug писал(а):Источник цитаты t - исходное число, значение которого будет интерполировано
tMin - минимальное значение исходного диапазон
tMax - максимальное значение исходного диапазон
value1 - первое значение итогового диапазона (при t = tMin)
value2 - второе значение итогового диапазона (при t = tMax)

Это не совсем так?

Спасибо

Аватара пользователя

Автор темы
aeplug
Санта
Санта
Сообщения: 2802
Зарегистрирован: 18 мар 2016, 23:20
Откуда: С Ютуба
Благодарил (а): 18 раз
Поблагодарили: 274 раза
Контактная информация:

Сообщение #7 aeplug » 13 май 2018, 20:26

поменяй 0 и 100 местами
Видео уроки для After Effects http://www.youtube.com/AEPlug
Платные консультации по работе в программах


Yurik
Не Нуб
Не Нуб
Сообщения: 38
Зарегистрирован: 17 апр 2018, 12:05
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сообщение #8 Yurik » 13 май 2018, 20:28

Да это понятно, тогда будет ок, но значит нет привязки, что именно первое значение времени будет интереполировано в первое нужное значение? В этой формуле ease(time, outPoint, inPoint, 0, 100) на outPoint (в конце слоя) должен быть 0 или нет? )

Аватара пользователя

Автор темы
aeplug
Санта
Санта
Сообщения: 2802
Зарегистрирован: 18 мар 2016, 23:20
Откуда: С Ютуба
Благодарил (а): 18 раз
Поблагодарили: 274 раза
Контактная информация:

Сообщение #9 aeplug » 13 май 2018, 20:45

Yurik писал(а):Источник цитаты первое значение времени

Ну в описании же написано МИНИМАЛЬНОЕ, а не ПЕРВОЕ. Значит сравниваются они там именно так.
Возвращает value1 при значении t меньше или равном tMin. Возвращает value2 при значении t больше или равном tMax. Возвращает линейную интерполяцию между value1 и value2 при выполнении условия tMin < t < tMax.

Yurik писал(а):Источник цитаты должен быть 0 или нет?

Очевидно да, но на практике нет.
Изображение
Может просто outPoint - это то место где слоя уже нет.
Поэтому 100 ты просто не видишь.
попробуй так

Код: Выделить всё

ease(time, inPoint, outPoint-thisComp.frameDuration, 0, 100)

без лишнего кадра на конце
Видео уроки для After Effects http://www.youtube.com/AEPlug
Платные консультации по работе в программах


Yurik
Не Нуб
Не Нуб
Сообщения: 38
Зарегистрирован: 17 апр 2018, 12:05
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Сообщение #10 Yurik » 13 май 2018, 21:15

Дело не именно 0 или 100. В твоей формуле на скриншоте outPointу на этом месте тайм лайна выдает 99.9. Нормально.
Но если ты поменяешь в форумле outPoint и inPOint, то ничего не изменится, все равно в конце клипа будет 99.9.
Вот это я и хочу понять. Насчет выполнения условия tMin < t < tMax, вот кусок твоей формулы:
aeplug писал(а):Источник цитаты ease(time, d3s, d3e, d2s, d2e);

d3s это outPoint, а d3e это маркер. Out явно больше маркера, какое ж тут выполнение условий?
Зануда я да?))) Ну или и правда, пофигу как писать второй и третий параметр функции, оно само разберется, поставит 4-й параметр меньшему, а 5-й параметр большему значению.


Вернуться в «Мои уроки»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей