Recently, School of Motion asked if I'd write a series of articles exploring every single category in After Effects' Expressions Flyout Menu.
That turned into the 5-part article series Everything About Expressions You Didn't Know.
Recently, School of Motion asked if I'd write a series of articles exploring every single category in After Effects' Expressions Flyout Menu.
That turned into the 5-part article series Everything About Expressions You Didn't Know.
Here's a common freelance issue: you're working in-house at some studio (or remotely logged into a studio's workstation), and you don't have admin access to the computer. So how are you going to install all of your favourite After Effects scripts, presets, plugins, and extensions?!
Little known fact: on both MacOS and Windows, Adobe's actually given us specific folders to install our tools in that don't need Admin access.
That's right! You can stroll into Buck with your favourite scripts and install them into AE without needing to go bug IT for the fifth time this morning (how the heck is my Wacom still broken??).
All this to say, scripts, presets, and extensions can live in one of two locations:
I often see folks asking about ways to store expressions within After Effects; I wanted to create a little writeup of a few commercial systems out there.
Of course there are ways to store them offline, but sometimes it's nice to have a product to handle it all for ya.
Now, if these off-the-shelf tools don't fit your need, feel free to contact me for a custom solution 😉
Similar to my post on scripting, this is intended to be a roundup of a bunch of resources for learning javascript-based After Effects expressions. I'm focusing less on specific tutorials and more on broader-picture materials.
Like scripting, AE expressions are based on Javascript. However, as of AE 16.0+ (CC2019), AE now has a new expression engine that lets you use modern Javascript, not just the ancient ExtendScript system!
At this point, the majority of my work is in developing scripts for Adobe After Effects. The language used here (Extendscript) is a fork of ES3 from 1999. It's old. This means that we're limited to very, very vanilla javascript when we develop, with polyfills or helper libraries taking a lot of the headache out of this process. Thankfully, we can use Visual Studio Code ("vscode") to help relieve some of the pain.
I use Visual Studio Code as my one and only code editor. Apart from providing a wonderful development experience, you can sort of trick it into using some modern functionality when you write, even though it's not quite expecting it (and there are a few hiccups).
Sometimes I get asked about my preferred extensions & settings, and so! Here is more or less how I use it. The writeups, settings and extensions listed below are solely a reflection of what I currently work on as of the time of this article; as I grow and evolve, so do my needs and preferences.
I'm one of those people who feel that sharing is caring. If people in general were more willing to share their freelance rates, income, profit, and business practices, it would be much easier for others to earn a fair salary, and artists would find stability much faster than they do now.
To that end, I've shared spreadsheets for a few years which detail my freelance profit and loss amounts, including invoice breakdowns, tax installment payments (when applicable), and all expenses.
Here's a quick overview; read on for more details:
Often I'll get asked about how you can learn After Effects scripting; what sites, resources, reference materials are great for learning from.
After giving the same set of links every time, I wanted to collect them all in a single place that I'll try to keep up to date.
When I use Extendscript Toolkit, I always want to start with the same foundation, setting up an IIFE so I can play and not fuck with After Effects scripting global scope. For this example, the snippet below is what I want to start with.
(function () { })();
When working on Flow for After Effects, we were looking for a way to log standard JS console errors to a file, so that if something broke we'd be able to quickly diagnose the problem and fix it in a patch. Straightforward enough!
However, as the CEP standard is evolving, we found that there was some discrepancy in behaviors between different versions of AE with respect to how to enable logging and where the log files are saved. With any luck, this can help.
Because I write scripts, I keep a whole bunch of different versions of After Effects installed. This can get a little unwieldy, considering the icons don't change much between versions!
With this in mind, I quickly whipped up some alternate AE icons for Windows (I don't know much about these for MacOS, so no idea what size/formats are needed, sorry!). They're fairly pixely, just trying to keep the same dimensions and form factor of the existing.
Shape Layers. Strokes. You know how they work– add a stroke, and it'll increase in width both internally and externally from the path. But, with expressions, we can preserve the outer edge of your path and keep our stroke internal!
In a throwback to Points Along A Line from several years back, here's a quick expression for ya-- "Point on a Circle." Straightforward, yeah? Yeah.
Working on some scripting in ExtendScript and need to delete a setting you've saved to your users' preferences file? Did some looking around and it seems there was no known way. Until now!
I have a laptop. And a desktop. My laptop has the last three versions of AE on it at any given time, and my desktop has every major version from CS5.5 to now. That's a lot of AE!
Now, one thing that comes up very, very quickly with having multiple machines (or even multiple AE installs) is that all of your scripts, presets, plugins and even your workspaces have to be set up from fresh every time!
The more recent versions of AE help reduce the headache by syncing workspaces and prefs via the cloud, however I want it all in sync, all the time, immediately. Opening CC2021 on my laptop gives me the exact same toolkit and workspace as opening CS6 on my desktop, or any mix therein. This is how I do it.
OK, so, you're working in After Effects on an amazing infographic piece slated to become the best thing out there since that Stuxnet video. You've got your master comp with the audio bed in place, and have a series of precomps w/ audio & graphics sequenced and arranged together in your main composition.
You're working away on your project, have everything in each precomp chapter timed out and synced properly with the audio, and then... your client wants to re-record the VO. Or add in some copy. Or needs an alternate language version.
Alright, that's cool, we'll just drop in the new audio, slide our precomp over in time to where it should now be, open it up and do a preview to ensure everything's aligned properly. Except– the audio clip in the precomp is now out of sync with the master, as we've time-shifted the entire thing!
Hey, folks!
Though this has up until now been a strictly expression-based blog, I'd like to let you guys know about a cool direction I'm branching out into these days.
After I returned from NAB some couple weeks back had a hankering to try something new, dip my toes elsewhere in the AE/motion graphics world. So, a couple weeks ago I solicited a few ideas from friends and dove deep into the world of scripting.
At this point, I've got two scripts up on aescripts+aeplugins, and I'd like to talk about 'em a little bit here.
You're sitting at home, watching some action movie in which our handsome Hollywood hero sits down at a computer, faced with a terminal-esque window and has to ENTER PASSWORD in order to be rewarded with the exalted, famed and fabled "ACCESS GRANTED." Brilliant, right? Oscar material, right here.
Well, something I notice so very often in these screens is that the animator just keyframes the y-position and calls it a day, whereas in any console I've seen, the text always jumps up in little steps of equal height-- so I sought to recreate that for the film I was working on at the time.
You're working on some lower thirds, and you've got your ass-kickin', award-contendin' design and animation all worked out and you're riding your keyframe high only to realize... shit. You've got versioning to do. A dozen names and titles, maybe, or region/time zone splits-- whatever. You've done your pretty-making, and now the grunt work comes in.
Open a comp, change the text layer sourcetext, change the other text layer, duplicate the comp, open it up, change the text layer, change the other text layer, duplicate the comp... Yeah, I'd get tired of it too.
Instead of opening any comp (past initial setup), you can change all the text from your Project Panel
and have it propagate into each comp automagically using a handy expression that simplifies the process. Let's hit it.
I was recently working on a title sequence for an animated children's film created in a storybook style (in the spirit of Shrek), using sprite-style pose flipping.
To fit the style, all of the characters were animated as cutouts/puppets, with several poses for each character/prop. From there, I had to animate the scenes, which included finding an efficient way to cycle between distinct poses, creating the illusion of movement.
Last year about this time I was doing some motion & comp work for a pair of cinematics for a big ol' video game. One of my shots involved having these indicators moving across a screen with a hexagonal tile grid, and the art director wanted the indicators to snap from one tile to the next, giving it a much choppier, digital feel.
It took a while (longer than I'd care to admit, but alas) to get this expression put together. I won't claim that it's the best (or even most efficient) way, but if anyone has any suggestions on how I can optimize it please let me know!
Things have been busy! I'm working on several cool projects at the moment, one of which led me to share some cool math with you guys.
I've got two expressions that produce similar (yet different!) results-- both define the position for a point along a line, though one is controlled by % completion from one point to the next (0-1), the other by the distance (in pixels) from the start point.
In today's thrilling post I'm going to cover how to limit the number of digits after a decimal while working with expressions. While I know of a few ways to go about doing this, I'm going to cover the toFixed() method.
In class yesterday, one of my students asked about using for / while loops in expressions. As this isn't something I've had to use before, I spent the evening playing around with it.