May 24, 2024
This will change how you time remap footage/compositions in After Effects forever!
Feb 8, 2022
Pass.Port update
Pass.Port just got a big update to version 0.45
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
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");
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;
Happy aftereffecting :)
Oct 24, 2018
Moved my tools to Github
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 _после_ применения других эффектов
Эффект Set Channels устанавливает альфа канал в ноль, и чтобы маска работала в режиме Add надо ее инвертировать, то есть альфа канал обнулится для всей картинки кроме области маски. Естественно, этот метод поддерживает все фичи масок.
В приведенном примере на картинке вы видите, как маскированная часть изображения трансформирована и подкрашена и только затем обрезана таким вот методом. Очень удобно вместо использования Track Matte, например в случае если вам нужно двигать/скейлить изображение внтури маски.
May 25, 2017
Работа с массивами и строками в выражениях After Effects (статья дополняется)
* Эта статья находится в разработке, многое еще ищется и добавляется*
Это небольшой справочник, который я решила сделать для себя и всех, кто часто использует выражения при работе в Adobe After Effects. Поскольку выражения являются подмножеством JS, то многие возможности ускользают от пользователей After Effects, мало знакомых с программированием. Я решила пройтись по JS и протестировать совместимые функции и методы. Надеюсь этот справочник поможет вам успешнее использовать выражения в вашей работе и применять больше генеративных возможностей. Этот справочник будет уточняться и расширяться. Все, что здесь написано, проверено для версии CC 2014.
1. Массивы
Массив (объект Array) это объект, в котором сохранено некоторое количество других объектов, где каждому из них сопоставлен последовательный номер (индекс элемента). Элементы называются объектами, т.к. не имеют четкого типа. Вы можете смешивать в массиве значения разных типов (например и числовые и текстовые). Но за этим кроются некоторые подводные камни. Для простоты будем пока рассматривать одномерный массив вида:Это небольшой справочник, который я решила сделать для себя и всех, кто часто использует выражения при работе в Adobe After Effects. Поскольку выражения являются подмножеством JS, то многие возможности ускользают от пользователей After Effects, мало знакомых с программированием. Я решила пройтись по JS и протестировать совместимые функции и методы. Надеюсь этот справочник поможет вам успешнее использовать выражения в вашей работе и применять больше генеративных возможностей. Этот справочник будет уточняться и расширяться. Все, что здесь написано, проверено для версии CC 2014.
[1, 2, 3, 5, 7, "eight", -10]Операции с массивам перебором элементов в цикле это громоздко и медленно, давайте посмотрим, какие возможности нам предоставляет Java Script. Начнем с базовых арифметических операций. Для этого нам надо избавиться от текстового значения в примере выше, иначе мы получим сообщение об ошибке, т.к аримфетические операции не могут применяться к текстовым значениям. Для следующих примеров возьмем за исходный массив:
a = [1, 2, 3, 5, 7, 8, -10]
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. Итак применим функцию вычисления синуса к массиву:Конструкция выглядит немного странно, потому что формально мы применяем метод не к массиву, а к функции, и ей передаем массив в качестве аргумента. При этом наш массив это второй аргумент, первый аргумент указывает на прототип данных и нам не важен. Однако ж здесь нас ждет разочарование, результатом этой функции в АЕ будет значение только первого элемента. Пока я еще пытаюсь найти решение, однако же есть как минимум две очень полезные функции объекта Math, которые работают таким способом, это Math.max и Math.min. Таким способом мы можем быстро найти максимальное или минимальное значение в массиве:b = Math.sin.apply([], a)
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, её параметры будут
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.


