Showing posts with label after effects. Show all posts
Showing posts with label after effects. Show all posts

May 24, 2024

This will change how you time remap footage/compositions in After Effects forever!

No jokes!
Use ordinary layer markers & speed values to retime instead of tedious timecode keyframing. For extra convenience marker management included. Shift them, copy/paste them, and color-code them markers across layers. 

Feb 8, 2022

Pass.Port update

 Pass.Port just got a big update to version 0.45

Pass.Port docked in AE UI

It is still very Beta, but I hope can be useful to you.

Fixes:
  • Bug fixes
  • UI overhaul, it should resize much better now
  • Support for all Redshift AOVs
  • AOVs names updated to the current Redshift C4D defaults
  • FPS (framerate) option is now fully respected
  • Browsing now unfolds to the previous folder
  • All fields are editable by user and being saved into settings

New options:
  • Parse button to rescan current folder without browsing again
  • Straight alpha option added. Also wanted to add Preserve RGB options, but ohh Adobe, they forgot to implement this
  • Quick help button added with a brief explanation of functionality
  • Imported utility and Beauty AOVs are now disabled (eye off) and moved to the top of the composition, so all you need is rearrange them in the right order, but it will be auto soon.

Jan 30, 2021

New dev project to ease renderpass importing/compositing in AE

Hi! Hope you're all doing well.

I finally finished the first alpha version of my renderpass importer for After Effects, and I need testers to speed up the development. Its very alpha, a bit shaky code but it can already save you some time, or a LOT of time if you have plenty of passes.


To make it useful all your passes must be in the same folder and share the same base name.

What it does:

  • After clicking the Browse button Pass.Port analyses the files in the folder you selected to find their shared name (stripped off of everything after the separator tag), it's called Basename. The one detected will be shown in the Basename field
  • If Pass.Port is able to detect the Basename, it will enable the Port button. Clicking it will import all found sequences, analyse them for the renderpass type (this is for the future feature of auto compositing) and for the Light Groups
  • Then if AutoComp is checked, it will sort the footage into separate compositions corresponding to the detected Light Groups
  • As a result you have all sequences imported and one or a few new comps, all placed into the project folder RS render passes created inside currently selected project folder. Pass.port will indicate this in its UI (and in the log file)
  • The script saves all your current settings between the sessions, including the last successful folder
  • Pass.Port creates a text log file with everything it has found and done named pass.port_log.txt next to your AE project file, or to your desktop if your project is not saved
  • Creates 2 undo groups, one for the Footage Import and another one for AutoComp stage, so you can undo by one

What it does not:

  • Doesn't rebuild your composition by the book yet, but its 100% next feature
  • Doesn't support multilayered exrs by now
  • The parsing is built for the default renderpass naming of C4D Redshift version only (with some variations), other Rule sets are on the list. But as long as you comply to the same rules you can use it with any other render engine
  • Tested on Windows only, cannot promise if it'll work on Mac
  • Doesn't change any of your files and does not access the internet
  • Unfortunately it will never be able to make you a coffee

Naming the renderpasses:

A tip for getting a consistent basename for your main render and passes with takes in c4d with tokens:

for main output: .../$take/$take

for RS AOVs: $take_AOV

Or with the $camera token in the same manner. Pass.port will recognise this naming very gladly

Usage and Feedback:

You can run Pass.Port as usual using the Run Script menu, or place it into ...Support Files\Scripts\ScriptUI Panels to be able to dock it into your AE interface

It is a free script, but please do not sell it and do not include it in any products free or paid

Get it for free from the Pass.port GitHub repository and join my Discord if you're actively using Pass.Port and have some feedback/issue.

May 21, 2019

Add current layer(s) info to your After Effects renders

Sometimes you need to include current layer(s) information to your renders, so they could be identified by a viewer or yourself or just for debugging purposes. Here's how.

1. Create an empty text layer
2. Unfold its properties to Text -> Source Text
3. Click its stopwatch while pressing Alt (it enables the expression for the Source Text)
4. Paste this expression:
So your layer should look like this: 




5. You're done. Adjust the text layer's size, font, color and position to your preferences as usual. This expression creates text with your composition name and current layer(s) numbers. If you do not want it to be included in the actual render, use Layer -> Guide Layer option

Or if there's more than one layer active at current time:


This expression takes in account all the layers below itself, so to include all of comp layers make this text layer the topmost.
The expression can be slow if you have some huge amount of layers in your comp.

It's also very easy to get the layers names instead of their numbers. Here's the version for it:
Enjoy!

Jan 13, 2019

Nudging a layer by a fraction of frame


When working with audio in After Effects I often find it difficult to sync the sound with a desired precision because all layers are snapped to frame length. But it's possible using AE scripting. You can save this as a separate script or (like me) use it with ft-Toolbar.
var comp = app.project.activeItem;
var lr = comp.selectedLayers[0];
if (comp.selectedLayers.length > 0) {
    var frl = comp.frameDuration;
    app.beginUndoGroup("Layer Nudge");
    lr.startTime += frl/4;
    app.endUndoGroup();
} else alert("Select a layer");
This code will nudge your selected layer by 1/4 of a frame length forward.
If you use ft-Toolbar (or similar extension) put the previous code as a main Javascript function. And for the modified (Ctrl +Click for instance) use the copy of it with a change of the sign in the line:
    lr.startTime -= frl/4;
It nudges the layer into the opposite direction. Or if you need a different precision, just change the divider /4.

You can find more useful AE scripts in my GiHub repository

Happy aftereffecting :)

Oct 24, 2018

Moved my tools to Github

I moved my set of SendTo_FFmpeg batches to a Github repoSo if you have issues, ideas, request, you can post them there.
There's also new AEExprTool I develop for myself. It's After Effects script for adding/removing error handling code to AE expressions in bulk. It's already a huge time saver for me. Would love to have some feedback cause I plan to make it a reliable full featured tool one day.

Aug 10, 2017

Применение маски в After Effects _после_ применения других эффектов

Сегодняшний хак по After Effects поможет вам вмешаться в порядок выполнения операций в АЕ и применить маску (или несколько масок) слоя ПОСЛЕ применения других эффектов (или где-то в середине). Для этого вы просто создаете эффект Set Channels с альфой на Off и ограничиваете действие эффекта целевой маской с помощью Compositing Options. См. картинку.

Эффект Set Channels устанавливает альфа канал в ноль, и чтобы маска работала в режиме Add надо ее инвертировать, то есть альфа канал обнулится для всей картинки кроме области маски. Естественно, этот метод поддерживает все фичи масок.

В приведенном примере на картинке вы видите, как маскированная часть изображения трансформирована и подкрашена и только затем обрезана таким вот методом. Очень удобно вместо использования Track Matte, например в случае если вам нужно двигать/скейлить изображение внтури маски.

May 25, 2017

Работа с массивами и строками в выражениях After Effects (статья дополняется)

* Эта статья находится в разработке, многое еще ищется и добавляется*
Это небольшой справочник, который я решила сделать для себя и всех, кто часто использует выражения при работе в Adobe After Effects. Поскольку выражения являются подмножеством JS, то многие возможности ускользают от пользователей After Effects, мало знакомых с программированием. Я решила пройтись по JS и протестировать совместимые функции и методы. Надеюсь этот справочник поможет вам успешнее использовать выражения в вашей работе и применять больше генеративных возможностей. Этот справочник будет уточняться и расширяться. Все, что здесь написано, проверено для версии CC 2014.


1. Массивы

Массив (объект Array) это объект, в котором сохранено некоторое количество других объектов, где каждому из них сопоставлен последовательный номер (индекс элемента). Элементы называются объектами, т.к. не имеют четкого типа. Вы можете смешивать в массиве значения разных типов (например и числовые и текстовые). Но за этим кроются некоторые подводные камни. Для простоты будем пока рассматривать одномерный массив вида:
[1, 2, 3, 5, 7, "eight", -10]
Операции с массивам перебором элементов в цикле это громоздко и медленно, давайте посмотрим, какие возможности нам предоставляет Java Script. Начнем с базовых арифметических операций. Для этого нам надо избавиться от текстового значения в примере выше, иначе мы получим сообщение об ошибке, т.к аримфетические операции не могут применяться к текстовым значениям. Для следующих примеров возьмем за исходный массив:
a = [1, 2, 3, 5, 7, 8, -10]
Я наверное опущу такие простые операции, как извлечение элемента массива вида b = a[3], когда в результате переменной b мы присваиваем значение третьего элемента. Не забывайте, что нумерация элементов массива начинается с нуля.

1.1 Сложение и вычитание массивов

b = a + 1

В данной операции правый операнд рассматривается как массив из одного элемента, то есть выглядит как a + [1], таким образом единица добавится к нулевому элементу массива а, получаем:
[1, 2, 3, 5, 7, 8, -10] => [2, 2, 3, 5, 7, 8, -10]
Отсюда легко догадаться каков будет результат следующей операции:
b = a + [1, 1, 1]
К первым трем элемента будет добавлено по единице:
[1, 2, 3, 5, 7, 8, -10] => [2, 3, 4, 5, 7, 8, -10]

1.2 Умножение и деление

b = a * 2
Здесь все работает немного по-другому, и операция умножения или деления выполняется для всех элементов массива. Результат:
[1, 2, 3, 5, 7, 8, -10] => [2, 4, 6, 10, 14, 16, -20]
Умножение массива на массив невозможно.

1.3 Теперь рассмотрим функции объекта Math с массивами

Допустим нам надо вычислить значения синуса. Конструкция Math.sin(a) не сработает и вернет нам результат NaN. Поэтому самое время добавить к нашим знаниям метод применения функции ко всем элементам массива. Метод объекта массива map не вошел в АЕ, но зато вошел метод apply объекта Function. Итак применим функцию вычисления синуса к массиву:
b = Math.sin.apply([], a)
Конструкция выглядит немного странно, потому что формально мы применяем метод не к массиву, а к функции, и ей передаем массив в качестве аргумента. При этом наш массив это второй аргумент, первый аргумент указывает на прототип данных и нам не важен. Однако ж здесь нас ждет разочарование, результатом этой функции в АЕ будет значение только первого элемента. Пока я еще пытаюсь найти решение, однако же есть как минимум две очень полезные функции объекта Math, которые работают таким способом, это Math.max и Math.minТаким способом мы можем быстро найти максимальное или минимальное значение в массиве:
b = Math.max.apply([], a)
или (по идее правильнее)
b = Math.max.apply(Math, a)
возвращает нам значение 8:
[1, 2, 3, 5, 7, 8, -10] => 8

И тут давайте ввернем полезный метод slice объекта Array. Он поможет нам отсечь часть массива, например:

b = a.slice(2,5)
вернет нам массив, который будет копией элементов со 2 по 5 массива a:
[1, 2, 3, 5, 7, 8, -10] => [3, 5, 7, 8]
Или вот так (второй аргумент опциональный, если его нет, берется все до конца)
b = a.slice(3)
вернет нам все, начиная с третьего элемента:
[1, 2, 3, 5, 7, 8, -10] => [5, 7, 8, -10]
А теперь применим все вместе и найдем в массиве минимальное значение между вторым и пятым элементом:
b = Math.min.apply([], a.slice(2, 5))
получим значение 3
[1, 2, 3, 5, 7, 8, -10] => 3

1.4 Теперь все функции и методы массивов

Количество элементов в массиве (длина массива)
b = a.length => 7
Преобразования массива в строку
a.toString() => "1, 2, 3, 5, 7, 8, -10"
a.toLocaleString()
Преобразование в строку исходного кода
a.toSource() => "[1, 2, 3, 5, 7, 8, -10]"
Объединение массивов/значений в массив последовательно
b = a.concat(32,53,75) => [1, 2, 3, 5, 7, 8, -10, 32, 53, 75]
b = a.concat([32,53,75]) => [1, 2, 3, 5, 7, 8, -10, [32, 53, 75]]
Переворот массива (обратная последовательность элементов)
b = a.reverse() => [-10, 8, 7, 5, 3, 2, 1]
Cлияние массива в строку с разделителем (символ разделителя указан в операнде)
b = a.join(";") => "1;2;3;5;7;8;-10"
Cортировка массива (по возрастанию)
b = a.sort() => [-10, 1, 2, 3, 5, 7, 8]
Аргументом функции sort может выступать другая функция, но в АЕ этот метод похоже не работает

Извлечение части массива (по первому и последнему индексам элементов)

b = a.slice(4) => [7, 8, -10]
b = a.slice(3, 5) => [5, 7] 
Извлечение части массива (по индексу и количеству элементов)
b = a.splice(2) => [3, 5, 7, 8, -10]
b = a.splice(2,4) => [3, 5, 7, 8]
В JS этот метод может так же удалять и вставлять значения в массив, но не поддерживается в АЕ 

Все предыдущие методы работы с массивами возвращали измененные значения, следующие же методы изменяют сам массив, поэтому в примерах указываются два значения, первое - новое значение массива a, второе - возвращаемое знавчение b.

Отброс последнего элемента массива с укорочением его длины, возвращает выброшенное значение (последний элемент)

b = a.pop() => [1, 2, 3, 5, 7, 8] -10
Такая же операция но с нулевым элементом массива (сдвиг массива)
b = a.shift() => [2, 3, 5, 7, 8, -10] 1
Вставка значений в конец массива с увеличением его длины, возвращает новую длину массива
b = a.push(-9,-8,-7) => [1, 2, 3, 5, 7, 8, -10, -9, -8, -7]  10
b = a.push([-9,-8,-7]) => [1, 2, 3, 5, 7, 8, -10, [-9, -8, -7]]  8
Вставка значений в начало массива с увеличением его длины, возвращает новую длину массива
b = a.unshift(-2, -1, 0) => [-2, -1, 0, 1, 2, 3, 5, 7, 8, -10, -9, -8, -7]  10
b = a.unshift([-2, -1, 0]) => [[-2, -1, 0], 1, 2, 3, 5, 7, 8, -10, -9, -8, -7]  8

2. Строки

Не будем расматривать бестолковые методы html-форматирования, они нам вряд ли понадобятся. Вот их перечень на случай, если вы захотите оформить что-то в html: .anchor .big .blink .bold .fixed .fontcolor .fontsize .italics .link .small .strike .sub .sup

Создание строки s

s = "something"  => "something"
s = String("something")  => "something"
s = new String("something") => "something"
s = String(a) => "1, 2, 3, 5, 7, 8, -10"
Строки (объект String) по сути тоже являются массивами, но все их элементы это символы. Поэтому некоторые методы строк очень схожи с методами массивов. Так же как и с массивами вы можете обращаться к символам внутри строки по индексу, нумерация так же начинается с нуля. Пусть далее str = "test this thing" 
s = str[2] => "s"
s = ss.charAt(2) => "s"
Длина строки (количество символов)
b = str.length => 15
Индекс первого найденного включения строки (символа или символов) в строке
b = str.indexOf("i") => 7
b = str.indexOf("thing") => 10
b = str.indexOf("x") => -1
Индекс последнего найденного включения строки (символа или символов) в строке
string.lastIndexOf("i") => 12
string.lastIndexOf("thing") => 10
string.lastIndexOf("a") => -1 

string.charCodeAt()- код символа по индексу
ss + "" = ss.concat("")- идентично, сложение строк
string.localeCompare() - сравнение строк с кучей опций (см документацию по яве)
string.match(regexp)- проверка строки на соответствие Regular Expression
string.replace(regexp,"")- замена подстроки по Regular Expression. Пример:
 ss.replace(/thing/gi,"thing") => "test this thing"
string.search("s" or regexp) - поиск внутри строки s или Regular Expression
string.slice(a,b) - извлечение строки между указанными индексами
string.split("s", [n]) - разбиение строки на массив строк, разделитель - символ s, n - лимит
b = ss.split(" ", 3) => ["test","this","thing"]
string.substr(m,[length]) - извлечение строки с индекса по количеству символов
string.substring(m,[n]) - извлечение строки межу казанными индексами
string.toLocaleLowerCase() str.toLowerCase() - перевод строки в нижний регистр
string.toLocaleUpperCase() str.toUpperCase() - перевод строки в верхний регистр
string.toSource() - исходный код объявления строки
string.toString()
string.valueOf()


Дополнительно полезно:

instanceOf - тест на тип данных объекта. Пример: a instanceOf Array = true
eval(string) - вычисление арифметического выражения внутри строки
parseInt(string) - извлечение целого числа из строки
("00000000" + Number).substr(-n) Добавить n нулей перед числом Number

= еще будет =

операции с массивами строк
многомерные массивы


function.length - количество аргументов функции
function.arguments() - аргументы функции
function.name() - имя функции
function.prototype.call() - вызов функции как метод (похоже на apply но к набору значений)
function.toString() - получение исходного кода функции (если функция объялена в коде)

2.1 Примеры

Перевернуть порядок слов (разделитель - пробел)
s.split(' ').reverse().join(' ')  => "thing this test"
Сумма элементов массива. Здесь массив записывается в виде строки суммы и затем вычислется с помощью инструкции eval
eval(valList.join('+')) 
Минимальный элемент массива
b = Math.min.apply(Math, a) 
Максимальный элемент массива
b = Math.max.apply(Math, a) 

Jan 4, 2017

Motion Blur


Это просто пост-памятка, может кому тоже пригодится.
Post Motion Blur для 3DS Max и Mental Ray с композом в After Effects при помощи RSMB Pro от RE:Vision





1. Motion Vector Export (mi) map повесить на camera output shader, её параметры будут
Max Displace = 2000 (большое начение для работы в 32 битах в AE)
Blue Channel = off
Floating Point = off или 0 (строго)
Blur Environment/Background = off (строго, т.к. для motion vectors нужен альфа канал)

2. Зафигачить Render Passes, так как motion vectors пойдут в основной вывод, поэтому надо использовать beauty pass для вывода самого рендера, чтобы не считать beauty отдельно еще раз.

3. Финальные вектора должны выглядеть почти равномерно зелено-грязными (важно). В AE футаж векторов сделать RGB preserve. И тогда RSMB Pro Vectors в AE возьмет без всяких проблем. Блюр будет лучше, если использовать высокую битность проекта с Blend gamma 1.0 или в линейном цветовом пространстве. Рекомендуют так же, чтобы альфа у motion vectors была premultiplied black, но я сама важности этого не проверяла.

May 21, 2013

Form 2¾D particles test developed




This is a continuation of my attempt to make Trapcode Form particles respond the main composition camera motion. So they act almost like 3d objects as you see. The trick is in connecting precomposed particle camera to main composition camera plus many more little tricks added in this version. Particles were created in AE also.
Unfotunately it's not possible to use Sprites and Shading with this because these options make particles distorted for some reason (probably because the precomp is used with transormation collapse flag).
Another disadvantage of this is that it's not possible to use multiple particles source, at least i haven't found the way to do it (yet). Since the main comp and particle's cameras are connected in time it doesn let me use Time Samples to their full. I tried to trick it using another copy of a particle (with variations) in the same particle precomp (butterfly) with its own camera connected to main comp camera but with scripted time offset and using Split Clip mode, but it didn't work.
For this version i used a pair of butterflies in one precomp with slightly different positions and motion parameters.