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
相关产品推荐
相关产品推荐

