-
[AE表达式]数字添加千分位
表达式 x=parseFloat(text.sourceText).toFixed(2); x.replace(/\B(?=(\d{3})+(?!\d))/g, ',') 解析 parseFloat: 将字符串转为浮点数 toFixed(2): 将一个小数按位截取, 2代表截取2位 后面的是每3位增加一个,, 可以换成其他字符- 145
- 0
-
[AE表达式] 当前帧秒显示 | 动画摄影
效果 粘贴表达式到当前合成的文字图层表达式里即可 表达式 // 补零函数 function PrefixZero(num, n) { var zeros = new Array(n + 1).join('0'); return (zeros + num).slice(-n); } // 当前合成帧率(可以手改为24) fps = 1.0 / thisComp.frameDuration; // 当前秒整数/帧数 second = PrefixZero(Math.floor(time), 2); current_frame = PrefixZero((time * fps) % fps + 1, 2); // 总帧数 total_frames = PrefixZero(timeToFrames(), 4); // 合成静态总秒 comp_seconds = Math.floor(thisComp.duration); // 合成静态总帧 comp_frame = PrefixZero(timeToFrames(thisComp.duration) % fps, 2); // 输出 second + " + " + current_frame + " " + total_frames+ "k" + " " + "(总时长 " + comp_seconds + "+" + comp_frame +"k)"- 402
- 0
-
【AE表达式 进阶】自定义函数库 跨合成随意调用
有粉丝问我, 赶紧看下鹤梦视频 示例 // ① 自定义函数库示例 // 文字图层表达式: // 图层位于: comp("Utils").layer("MyFuntions") function get_222(){ return 222 } // ② 调用函数示例(任意图层) // eval: 用于将普通字符串转为代码 // text.sourceText: 文字图层的内容 eval(comp("Utils").layer("MyFuntions").text.sourceText) get_222() // 成功啦 视频介绍 https://www.bilibili.com/video/av806513702/ 优缺点 如果经常使用表达式, 可以多弄很多函数, 并且用新建工程模板, 方便很多 如果对表达式不太熟悉, 甚至连函数是什么都不知道, 那么对你没用- 633
- 0
-
【AE表达式案例】螺旋线怎么做
示例 表达式 创建形状图层, Add -> Path 在Path里添加表达式 再加一个描边即可 radius = 0; // 初始半径 turns =5; // 旋转次数 segments = 250; // 线段数 thetaMax = turns * 2 * Math.PI; // 最大角度 thetaMin = 0 * 2 * Math.PI; // 最小角度(初始角度) step = (thetaMax - thetaMin) / segments; // 每一步的角度增量 inOutTangents = [0.0, 0.0]; // 入向和出向切线长度 // 创建螺旋线的路径 vertices = []; inTangents = []; outTangents = []; for (i = 0; i <= segments; i++) { theta = i * step + thetaMin; x = radius * Math.cos(theta); y = radius * Math.sin(theta); vertices.push([x, y]); inTangents.push([Math.cos(theta - step / 2) * inOutTangents[0], Math.sin(theta - step / 2) * inOutTangents[1]]); outTangents.push([Math.cos(theta + step / 2) * inOutTangents[0], Math.sin(theta + step / 2) * inOutTangents[1]]); radius += 1; // 每段线段的半径递增 // radius += Math.cbrt(i*i); // 可以更改这个 使半径变化更大 } createPath(vertices, inTangents, outTangents, false); 其他 螺旋线路径: https://www.yuelili.com/?p=6540- 676
- 0
-
[AE表达式]打字机 | 尾部方块版
原理 一个文字动画 + 一个方块.而方块正好是最后一个字的长宽最大值,生成的正方形 文字图层 文字动画应该没啥问题,就一个选择器过滤即可 文字动画教程:https://docs.yuelili.com/ AE->形状与动画 小方块创建方法 获取文字偏移(只要最后一个) 那么,如何让这个字变成方块呢.使用表达式即可,分别控制大小和位置 sourceRectTime详细教程:全网最硬核的sourceRectTime()教程 方块的大小 // 这里用来获取截取单字的宽高,并且取最大值 // 然后绘制一个小方块 // 教程:https://www.yuelili.com/sourcerecttime/ layer = thisComp.layer("生まれ変わる新しい人生").sourceRectAtTime(time); r = Math.max(layer.width,layer.height); [r,r] 大字(没问题) 小字(因为表达式只能去left,所以不是居中的,必须加个空隙) layer = thisComp.layer("生まれ変わる新しい人生").sourceRectAtTime(time); left=layer.left; // 单字距离左边距离 top = layer.top; // 单字距离顶部距离 max = 184; // 最大字宽 r = Math.max(layer.width,layer.height); // 方块的半径 // 获取截取单字的左边距,然后与当前位置相加,这样可以手动拖拽这个位置属性 进行微调 // 因为left只是左边距,所以不居中,就很丑. 可以个人调节系数使其大致居中 // 采用的是以最大字宽作为基准,其他小字会相对偏移一点 // 没有细算 凑合用吧 因为我外卖到了 transform.position+[left - (max -r)/1.5 ,top/2]- 1.5k
- 0
-
【AE表达式】常用小合集
2D 到 3D 空 将 2D 位置附加到 3D Null thisComp.layer("3D Layer Name").toComp([0,0,0]); 按标记持续时间自动淡入和淡出 使用标记淡入淡出图层以设置持续时间 fadeFrames = 6; m = 0; t=time; if(marker.numKeys > 0) { m = marker.nearestKey(time).index; tag = marker.key(m).comment; if(tag == 'Highlight'){ tMin = marker.key(m).time; tMax = tMin + marker.key(m).duration; if(t < tMin){ linear(time, tMin - framesToTime(fadeFrames), tMin, 0, value); } else { linear(time, tMax - framesToTime(fadeFrames), tMax, value, 0); } } else { value; } } else {value} 在文本上垂直居中锚点 使锚点始终垂直居中在文本图层上 y=value[1]-sourceRectAtTime(time).height/2; [0,y] 使用复选框控制属性 将此表达式应用于要控制的属性(如不透明度)并确保它引用正确的控制层。 value * thisComp.layer("Controls").effect("Control Name")("Checkbox"); // replace Checkbox Control with your checkbox control 使用 Null 控制形状图层位置 使用 Null 控制形状图层位置 - 与育儿类似,但保持形状图层的相对位置。 control=thisComp.layer("Control NULL"); // your controller null controlPos = control.toComp(control.transform.anchorPoint); fromComp(controlPos) // apply to position property 延迟 一定帧数的延迟属性 delay = 5; //number of frames to delay d = delay*thisComp.frameDuration*(index - 1); thisComp.layer(1).rotation.valueAtTime(time - d) 使用滑块延迟关键帧 使用滑块控件将关键帧动画延迟定义的秒数。像标记触发器一样工作,但更简单。对 MOGRT 有用 delay = thisComp.layer("Controls").effect("Delay")("Slider"); // pickwhip to your Delay Slider (in seconds) valueAtTime(time-delay) 下拉菜单选择 通过下拉菜单选择控制图层的不透明度。在图层的开头添加一个数字 [1,2,3,etc] 使其工作 select = thisComp.layer("CONTROLS").effect("Dropdown")("Menu"); // pick whip to your dropdown (select == parseInt(thisLayer.name[0])) ? value : 0; 冻结随机数 生成随机数 seedRandom(index,true); myValue = random(50) ; 获取当前日期和格式 获取当前日期的有用片段 d = new Date(Date(0)); // Format Settings divider = "/" yearLength = 2; // use 2 for YY, 4 for YYYY …- 2.8k
- 0
-
【AE表达式】根据与相机的距离,缩放3D图层
https://videolancer.net/scale-layer-depending-on-distances-from-camera 如果你把这个表达式应用到三维图层的Scale参数上,那么当你远离相机或缩放时,图层会自动增加,视觉上不会改变其大小。 cam = thisComp.activeCamera; distance = length(sub(position, cam.position)); scale * distance / cam.zoom;- 1.3k
- 0
-
【AE表达式】根据摄像机的角度,将3D层透明化
https://videolancer.net/transparency-3d-layer-depending-on-the-angle-of-the-camera/ 适用于不透明度参数。尽如果用于其他参数,请改变endVal和startVal行中的值。 例如,要改变图层的大小,需要写上[X, Y]的数值。 endVal = [100,100]; startVal = [150,150]。 endVal = 100; // Value if the layer is facing the camera startVal = 0; // Value if the layer is at an angle fadeAngle = 90; // The angle at which the maximum influence on the value v = toCompVec([0,0,1]); d = length(toWorld(anchorPoint),thisComp.activeCamera.toWorld([0,0,0])); c = v[2]/d; ease(c,Math.cos(degreesToRadians(fadeAngle)),1.0,startVal,endVal)- 615
- 0
-
【AE表达式】文字丝滑坠落
文字添加动画器,比如位置给个-100 再给这个动画器加个 表达式选择器 ,给表达式选择器的数量(amount)添加表达式 (你还可以给缩放啊 倾斜等添加类似动画) delay = 0.03; // 延迟 freq = 3; // 频率 amp = 60; // 幅度 decay = 10; // 值越小,波动越大 Speed = 0.8; // 值越小,动画越慢 myDelay = delay*textIndex; t = (time - inPoint)*Speed - myDelay; if (t >= 0){ freq; amp; decay; s = amp*Math.cos(freq*t*2*Math.PI)/Math.exp(decay*t); [s,s] }else{ value }- 1.3k
- 0
-
【AE表达式】3D图层朝向摄像机
丢3D图层的朝向(Orientation)属性 try{ L = thisComp.activeCamera; u = fromWorldVec(L.toWorldVec([1,0,0])); v = fromWorldVec(L.toWorldVec([0,1,0])); w = normalize(fromWorldVec(L.toWorldVec([0,0,1]))); sinb = clamp(w[0],-1,1); b = Math.asin(sinb); cosb = Math.cos(b); if (Math.abs(cosb) > .0005){ c = -Math.atan2(v[0],u[0]); a = -Math.atan2(w[1],w[2]); }else{ a = (sinb < 0 ? -1 : 1)*Math.atan2(u[1],v[1]); c = 0; } [radiansToDegrees(a),radiansToDegrees(b),radiansToDegrees(c)] }catch(err){ value }- 753
- 0
-
【AE表达式】减震与弹性
https://videolancer.net/damping 如何使用 放在K了帧的关键帧上 减震 amp = .04;// The higher the value, the greater the amplitude freq = 2;// The higher the value, the higher the frequency decay = 5;// The higher the value, the smaller the delay n = 0; if (numKeys > 0){ n = nearestKey(time).index; if (key(n).time > time){ n--; } } if (n == 0){ t = 0; }else{ t = time - key(n).time; } if (n > 0){ v = velocityAtTime(key(n).time - thisComp.frameDuration/10); value + v*amp*Math.sin(freq*t*2*Math.PI)/Math.exp(decay*t); }else{ value; } 弹性 e = .3; // Bouncing g = 1; // Gravity nMax = 10; // Maximum bounces n = 0; if (numKeys > 0){ n = nearestKey(time).index; if (key(n).time > time) n--; } if (n > 0){ t = time - key(n).time; v = -velocityAtTime(key(n).time - .001)*e; vl = length(v); if (value instanceof Array){ vu = (vl > 0) ? normalize(v) : [0,0,0]; }else{ vu = (v < 0) ? -1 : 1; } tCur = 0; segDur = 2*vl/(g*1000); tNext = segDur; nb = 1; // number of bounces while (tNext < t && nb <= nMax){ vl *= e; segDur *= e; tCur = tNext; tNext += segDur; nb++ } if(nb <= nMax){ delta =…- 1.6k
- 0
-
【AE表达式】路径自动定向
https://videolancer.net/auto-orient-along-path/ 与“变换 > 自动定向”差不多,但表达式可以调整旋转动画平滑度和自定义。 位置K帧,把表达式丢旋转里。 try{ cornerEase = 3; p = transform.position; t = Math.min(Math.max(time,p.key(1).time+.001),p.key(p.numKeys).time); pre = position.valueAtTime(t-thisComp.frameDuration*cornerEase); post = position.valueAtTime(t+thisComp.frameDuration*cornerEase); delta = post-pre; orient = radiansToDegrees(Math.atan2(delta[0],-delta[1])); value+orient+180 }catch(err){value}- 757
- 0
-
【AE表达式】逼真的反弹和过冲
http://motionscript.com/articles/bounce-and-overshoot.html 金鱼不反弹。 ——巴特·辛普森 有时您可能想用一些物理真实感来修饰动画动作。比如有一个图层从 0% 快速放大到 100%,并且想要添加一点过冲和振荡,最终稳定在 100%。另一个示例是,有一个对象落入地面中,希望它在触底时反弹一点。 这两个场景看起来相似,但它们代表了非常不同的物理过程。可以使用表达式创建这些模拟中的任何一个,但选择正确的模拟很重要。在本文中,我将详细介绍这些动画工具,并提供有关如何以及何时应用它们的一些提示。 反弹与过冲- 1.3k
- 0
-
【AE表达式】计算图层Alpha宽高(支持曲面)
使用表达式sampleImage()求出图层alpha的x,y的最小值和x,y的最大值。 使用方法 把表达式贴在一个文字图层的源文本上 把第一行的target = 后面连接你要计算的图层 原理 sampleImage()可以根据目标点的矩形范围,计算alpha(其实也能算RGB,这里只看Alpha) 这时候,把矩形范围改成1x1,如果返回false,说明这个像素点没有alpha 然后横竖逐像素遍历,把最大值最小值参与判断,完事 其他 难度没啥难度,就是这个表达式会很卡,建议1/4预览测试 可以用来根据alpha裁剪合成,具体请看脚本篇示例 源码 target = thisComp.layer("纯色图层1") var px = target.width/2; var py = target.height/2; var w = target.width; var h = target.height; var y_min = h; var y_max = 0; var x_min = w; var x_max = 0; for(var i=0;i<=h;i++){ var c = target.sampleImage([px,i],[px,0.5],true); if(c[3]>0){ y_min = (i<y_min) ? i : y_min; y_max = (i>y_max) ? i : y_max; } } for(var i=0;i<=w;i++){ var c = target.sampleImage([i,py],[0.5,py],true); if(c[3]>0){ x_min = (i<x_min) ? i : x_min; x_max = (i>x_max) ? i : x_max; } } x_min + "," + y_min + "," + x_max + "," + y_max; 参考文章 https://sites.google.com/site/annamillersclub/script-menu/gyakubikiscript/sampleimage- 243
- 0
-
【AE表达式】表达式值和原值切换
https://www.bilibili.com/video/BV1cf4y1c7Js/ function expressionFormula(){ return [0,0];} t = 0.2; mode = 1; if (thisLayer.marker.numKeys==0){value;} else{ n = thisLayer.marker.nearestKey(time).index; if(thisLayer.marker.key(n).time > time && n>1){n--;} markerTime = thisLayer.marker.key(n).time; markerDuration = thisLayer.marker.key(n).duration; expressionValue = expressionFormula(); if(mode == 0){ if(time>=markerTime && time<markerTime+markerDuration){expressionValue;} else value; } else if(mode == 1){ if(time>=markerTime && time<markerTime+markerDuration){ num = 0; t1 = markerTime+t; t2 = markerTime+markerDuration-t; if (time<t1){num = linear(time,markerTime,t1,0,1);} else if (time>=t2){num = linear(time,t2,markerTime+markerDuration,1,0);} else num = 1; //expressionValue*num+value*(1-num); ease(num,0,1,value,expressionValue); } else value; } }- 503
- 0
-
-
-
-
【AE表达式】圆形域动画
三个滑块分别控制影响因素、影响范围和紊乱程度。由于只是用作案例,里面关键帧部分、控制器部分都不算好用,有需求可以自行拓展、提升。 //大概的关键代码 seedRandom(index*20, timeless=true) v1 = thisProperty.key(1).value; v2 = thisProperty.key(2).value; p1 = thisLayer.transform.position.value; p2 = thisComp.layer("control").transform.position.value; influence = Math.sqrt(Math.pow((p2[0]-p1[0]),2)+Math.pow((p2[1]-p1[1]),2)); size = thisComp.layer("control").effect("size")(1); offset = thisComp.layer("control").effect("difference")(1); r = random(); var plusOrMinus = random()<0.5?-1:1; w = thisComp.layer("control").effect("wiggle/100")(1)/100; easeOut(size/2,influence-offset+r*offset*plusOrMinus*w,influence+offset+r*offset*plusOrMinus*w,v2,v1);- 696
- 0
-
【AE表达式】位移路径生成形状路径(反向跟踪路径)
finalPoint = []; frameDuration = thisComp.frameDuration; compDuration = thisComp.duration; chosenOne = thisComp.layer("the layer name which you want to choose").transform.position; for(i=0;i<=compDuration/frameDuration;i++) { middlePoint = chosenOne.valueAtTime(i*frameDuration); finalPoint.push(middlePoint); } createPath(points = finalPoint, inTangents = [], outTangents = [], isClosed = false);- 760
- 0
-
【AE表达式】重复文字 repeat
本来的文字:HI (后面有个空格) 一、复制横向 src=text.sourceText src.repeat(5) 二、复制纵向 src=text.sourceText trg = src.repeat(5)+'\n' trg.repeat(4) 其他自己玩一玩就好- 834
- 0
-
【AE表达式】通过hsl模式精确控制颜色随机范围
//首先需要创建5个滑块,如图1所示 h = effect(1)(1); s = effect(2)(1); l = effect(3)(1); freq = effect(4)(1); seed = effect(5)(1); //从名字可以看出,这5个滑块对应hsl、频率和随机种子 seedRandom(seed,true); //分别给hsl三个属性一个wiggle来随机 H = wiggle(freq,h)[1]; S = wiggle(freq,s)[1]; L = wiggle(freq,l)[1]; //通过调控随机种子,来使这个随机值增加或减少 var plusOrMinus1 = random()<0.5?-1:1; var plusOrMinus2 = random()<0.5?-1:1; //原颜色先从rgb模式改成hsl模式 hsl = rgbToHsl(value); //在hsl模式中加上随机值后转换回rgb模式 hslToRgb(hsl + [H/360*plusOrMinus1,S/100*plusOrMinus2,-L/200,1]) //滑块h∈[0,360] 滑块s∈[0,100] 滑块l∈[0,100]- 718
- 0
-
-
【AE表达式】鹤梦离弦 - 模块化思路中的“时间”(1)
在文章之前,先想给我自己引引流,鹤梦的学习屋和月离离的万事屋已经达成合作,之后可能会在两边的地盘都找得到我们俩,鹤梦的学习屋群号是:963669024,进群密码就是我自己的昵称 鹤梦离弦。 大家好我是鹤梦,今天我将讲述一些表达式使用中有关“时间”的技巧,主要想拓展小伙伴们使用表达式时模块化的思路。 在表达式中,有许多属性都能记录时间,如入点、出点、关键帧、标记等等。这些“时间”可以用来便捷修改动画,无论是自己做工程时想模板化便于自己修改,还是制作模板流通发售的情况下。 1.实现在图层入点处使图层渐显,在出点处渐隐。(入点和出点) 这样完全不用打开属性打关键帧了,目的是实现多时长需求下的快速更改。 inT = thisLayer.inPoint;//inTime的意思,不想变量太长 outT = thisLayer.outPoint;//outTime的意思,不想变量太长 d = effect(duration)(1);//动画时长 t = time; if(t<inT+d){linear(t,inT,inT+d,0,100);}//在入点后对应时长内,映射渐显线性动画 else if(time>outT-d){linear(t,outT-d,outT,100,0);}//在出点前点对应时长内,映射渐显线性动画 else {100;} 拓展:这里的linear完全可以换成easeIn和easeOut,假如在属性上使用缓动的映射,动画会更加柔和。熟练使用入点和出点可以快速制作可调节的进出场动画。 2.实现在标记处让图层旋转停止。(标记) 用标记代替关键帧调节,目的是实现无关键帧自适应动画。 t = time; sp = effect(Speed)(ADBE Slider Control-0001); t * sp; /*这里是Rotation滑块代码,目的是存储正常旋转的数据,不被后面缓慢停止所影响*/ t = time; sp = effect(Speed)(ADBE Slider Control-0001); k1 = thisLayer.marker.key(1).time;//停止开始时间 k2 = thisLayer.marker.key(2).time;//完全停止时间 duration = k2 - k1//持续时间 ev = effect(Rotation)(ADBE Slider Control-0001).valueAtTime(k1);//数值进行了接替,从旋转滑块转到旋转属性 if (t <= k1){effect(Rotation)(ADBE Slider Control-0001);}//正常旋转 else if(t >= k2){ev+duration*sp;}//完全停止的数值固定下来 else{easeOut(t,k1,k2,ev,ev+duration*sp);}//缓出 /*这里是旋转属性的表达式*/ 3.实现在关键帧变化的同时进行缩放(关键帧) 用关键帧的时间来作为动画依据,目的是快速联动多属性动画。 x1 = value;//变动前数值 x2 = value*2;//变动后数值 t = time; m = effect(num)(1);//要打关键帧的效果 if(m.numKeys<=1){value;} else { n = m.nearestKey(time).index; //用n来遍历帧间区域 if(m.key(n).time>time) {n--;} if(n > 0) { t1 = m.key(n).time; if(n+1 <= m.numKeys) {t2 = m.key(n+1).time; if(m.key(n).value !=m.key(n+1).value) { if(t<(t1+t2)/2) {ease(t,t1,(t1+t2)/2,x1,x2);} else {ease(t,(t1+t2)/2,t2,x2,x1); if(m.key(n).value ==m.key(n+1).value){x1;} } else {value;} } } 拓展:这样进行数值联动处理,在很多方面对于模板化的思路有很大帮助,中间的缩放其实是用于举例。实际比如细菌分化分次进行,或者是小车急停移动,以及卡拉OK样式这种规律性变化的动画,这种思路将会起到很大的作用。 4.卡拉OK字幕实现(综合案例) 综合案例可能无法贴出全部的表达式,因为相对层级就比较多,但是关键的思路还是会在底下贴出来。一下就是我做的实例了,还挺对味的。 w = thisComp.layer(odd change).sourceRectAtTime().width; h = thisComp.layer(odd change).sourceRectAtTime().height; x1 = thisComp.layer(odd change).transform.position[0] - w-0.5*w; x2 = thisComp.layer(odd change).transform.position[0] - 0.5*w; t = time; m = thisComp.layer(market); n = 0; if(m.marker.numKeys>0) {n = m.marker.nearestKey(time).index; if(m.marker.key(n).time>time) n--; } if(n > 0) { t1 = m.marker.key(n).time; if(n+1 <= m.marker.numKeys) t2 = m.marker.key(n+1).time; else {t2 = m.outPoint;} if(n%2 !=0){linear(t,t1,t2,x1,x2);} if(n%2 ==0){x2;} } /*这一段是偶数标记的代码,将它的蒙版按照奇偶来做擦除或是悬停*/ 在前三个案例之后相信小伙伴可以研究出综合案例的内核,而且能触类旁通这一类有关“时间”的表达式模板化思路。 那么最后就是总结啦,模块化思路中的“时间”可以实现一些特定时间点的打包动画,无论是调整入点出点、标记或是滑块,都能快速更改现成的动画样式。希望大家读了文章有所收获,之后还会和小伙伴们分享一些其他自己表达式的心得,那么我们就下次再见吧。- 1.2k
- 0
❯
Profile
Check-in
Search
Customer service
Scan to open current page
Top
Checking in, please wait...
Click for today's check-in bonus!
You have earned {{mission.data.mission.credit}} points today
My Coupons
-
¥CouponsLimitation of use:Expired and UnavailableLimitation of use:
before
Limitation of use:Permanently validCoupon ID:×Available for the following products: Available for the following products categories: Unrestricted use:Available for all products and product types
No coupons available!
Unverify
Daily tasks completed