🕹️
AE Expressions
  • What is AE Expressions?
  • Getting started with Expressions
    • Useful links
    • After Effects - Quick Expressions Library
  • Quick Tips
    • After Effects - Arm Rig
    • After Effects - Liquid Smear
    • After Effects - Dynamic Shadows
    • After Effects - Dot Display
    • After Effects Expression - Computer Type-on Animation
    • After Effects Expression - Align Elements on a Path
    • After Effects Expression - Inertial Rotation
    • After Effects Expression - Force Field
  • Advanced Projects
  • After Effects - School of Fish
  • After Effects Expression - Global Wind Controller
  • After Effects Expression - Dynamic Line Waves
  • After Effects - Abstract Space Scene
  • After Effects Expression - Connected Dots
Powered by GitBook
On this page

Was this helpful?

  1. Quick Tips

After Effects - Arm Rig

PreviousAfter Effects - Quick Expressions LibraryNextAfter Effects - Liquid Smear

Last updated 4 years ago

Was this helpful?

Full step by step Tutorial:

Code for UPPER ARM rotation:

var cw = false;
var upperLimb = "UPPER ARM";
var lowerLimb = "LOWER ARM";
var extremity = "HAND";
var effector = "CONTROLLER";
function getWorldPos(theLayerName){
  var L = thisComp.layer(theLayerName);
  return L.toWorld(L.anchorPoint);
}
var A = getWorldPos(upperLimb);
var B = getWorldPos(lowerLimb);
var C = getWorldPos(extremity);
var E = getWorldPos(effector);
var a = length(B,C);
var b = length(E,A);
var c = length(A,B);
var x = (b*b + c*c - a*a )/(2*b);
alpha = Math.acos(clamp(x/c,-1,1));
D = E - A;
delta = Math.atan2(D[1],D[0]);
result = radiansToDegrees(delta - (cw ? 1 : -1)*alpha);
V = B - A;
adj1 = radiansToDegrees(Math.atan2(V[1],V[0]));
result - adj1 + value;

Code for LOWER ARM rotation:

var cw = false;
var upperLimb = "UPPER ARM";
var lowerLimb = "LOWER ARM";
var extremity = "HAND";
var effector = "CONTROLLER";
function getWorldPos(theLayerName){
  var L = thisComp.layer(theLayerName);
  return L.toWorld(L.anchorPoint);
}
var A = getWorldPos(upperLimb);
var B = getWorldPos(lowerLimb);
var C = getWorldPos(extremity);
var E = getWorldPos(effector);
var a = length(B,C);
var b = length(E,A);
var c = length(A,B);
var x = (b*b + c*c - a*a )/(2*b);
alpha = Math.acos(clamp(x/c,-1,1));
y = b - x;
gamma = Math.acos(clamp(y/a,-1,1));
result = (cw ? 1 : -1)*radiansToDegrees(gamma + alpha);
V1 = B - A;
adj1 = radiansToDegrees(Math.atan2(V1[1],V1[0]));
V2 = C - B;
adj2 = radiansToDegrees(Math.atan2(V2[1],V2[0]));
result +  adj1 - adj2 + value;

Original code by Dan Ebberts:

https://www.motionscript.com/design-guide/ik.html