After Effects IK腿部控制器 无任何插件! 反向动力学 可应用于任何图层~

合集 · AFTER EFFECTS (7)

  1. 21:22
    After Effects AE基础教程 3D场景的搭建 がんばれ同期ちゃん 加油吧同期酱! YOMUよむ
  2. 13:32
    After Effects 基础教程2 网点纸效果 与3D漫画的遮罩实现 加油吧同期酱!
  3. 5:05
    动画小剧场预告_用AE做一个看新闻联播的小房间 与美国总统奥巴马
  4. 9:32
    如何用AE做一个3D红衣教主 After Effects 3D 卡通角色 走路动画 教程 小剧场预告篇
  5. 5:06
    为什么有时候文件容量特别大? PSD JPG 容量太大 Photoshop PS技巧 缩小图片容量
  6. 7:49
    After Effects 自行车的绑定和控制
  7. 9:17
    After Effects IK腿部控制器 无任何插件! 反向动力学 可应用于任何图层~
Description
After effects IK rig without any Plugin #ae #aftereffects 
AE IK控制,无插件~

大小腿控制代码:
// === IK 设置变量(必须修改)===
cw = false;          // true=顺时针弯曲,false=逆时针(腿部通常 false)
upper = true;         // true=大腿,false=小腿
upperLimb = "大腿";      // 大腿图层名
lowerLimb = "小腿";      // 小腿图层名
extremity = "脚";       // 脚图层名
effector = "脚控制器";     // 控制器 Null 名

// === 以下代码无需修改 ===
function getWorldPos(theLayerName){
 L = thisComp.layer(theLayerName);
 return L.toWorld(L.anchorPoint);
}

A = getWorldPos(upperLimb);
B = getWorldPos(lowerLimb);
C = getWorldPos(extremity);
E = getWorldPos(effector);

a = length(B,C);
b = length(E,A);
c = length(A,B);

x = (b*b + c*c - a*a )/(2*b);
alpha = Math.acos(clamp(x/c,-1,1));

if (upper){
 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;
}else{
 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;
}



脚尖方向代码:
// === 新脚:彻底抵消所有父层旋转 + 始终指向脚尖控制器 ===

toe = thisComp.layer("脚尖控制器");  // ← 改成你脚尖控制器的真实名字

// 1. 计算世界空间下指向脚尖控制器的角度
targetWorld = toe.toWorld(toe.anchorPoint);
footWorld  = toWorld(anchorPoint);
vec = targetWorld - footWorld;
desiredWorldAngle = radiansToDegrees(Math.atan2(vec[1], vec[0]));

// 2. 递归累加所有父层总旋转(你原来的函数)
function getAllTotalRotate(layerObj){
  let totalRot = 0;
  let curr = layerObj;
  while(curr.hasParent){
    totalRot += curr.parent.transform.rotation;
    curr = curr.parent;
  }
  return totalRot;
}

// 3. 最终结果:期望的世界角度 - 所有父层旋转总和
desiredWorldAngle - getAllTotalRotate(thisLayer) + 180;