0

我想要达到的目标:

使用 ONE EXPRESSION LAYER(很像使用 Actionscript )控制 AE 时间线,以触发卡通动画中常用的组合,例如眨眼、行走、飞行等。

Beau Bird - 我想眨眼的角色。

我想要动画卡通人物的闪烁。(以及其他动作,如下所述)我不想在每次想要眨眼或特定动作时“重新发布”合成或关键帧动作,而是想创建一个脚本,我可以在其中触发眨眼合成播放。这可能吗?(旁注:在整部电影中随机闪烁会很好)但我仍然想知道如何做到这一点,原因如下。

理想情况下:我想在主组合中创建一个“表达式层”来触发其他组合来播放。在某些时候,我想添加触发器来调用包含诸如闪烁、行走、飞行、左看和右看等动作的常用组合。

如果我们能以某种方式触发其他组合开始、重复、停止,甚至可能是反转,并使用表达式层从一个主组合完成这一切,那将是惊人的。

为什么这样做? 为什么不在每次想要执行此类操作时将组合粘贴到您希望它播放的位置?如果你想要一个“blink comp”在两分钟内播放 40 次,那么在后期效果中,你必须创建 40 个图层,或者在那个 comp 上拍下关键帧 40 次。当您想要从一个表达式层触发或调用它时,从一层触发或调用它不是很棒吗?

我们一直在使用 Actionscript 在 Flash 中做类似的事情。如果有一种方法可以实现这种效果,那就太棒了。这将是一个出色的教程,我相信如果有人这样做它会非常受欢迎。它可以用于多种惊人的效果,并且可以为每个人节省大量时间。哎呀,帮我解决这个问题,也许我会做一个教程。

感谢所有投稿的“溢出堆”!:)

4

2 回答 2

0

我找到了答案,那就是……

这是不可能的。

After Effects 表达式无法控制其他时间线。不幸的是,您必须在要影响的每一层上放置一个表达式。

可以在此链接上找到下一个最佳解决方案,并实现接近我所要求的内容:motionscript.com/design-guide/marker-sync.html

我们只能希望 Adob​​e 有朝一日能够像他们对动作脚本所做的那样赋予表达能力。

希望不久!任何为 Adob​​e 工作的阅读本文的人请为我们辩护。谢谢

于 2012-12-12T22:56:05.967 回答
0

第 1 部分:在 pre-Comps 中引用其他层

只需将 "thisComp" 替换为 "comp("ComName")"

要在合成之间引用效果控制器,请遵循以下公式:

comp("ComName").layer("LayerWithExpression").effect("EffectControlerName")("EffectControllerType")
    

更深入的回答: Adobe's Docs - Skip to the Layer Sub-objects 部分

据我了解 Adob​​e 文档,只能访问图层,不能访问素材。这意味着您将需要使用 pre-Comp 创建您的表达式链接。素材无法访问它,这也意味着没有空值、调整图层等。

作为额外的奖励,如果您使用基本图形面板,您可以将所有控制器放在一个预组合中,但无论您在哪个组合中都可以使用控件。只需在基本图形下拉列表中选择它。

第 2 部分:基于 pre-comps 中的其他层的开始/结束

关于您希望表达式根据其他构图激活的下一部分,我建议使用 in-out Point 表达式。

入点 | 返回类型:数字。返回图层的入点,以秒为单位。出点 | 返回类型:数字。返回图层的出点,以秒为单位。

如果您使用开始时间覆盖,您可以从以下位置获取:

开始时间 | 返回类型:数字。返回图层的开始时间,以秒为单位。

替代选项: 我建议避免这种情况,因为关键帧基本上是作为索引引用的,所以如果你在已经使用的关键帧之前添加一个,事情可能会变得一团糟——def 包含一些错误处理。

参考Key属性和方法(表达式参考)这里

第 3 部分:插值和时间反转 您可以在右键单击 -> 时间中对图层进行时间反转,否则这就是所有插值表达式,如循环输出等 - 如果您不仅正确剪切它,您还可以 loopOut("FOO") 预合成,还可以启用时间重映射。

然后用它来循环那些关键帧;

try{ timeStart = thisProperty.key(1).time; duration = thisProperty.key(thisProperty.numKeys).time-timeStart; pingPong =
false; //change to true value if you want to loop animationn back &
forth  quant=Math.floor((time-timeStart)/duration);

if(quant<0) quant = 0
    

if(quant%2 == 1 && pingPong == true){   
t = 2*timeStart+ (quant+1)*duration - time;
}
else{
  t = time-quant*duration;
}
}
catch(err){
  t = time;
}


thisProperty.valueAtTime(t)
于 2020-12-21T20:33:37.153 回答