解析AE父子階層下的屬性與動態
在 Adobe After Effects 的動態設計中,「父子階層(Parenting)」是建立物件關聯最快的方式。然而,預設的繼承關係有時會限制創作——例如我們希望子層跟隨移動,卻不希望它跟著變形。
本文將解析三段實用的表達式,幫助你打破預設限制,掌握更高級的動態控制技巧。
抵消父層縮放(Counter-Scale)
應用場景:
當父層放大時,子層會被迫跟著放大。使用此腳本可以讓子層在視覺上永遠保持原始比例。
s = [];
ps = parent.transform.scale.value;
for (i = 0; i < ps.length; i++){
s[i] = value[i] * 100 / ps[i];
}
s
設定Scale縮放來抵銷父物件縮放
透過迴圈計算「補償率」:如果父層放大為 200%,子層則自動縮小為 50%(
100/200)。結果: 無論父層如何縮放,子層的大小在畫面上始終維持不變。
縮放驅動的非線性關聯
應用場景: 讓「縮放」屬性去影響「旋轉」或其他屬性,並透過數學運算強化動態的層次感。
2. 非線性加權(進階版)
p = parent.transform.scale[0] / 100;
f = Math.pow(p, 1.7);
value + parent.transform.rotation * f;
解析: 這裡使用了
Math.pow(p, 1.7)。這是一個指數函數,會讓「縮放」對「旋轉」的影響力呈現「非線性」增長。結果: 父層放大時,子層產生的旋轉偏移會比線性增加得更快,適合製作具有誇張感、物理加速度感的動態。
1. 線性關聯
p = parent.transform.scale[0] / 100;
f = Math.pow(p, 1); value * f;
此段將父層的 X 軸縮放轉換為一個係數。當父層為 100% 時,係數為 1;當父層為 200% 時,子層數值翻倍。
應用在縮放及位移
應用在旋轉
Displacement
Zoom
Rotate
時間延遲跟隨(Temporal Delay)
應用場景: 製作如擺錘、尾巴或軟體的動態感。
delay = -0.3; // 延遲時間(秒)
if (!parent){
value;
} else {
pNow = parent.transform.rotation;
pDelay = parent.transform.rotation.valueAtTime(time - delay);
value + (pDelay - pNow);
}
解析: * 腳本會去抓取父層「現在」與「過去某個時間點」的數值差異。
valueAtTime是 AE 表達式中最強大的函數之一,它讓物件能「讀取過去」。
進階觀念:.rotation 與 .scale.value 有什麼區別?
在撰寫表達式時,理解這兩者的差異能避免報錯:
1.parent.transform.rotation (屬性對象):
這指向的是整個「旋轉屬性」。
優點: 它可以接續方法,例如
.valueAtTime()或.velocity。用法: 當你需要計算「時間偏移」或「速度」時使用。
2.parent.transform.scale.value (數值結果):
這指向的是該屬性在當前時間點產出的「具體數字」或「陣列」。
優點: 它直接是一個數學數值。
用法: 當你需要進行加減乘除數學運算時,加上
.value能確保你操作的是數字而非屬性對象。
parent.transform.scale.value
parent.transform.rotation