脚本分析01-移动锚点工具(函数篇)

By 九月 2, 2017 After Effects, 脚本预设

承接脚本分析01-移动锚点工具(UI篇),脚本下载也在那个帖子里。


函数篇

脚本使用一个 moveAnchor(<em>row, col, ignoreMasks, custX, custY</em>) 函数来进行移动锚点操作,内部包含了各种情况。

  • row,col:这是在回调函数直接给出的参数,不同数字代表着不用的情况,要解释的是这些数字并不是函数的什么固定值,而是由作者直接抉择,获得到是1怎样怎样,获取到2怎样怎样。
  • ignoreMasks:对应着忽略蒙版复选框。
  • custX,custY:用于自定义锚点位置。

函数内部代码注释比较清楚,就不一一分析了,直接下载脚本看就可以了,一些方法函数直接参照AE脚本设计参考手册

主要记录一下一些比较费神的地方,代码行参照的是脚本源代码。


一开始都是先准备了些变量。

117行检查了一下图层是否是摄像机图层,摄像机图层没有锚点这一说,自然也就不能移动锚点了。

154行开始对没有蒙版的条件下为x,y赋值。

这个x,y是锚点的值,也就是锚点相对于图层左上角原点的位置。

当然左上角原点只适用于固态层或媒体图层,文本图层和形状图层锚点原点则是在图层左下角和中心位置。所以在190行对文本和形状图层单独做了处理。

Layer.sourceRectAtTime() 这个函数会返回一个对象,含有四个属性top,left,width,height。width和height指的就是层的宽高,这个理解起来很简单,不过作用在固态层还是形状层还是有区别。

固态层中比较简单,就是固态层的宽高。

形状层因为有内容的存在,在只有一个内容,也就是只有一个形状的时候,宽高也是该形状的宽高,但是一个形状图层有不止一个形状时,这个数值就变了。

取多个形状图层最外边构成一个矩形,此时width和height的属性值为这个矩形的宽高。

而top和left这两个属性则是专门针对形状图层和文字图层用的,让形状图层和文字图层的锚点计算方式转换为固态层的方式。

它们的数值是锚点原点距离图层(形状图层如上面那个图,文字图层同理)左上角的距离。

在固态层中,锚点原点就在图层的左上角,所以这两个属性用在固态层或素材图层时,属性值总为0。

但是在形状图层或文本图层,锚点原点不在图层左上角时,这个属性值就很有用了。

所以在190行,让x,y值加上了这两个数值,对于固态层添加的数值为0,对于形状层添加的则是锚点中心距图层左上角的距离,这样就实现了不同类型图层的锚点计算方式一样了。唔…其实也不能说是计算方式相同吧,就是解决了一个形状层锚点的问题。

194行的 else 开始,以含有蒙版的情况来计算锚点位置,这是最复杂的情况,也是默认的情况。

201行到215行构建了一个数组,包含了该图层内所有蒙版顶点的位置。

217行到224行将数组按数值从低到高排序,并分别取出x,y的最大值(high)和最小值(low)。

这其中所有的数组对象方法都可以在网上搜索到,这里就不细说了。

229行到239行,对是否依照蒙版顶点位置来计算做出一个分析。因为有可能有下面这种情况。

在形状图层和文本图层中,如果有蒙版,蒙版也可见,但是蒙版顶点大于图层,将图层包括进去了,这时候使用蒙版的最小值最大值来计算锚点显然就不合适了,还是需要使用固态层本身来计算,这段代码正是做这个判断用的。

对于固态层之类的蒙版没有做这个判断,所以即便蒙版大于固态层,仍然会按着蒙版来计算。

下面是代码:

形状层的蒙版顶点也是相对于图层中心点为原点进行计算的。

xl2为图层的锚点到图层左上角的x值,yl2为y值。在这里为各个形状边界所形成的矩形的最左端和最上端。

xh2的计算就是用图层宽度加上锚点到图层左上角的x值,这个值为负值,实际上也就是图层宽度减去锚点到图层左上角x的值,计算结果就是锚点到合成最右端的距离。yh2则为最底端。这些都是以锚点为中心进行计算的。

275行之前都是计算得到最终锚点要移动的值,现在开始就对锚点进行移动操作了。

如果直接移动锚点,在AE锚点和位置梳理中说过,图层的位置参数不变,但是图层显示的位置会发生变化。

所以在移动锚地时候要对图层位置属性参数赋值,让其恢复到移动锚点之前的位置状态。不过如果锚点有关键帧就不会对图层位置进行修复了。所以先对锚点进行判定有么有关键帧。要注意的一点是就算你的关键帧并没有改变参数值,但是只要存在关键帧就会当做有关键帧的情况处理。

279行的 else 之后,全是对没有锚点关键帧情况下的锚点移动的处理,也是脚本中最后一段代码了。

要移动的位置距离也就是锚点移动的距离相反数。行285、286就是依照这个算法计算的,但是考虑进去了缩放的情况。

基本的代码分析就到这了,316行的注释的翻译原文是:

我没理解这段注释是要说明什么。如果锚点有关键帧?可是这段在 else 内部的代码就是在锚点不包含关键帧情况的算法啊。

所以这段注释就直接忽略吧,倒不影响下面逻辑代码的理解 。

(完)

发表回复

让技术与审美并行