
Idea
単純な近接検出器が必要なだけだと仮定しましょう。別のレイヤーが一定の距離内に入ってきたときに、レイヤーの色を変えたいとします。これは、2つのレイヤーの目に見えるピクセルが重なっているかどうかを知りたい衝突検出器ほどの精度は必要ありません。
Design
ここで行うべきことは、現在アクティブな他のビデオコンテンツを持つレイヤーそれぞれを調べ、いずれかが近接条件をトリガーするのに十分近いかどうかを確認するループを作成することです。この場合、レイヤーが別のレイヤーに近づいたときに色を変えるだけにします。これは、Fill エフェクトの Color パラメーター用のエクスプレッションを作成することで実現します。
この場合、丸い形状を使えば、2つのレイヤー間の距離を近接条件として使うため、私たちのセットアップは衝突検出器に近いものになります。これは、2つのレイヤーの幅の合計の半分になります。
この場合、丸い形状を使えば、2つのレイヤー間の距離を近接条件として使うため、私たちのセットアップは衝突検出器に近いものになります。これは、2つのレイヤーの幅の合計の半分になります。
Note #1;元のエクスプレッションは Dan Ebberts によって作成されました。しかし、このメールのために調査していたところ、幅の計算が正しく機能しませんでした。計算を次のように修正しました:
(layer1.sourceRectAtTime(time, false).width + layer2.sourceRectAtTime(time, false).width)/2;
Note #2:こう思うかもしれません:“OK、でもそれらはすぐ隣り合っている。もし離れていたら?”。いい質問です!
それらの間の最小距離と実際の距離を計算する必要があります。それらを比較すれば、近いかどうかがわかります。
Note #3:効率のため、近接条件を満たすレイヤーを1つ見つけたらすぐにループから抜けたいと思います。
このコードを color プロパティにコピーします:
out =[1, 1, 0, 1];
for (i = 1; i <= thisComp.numLayers; i++){
if (i == index) continue; L = thisComp.layer(i);
if (! (L.active && L.hasVideo)) continue;
delta = (thisLayer.sourceRectAtTime(time, false).width +
L.sourceRectAtTime(time, false).width)/2;
if (length(position, L.position) <= delta){
out = [1, 0.25, 0, 1];
break;
}
}
out
Pro tip:エクスプレッションでは、
色は [red, green, blue, alpha] の形式の
4要素の配列として表現され、
各値は0から1の間の数値になることを
覚えておいてください。例えば [1, 1, 0, 1] は
明るい黄色を表します。
Analysis

Source https://motionscript.com/design-guide/proximity.html
Pro tip:AEJuice Pack Manager – Expressions Pack に移動すると、このエクスプレッションを1クリックで適用できます。最新のプラグインバージョンへの直接リンクはこちらです:
