尝试解决获取存在父子级的对象的绝对坐标时候,参考了一下rubberHose,查了一下生成图层里面的表达式,先做笔记。
三元表达式、try catch、propertyIndex的使用、toComp()的解析以及使用
三元表达式:
条件?a:b; 等于 if(条件){a;}else{b;}
在JavaScript三元表达式中使用try/catch语句
true ? (function(){try{alert(1)}catch(e){}})() : (function(){try{alert(2)}catch(e){}})()
try catch:
try { //在这里运行代码 } catch(err) { //在这里处理错误 }
via:https://www.w3school.com.cn/js/js_errors.asp
其中部分旋转属性的表达式加了密,在线解密一下发现用数组来存各种控制器名称很方便。
解密工具:https://tool.lu/js/
propertyIndex和propertyGroup(index)的使用:
var p = thisProperty.propertyIndex;
var grp = thisProperty.propertyGroup(1).propertyIndex;
content("Admin").content("ArcMath").content(grp)(p);
在形状图层下构造好一个形状,其他形状下的属性结构相同,通过propertyIndex进行属性值引用。
相当于结构样式分离,在样式(style)中可随意打组,不会因为属性组层级增加而产生错误;而结构(admin)中不包含需要编辑修改的属性(线粗以及颜色等),只包含产生多边形的表达式,因此不能进行修改(打组或者调整顺序)。
解密后内径中的一段:
var lyrSplit = ::;
var grpSplit = ::;
var par = thisComp[pixelAspect];
var n = thisLayer[name];
var ctrlName = thisLayer(ADBE Root Vectors Group)(Admin)(ADBE Vectors Group)(2)[name][split](grpSplit);
var ctrl = thisComp[layer](n + lyrSplit + ctrlName[2]);
var a = thisComp[layer](n + lyrSplit + ctrlName[1])[toComp]([0, 0, 0]);
var b = thisComp[layer](n + lyrSplit + ctrlName[2])[toComp]([0, 0, 0]);
其中“thisComp[layer](n + lyrSplit + ctrlName[1])[toComp]([0, 0, 0]);”就是要找的“获取存在父子级的对象的绝对坐标”。
简化后为 layer.toComp([0,0]);
toComp()在官方文档中的表述是:
toComp(point, t=time)
返回类型:数组 [2 或 3]。
参数类型:point 是数组 [2 或 3],t是数值。
将点从图层空间变换到合成空间。
https://helpx.adobe.com/cn/after-effects/using/expression-language-reference.html#layer_space_transforms_methods_expression_reference
换而言之,layer.toComp(point, t=time);就是:
把layer上的某个点(point),投影到合成上,然后以合成上左上角为原点[0,0],获取该点相对于合成原点的绝对坐标。(假如省略layer则默认为thisLayer)
由于layer的锚点或者位置的变化(位移动画以及父子级等),layer上的point的相对坐标不一定等于该点在合成上的绝对坐标。
p=layer.toComp([0,0]);获取的是layer上左上角的点(因为多数情况锚点为[0,0])
而需要获取某图层绑定父子级后锚点的绝对坐标则为:
P=layer.toComp(layer.transform.anchorPoint);
当layer锚点为[0,0]时, p等于P等于layer.transform.position;
当layer锚点不为[0,0]时, p等于layer.transform.position-layer.transform.anchorPoint(锚点增加的量,等于图形向左向上偏移的量,等于图层[0,0]点减少的量),P等于layer.transform.position;
外径里面是这个:
O = "isComp.ctrlNaSplitayer=thmel(n+lyr+[Math.0,0ct=::,rs GroisLvar (A])Veoupomp([oC,0DBE par)[0]*=;.tngth.na".split('');
Q = "try{lyrgrppixelAspe,n!,ZRoot dminZ(2)!.split(grp),rl2,a1,b2;abeff=rl(4)(1),len=eff(Hose Le,s=le(a,b); sin( PI/4)*s}catch(err){width* SQRT2/4};";
o = " Z!";
for (J = 27; J > -1; J--) {
Q = Q.split(o.charAt(J)).join(O[J]);
}
eval(Q.replace(//g, '"'));
把eval换成document.write后放到html里面得到下面这段东西:
try {
var lyrSplit = "::",
grpSplit = "::",
par = thisComp.pixelAspect,
n = thisLayer.name,
ctrlName = thisLayer("ADBE Root Vectors Group")("Admin")("ADBE Vectors Group")(2).name.split(grpSplit),
ctrl = thisComp.layer(n + lyrSplit + ctrlName[2]),
a = thisComp.layer(n + lyrSplit + ctrlName[1]).toComp([0, 0, 0]),
b = thisComp.layer(n + lyrSplit + ctrlName[2]).toComp([0, 0, 0]);
a[0] *= par;
b[0] *= par;
var eff = ctrl(4)(1),
len = eff("Hose Length"),
s = length(a, b);
Math.sin(Math.PI / 4) * s;
} catch (err) {
width * Math.SQRT2 / 4
};
© leizingjiu | Powered by LOFTER