JS编写AE表达式 使用n次方根在while循环存数组出现undefined
问题诊断与修复方案
错误原因
- 自定义
nthroot函数没有默认返回值:仅在特定if判断成立时返回结果,判断不成立时无返回值,直接输出undefined - 根次计算逻辑错误:奇次/偶次根的符号处理逻辑写反,且运行中覆盖了原始的根次参数
n,导致判断逻辑完全失效 - 需求逻辑偏差:你要实现的抛物线(匀加速)位移不需要逐帧计算n次方根,直接用时间进度的平方计算位移效率更高,也不会出现计算错误
修复后的可用代码
仅修复现有n次方根计算代码
// 修复后的n次方根计算函数 function nthroot(x, n) { if (n <= 0) return 0; // 规避根次为0/负数的非法输入 const isOdd = n % 2 === 1; const numSign = x < 0 ? -1 : 1; const absVal = Math.abs(x); const root = Math.pow(absVal, 1 / n); // 奇次根保留原始数值符号,偶次根仅返回非负结果 return isOdd ? numSign * root : root; } const distance = 1515; const frames = 6; const myArray = []; let i = 1; while (i <= frames) { myArray.push(nthroot(distance,i++)); } console.log(myArray); document.getElementById("demo2").innerHTML = myArray
更适配AE抛物线位移需求的表达式
你要实现n帧内x轴位移为抛物线的效果,直接使用标准化时间进度的平方计算位移即可,不需要额外存数组:
// 直接写在AE图层的位置属性上即可生效 const totalMoveFrames = 6; // 总运动帧数,可绑定表达式控制器 const totalXDistance = 1515; // 总x轴位移,可通过其他逻辑计算 const currentFrame = Math.floor(time / thisComp.frameDuration); if (currentFrame <= totalMoveFrames) { // 匀加速抛物线位移:位移量和时间进度平方成正比 const progress = currentFrame / totalMoveFrames; const currentX = value[0] + totalXDistance * Math.pow(progress, 2); [currentX, value[1]] } else { // 运动结束后保持最终位置 value }
内容的提问来源于stack exchange,提问作者KevinHaus
相关产品推荐
相关产品推荐

