
動畫設計中,我們常會遇到這樣的情境,當一個物件靠近某個控制點時,要讓它自動被推開或吸引過去,就像磁鐵、引力場、能量波動、彈力膠條的那種動態互動感。
這類互動式動畫效果,在 After Effects 中其實可以透過一段簡單的表達式來實現。
設計動畫時,我們常會希望畫面中的物件根據彼此的距離產生變化,例如:
- 元素靠近中心時自動放大、變亮
- 粒子靠近控制點時被彈開或吸附
- UI 圖形滑過時才顯示、縮放、變清晰
📌 什麼是「近距離反應」Proximity-based Animation?
「近距離反應」指的是:當一個圖層與某個參考點(通常是 null 控制器)的距離越近,就越強烈地觸發動畫效果;距離越遠,效果就越微弱,甚至完全沒有。
它模擬了物理世界中的磁力場、重力吸引、光源衰退等概念,讓畫面更有動態互動感與空間層次。
這種根據距離觸發變化的設計,在 After Effects 中稱之為:
近距離反應(Proximity-based Animation)

一、你需要 3 個圖層:
Null
1 命名(null)
控制移動它來影響其他圖層Null
2 命名(controller)
放置滑桿控制器( Slider Control)Shape Layer 影響的物件
任意圖層(文字、圖形、影像)
二、加上控制器( Slider Control)
- 選擇
controller
圖層 - 點選功能列:Effect → Expression Controls → Slider Control
- 加兩個滑桿並命名:
- 第一個命名為
distance
- 第二個命名為
strength
三、套用表達式
- 選取你要加推擠效果的物件圖層
- 按
P
展開 Position 屬性 - 按住
Alt(Win)或 Option(Mac)
點一下 Position - 貼上以下完整表達式:
nullPos = thisComp.layer("null").transform.position; //控制圖層的位置
objPos = transform.position;
maxDist = thisComp.layer("controller").effect("distance")("Slider"); //最大影響距離
strength = thisComp.layer("controller").effect("strength")("Slider"); //影響強度
dist = length(nullPos, objPos);
dir = normalize(objPos - nullPos);// 向 null 推開
moveAmount = strength * (1 - clamp(dist / maxDist, 0, 1));//計算要移動多少距離
newPos = objPos + dir * moveAmount;
newPos;

四、測試效果!
- 移動
null
圖層靠近物件 - 你會發現物件是否被推出去
- 調整
controller
上的滑桿數值

distance
:越大,影響範圍越廣
strength
:越大,推開力越強
📌 概念簡單說明:
這個表達式主要在做的是:
- 計算「目標物件(例如你當前圖層)」與一個 NULL 控制點 之間的距離,
- 然後根據這個距離,去 推動或拉動這個物件的位置。
- 拉力的強度與距離有關:越近 → 拉力越強;越遠 → 拉力越弱,直到超出最大距離就沒影響。
🎯表達式延伸應用有哪些

- 把推開效果改成吸引效果只需要把這一行:{
dir = normalize(objPos - nullPos);}
改成:{dir = normalize(nullPos - objPos);}
- 或是直接變更
controller
圖層中的Slider Control控制器
nullPos = thisComp.layer("null").transform.position; //控制圖層的位置
objPos = transform.position;
maxDist = thisComp.layer("controller").effect("distance")("Slider"); //最大影響距離
strength = thisComp.layer("controller").effect("strength")("Slider"); //影響強度
dist = length(nullPos, objPos);
dir = normalize(nullPos - objPos); // 向 null 吸過去
moveAmount = strength * (1 - clamp(dist / maxDist, 0, 1));//計算要移動多少距離
newPos = objPos + dir * moveAmount;
newPos;
【Opacity】逐漸透明
添加在Shape Layer 圖籌中的Opacity(Alt+T
)

nullPos = thisComp.layer("null").transform.position;
objPos = transform.position;
maxDist = thisComp.layer("controller").effect("distance")("Slider");
dist = length(nullPos, objPos);
normDist = clamp(dist / maxDist, 0, 1);
linear(normDist, 0, 1, 100, 10); // 距離越遠越透明
【Scale】逐漸縮小
添加在Shape Layer 圖籌中的Scale(Alt+s
)

nullPos = thisComp.layer("null").transform.position;
objPos = transform.position;
maxDist = thisComp.layer("controller").effect("distance")("Slider");
dist = length(nullPos, objPos);
normDist = clamp(dist / maxDist, 0, 1);
baseScale = 150;// 最近數直
minScale = 20; // 最遠數直
s = linear(normDist, 0, 1, baseScale, minScale);
[s, s];
原始貼文教學:https://www.jan1lab.com/blog/proximity-animation
「近距離反應」是一種簡單卻非常實用的動畫邏輯,在 After Effects 中結合 length()
、clamp()
、linear()
後,就能讓畫面元素根據彼此的距離自然變化,打造出有深度、有互動的動畫體驗。
不論是 UI 動效、角色動畫還是抽象視覺,都能用這個技巧快速提升表現力。