【AE表达式笔记】 rubberHose笔记(toComp()/propertyIndex()等)

尝试解决获取存在父子级的对象的绝对坐标时候,参考了一下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

};




评论
热度 ( 5 )

© leizingjiu | Powered by LOFTER