Tutorial 127: Tank-Style Wireframes

Joe Clay | Jun 8, 2018

This might be our longest tutorial ever. It was a difficult edit because I swapped some things around for some clarity, but it's a complicated tutorial involving using some sliders in ways they were never intended. So hopefully it's clear.

Anyway, this week we're taking a look at making a variant of the effect that Stu Maschwitz used on his short film Tank. Make sure to watch that and the BTS. This is not a copy. His work was far more intensive, and far more custom. This is a cheap imitation compared to Tank. That said, you can take this technique further and get nearer the beautiful subtle glitches and things that are present in Tank, but it will take you some time. If you use the Saber version we show, you can change Saber's flicker settings to get an approximation at least.

Here are the expressions we're using. Remember to set up a slider on each layer as the first effect, and name it with the nulls you're making a polygon out of in clockwise order. This first expression goes in a path property on your shape/solid—either in a mask or in a shape path. Shapes seem to be faster after my testing. Make sure you watch the video to see how you need to set up the shapes if you're using Saber instead of a stroked shape.

pts = effect(1).name.split(',');
offset = 1 + effect(1)("Slider");
p = new Array();
for(i = 0; i < pts.length; i++ ) {
    j = parseInt(pts[i])+offset;
if(effect("Open?")("Checkbox").value == 1 ) { createPath(p,[],[],false) } else { createPath(p) }

This expression gets applied to opacity.

pts = effect(1).name.split(',');
offset = 1 + effect(1)("Slider");
p1 = thisComp.layer(parseInt(pts[0])+offset).toComp([0,0,0]);
p2 = thisComp.layer(parseInt(pts[1])+offset).toComp([0,0,0]);
p3 = thisComp.layer(parseInt(pts[2])+offset).toComp([0,0,0]);

n = calculateNormal(p1,p2,p3);

function calculateNormal(p1,p2,p3){
    //Nz = UxVy - UyVx
    //cross p1p2 and p1p3
    u = [p2[0]-p1[0], p2[1]-p1[1], p2[2]-p1[2]];
    v = [p3[0]-p1[0], p3[1]-p1[1], p3[2]-p1[2]];
    return cross(u, v);

f = linear(effect("Flip Normals")("Checkbox"),0,1,1,-1);
if(n[2] * f > 0) { 100 } else { value };

We also used Cyclops to show the nulls in the tutorial. Grab it if you need to show controls like that!

Grab the Project Files

Get the project file through our Gumroad Store. This project file can only be opened in versions of AE that support Path Expressions (2018+). This contains the C4D models shown, as well as the After Effects setups for all of the comps shown. There are also two experimental comps that weren't shown. One uses AE Pixel Sorter, so if you open this and you get a warning for that effect, don't worry because everything shown in the tutorial will still work.

If you're buying project files, consider becoming a Patron. At the $5/mo. tier, you get access to project files as they come out and some tutorials also come with additional BTS content showing more of the builds.

Get the project on Gumroad

Become a Patron

If you'd like to help support Workbench, check out our Patreon page. Thank you for even considering clicking this link to support what we're doing. We appreciate it. Patrons get all sorts of benefits, from R&D files, setups, and elements to early product releases.

Check out our Patreon Today