After Effects design for VFX

Multi-Domain Operations (MDO)

Lockheed Martin is helping our customers redefine the battle space across all domains - air, land, sea, space and cyber. Our connective Multi-Domain solutions make every warfighter, every platform, every asset - a sensor, a processing node, a weapon.

A Deep Dive
A Deep Dive
A Deep Dive
A Deep Dive

A Deep Dive

Part of my assignment was to review military symbols and to "future-fy" them. So I studied the deeep and extensive library of military symbols, and their meaning, how they stack, when they are used, etc. It gave a me a large amount of respect for what looks like simple design, but is a very complex system of good ideas.

After Effects: Design with Code

After Effects: Design with Code

I fell in love with After Effects when I was doing commercials for Yamaha. The program was fairly new and although it wasn't the first program to bring design to video, it was the friendliest. As a programmer and artist, After Effects lets me feed both sides of my brain. I'll place some examples here, but you will find more on my blog.

I needed to create text that looked "military" but wasn't direct jargen, so I created a little script to make words that looked military enough for small buttons and graphics. These were used throughout the video.


c = ["b","c","d","f","g","h","l","m","n","o","p","r","s","t"];

v = ["a","e","i","o","u","y",".","-"];
o = [" ","b","c","d","f","g","h","l","m","n","o","p","r","s","t","a","e","i","o","u","y",".","-"];
t = c[ Math.floor( random()*c.length ) ] + v[ Math.floor( random()*v.length ) ] + o[ Math.floor( random()*o.length ) ] + c[ Math.floor( random()*c.length ) ];
r = c[ Math.floor( random()*c.length ) ] + v[ Math.floor( random()*v.length ) ] + o[ Math.floor( random()*o.length ) ] + c[ Math.floor( random()*c.length ) ];
[ t+r ]

Smarter Dumb Text

Sometimes you need to have text large enough to recignize as smart-science-stuff but you aren't going to sit and read it. I brought in Lorem Ipsum from Star Trek the Next Generation and broke out the words so they could be randomly thrown on screen. The code is pretty similar to what I have above, but a lot more fun to read.


a = ["elementary","valuable","statement","science","beginning","wisdom","porters","off","manual","sweep","anomalous","airborne","electromagnetic","readings","Radiation","levels","atmosphere","percent","Electro","magnetic","subspace","wave","fronts","approaching","synchronization","deflector","shields","maximum","output","wormhole","size","short","localphenomenon","sufficient","data","compile","holographic","simulation","wormhole","phenomenon","remarkable","bio","electronic","engineering","EM","spectrum","ranging","heat","infrared","radio","waves","interior","heat","geo","thermal","energy"];

l = ( a.length - 1);
w = Math.floor( random( )*l );
a[ w ] ;

Not a lot of code...

I know what you are thinking, but in design a little snippit of code can go a long way. A little bit of text that you can place and not worry about what it actually says is a huge time saver. If you really want to see something more invloved... here is what I used to create animated nodes in 3D space:


columns = effect("Columns")("Slider"); //number of columns in grid

tHold= effect("tHold")("Slider"); //hold time (must be less than tmin)
tMin = effect("tMin")("Slider"); //minimum cycle time (can't be zero)
tMax = effect("tMax")("Slider"); //maximum cycle time

gap = this_comp.width/columns;
origin = [gap,gap];
xGrid = columns - 1;
yGrid = Math.floor(this_comp.height/gap) - 1;
zGrid = Math.floor(this_comp.width/gap) - 1;

start = 0;
end = 0;
j = 1;

while (time >= end){
  j += 1;
  start = end;
  end += random(tMin,tMax);
targetX = Math.floor(random(0,xGrid));
targetY = Math.floor(random(0,yGrid));
targetZ = Math.floor(random(0,zGrid));
x = random(); //this is a throw-away value
oldX = Math.floor(random(0,xGrid));
oldY = Math.floor(random(0,yGrid));
oldZ = Math.floor(random(0,zGrid));

if(targetX == oldX && targetY == oldY){
  origin + [oldX,oldY,oldZ]*gap;
}else if (time - start < tHold){
  origin + [oldX,oldY,oldZ]*gap;
  deltaX = Math.abs(targetX - oldX);
  deltaY = Math.abs(targetY - oldY);
  deltaZ = Math.abs(targetY - oldZ);

  xTime = (end - start - tHold)*(deltaX/(deltaX + deltaY));
  yTime = (end - start - tHold)*(deltaY/(deltaX + deltaY));

  if (time < start + tHold + xTime){
    startPos = origin + [oldX,oldY,oldZ]*gap;
    targetPos = origin + [targetX,oldY,oldZ]*gap;
    easeOut((time - start - tHold)/xTime, startPos, targetPos);
    startPos = origin + [targetX,oldY,oldZ]*gap;
    targetPos = origin + [targetX,targetY,targetZ]*gap
    easeIn((time - start - tHold - xTime)/yTime, startPos, targetPos);