You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

After Effects:如何让wiggle表达式在ease and whizz结束后再执行

解决方案

你当前写法出错的核心原因是:AE表达式始终以最后一行的执行结果作为属性最终值,你之前写的(easeAndWizz() || value); 计算结果完全没有被用到,全程返回的都是wiggle的计算值,自然会和缓动动画叠加出现异常。
你可以直接替换成下面的完整表达式即可实现「缓动爆炸完成后才开始晃动」的效果:

function easeandwizz_inoutQuint(t, b, c, d) {
    if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
    return c/2*((t-=2)*t*t*t*t + 2) + b;
}
 
function easeAndWizz() {
    var n = 0;
    if (numKeys > 0) {
        n = nearestKey(time).index;
        if (key(n).time > time) { n-- }
    }
 
    try {
        var key1 = key(n);
        var key2 = key(n+1);
    } catch(e) {
        return null;
    }
 
    // 确定关键帧的维度
    var dim = 1;
    try {
        key(1)[1];
        dim = 2;
        key(1)[2];
        dim = 3;
    } catch(e) {}
 
    t = time - key1.time;
    d = key2.time - key1.time;
 
    sX = key1[0];
    eX = key2[0] - key1[0];
 
    if (dim >= 2) {
        sY = key1[1];
        eY = key2[1] - key1[1];
 
        if (dim >= 3) {
            sZ = key1[2];
            eZ = key2[2] - key1[2];
        }
    }
 
    if ((time < key1.time) || (time > key2.time)) {
        return value;
    } else {
        val1 =  easeandwizz_inoutQuint(t, sX, eX, d);
        switch (dim) {
            case 1:
                 return val1;
                 break;
            case 2:
                 val2 = easeandwizz_inoutQuint(t, sY, eY, d);
                 return [val1, val2];
                 break;
            case 3:
                 val2 = easeandwizz_inoutQuint(t, sY, eY, d);
                 val3 = easeandwizz_inoutQuint(t, sZ, eZ, d);
                 return [val1, val2, val3];
                 break;
            default:
                 return null;
        }
    }
}

// 以下是新增的控制逻辑
// 获取最后一个位置关键帧的时间,也就是缓动动画结束的时间
var endTime = numKeys > 0 ? key(numKeys).time : 0;
var basePos = easeAndWizz() || value;

if (time > endTime) {
    // 动画结束后,以最终位置为基准叠加wiggle
    basePos + wiggle(1, 20) - value;
} else {
    // 动画进行中只返回缓动结果
    basePos;
}

额外说明

  • 已修复原Ease and Whizz代码里维度判断的笔误(原代码把Y轴的下标错写为2,2D属性下Y轴的正确下标是1,这也是你之前右侧物体运动异常的核心原因)
  • 如果要调整晃动的频率和幅度,直接修改wiggle(1,20)里的两个参数即可,第一个是每秒晃动次数,第二个是晃动的像素幅度
  • 如果需要给晃动加淡入效果,可以在wiggle外面套个线性插值,比如wiggle(1,20) * linear(time, endTime, endTime + 0.5, 0, 1) 就能实现爆炸结束后0.5秒内晃动幅度从0升到最大,过渡更自然

内容的提问来源于stack exchange,提问作者Arin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:15:04