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;
    p.push(fromCompToSurface(thisComp.layer(j).toComp([0,0,0])));
}
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

The best way to get our project files is to become a patron on Patreon. For $5 a month, you get access to all of the tutorial project files we've made available as well as other monthly projects, rigs, R&D, elements, early product previews, and BTS content not available anywhere else! You can also purchase just this project file on our Gumroad Store if you would rather do that.

Get access to all of our project files on Patreon or Get this single project file on Gumroad