After Effects Expressions - 使用“表达式层”从主组件控制组件

问题描述 投票:0回答:2

我想要达到的目标:

使用一个表达层控制 AE 时间线(很像使用 Actionscript)来触发卡通动画中经常使用的合成,例如眨眼、行走、飞行等……。

Beau Bird - The Character I want to blink.

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

理想情况下:我想在main comp中创建一个“Expressions layer”到TRIGGER其他comps来玩。在某些时候,我想添加触发器来调用经常使用的组件,这些组件包含诸如……闪烁、行走、飞行、向左和向右看等动作……

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

为什么要这样做? 为什么不在每次需要这样的动作时将伴奏粘贴到您想要播放的位置?那么在 After Effects 中,如果您希望“眨眼合成”在两分钟内播放 40 次,您将必须创建 40 个图层,或者将关键帧粘贴到该合成上 40 次。当您想从one expressions layer 触发或调用它时,从一层触发或调用它不是很棒吗?

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

感谢大家的投稿! :)

adobe expression after-effects
2个回答
0
投票

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

这不可能。

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

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

我们只能希望 Adobe 有一天能像他们对动作脚本所做的那样赋予表达能力。

希望很快!任何阅读本文的 Adobe 工作人员请为我们辩护。谢谢


0
投票

第 1 部分:在 pre-Comps 中参考其他层

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

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

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

更深入的答案: Adobe's Docs - Skip to the Layer Sub-objects part

据我了解 Adobe 文档,只能访问图层, 不是镜头。这意味着您需要创建您的 使用 pre-Comp 的表达式链接。素材不能访问这个所以 这也意味着没有空值、调整层等。

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

第 2 部分:基于预合成中的其他层开始/结束

关于下一部分你想要基于其他成分激活表达式,我建议使用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)
© www.soinside.com 2019 - 2024. All rights reserved.