3Dレイヤーと実際のカメラをワールド座標へ変換し、距離に応じて不透明度や明るさを変えます。
位置の親子関係が違うレイヤー同士でも、同じ座標系で距離を求めます。
最終調査日:2026年10月3日。
数値・参照範囲・構文をローカルで確認しています。
今回AE本体のカメラ描画、色収差合成、音声再生、Undoは確認していません。
距離で不透明度を変える
練習コンポへ明示的なカメラと3Dの平面またはテキストを作ります。
対象レイヤーの不透明度を60%にし、その不透明度へ次の式を貼ります。
式を開く操作はストップウォッチのAltクリック(MacはOptionクリック)です。
位置やソーステキストへは貼りません。
var startDistance = 500;
var endDistance = 1500;
var result = value;
var camera = thisComp.activeCamera;
if (camera && endDistance > startDistance) {
var d = length(thisLayer.toWorld(anchorPoint), camera.toWorld([0, 0, 0]));
result = value * linear(d, startDistance, endDistance, 1, 0);
}
result;
| 入力・条件 | 期待する結果 | 確認点 |
|---|---|---|
| 距離500以下/元の不透明度60 | 60% | 減衰開始まで元の値 |
| 距離1000 | 30% | 開始500と終了1500の中間 |
| 距離1500以上 | 0% | 終了距離で透明 |
| 明示的なカメラなし | 元の不透明度 | 既定カメラを推測しない |
距離は対象のアンカーポイントとカメラのワールド位置の間で測ります。
画面上の見かけの距離や、制御ヌルまでの距離ではありません。
数値を照合する場合は、親のないカメラを[0,0,0]、対象を[0,0,500]・[0,0,1000]・[0,0,1500]へ置き、計算された不透明度を見ます。
画面内の構図の確認とは分けて試します。
明るさへ減少量を加える
対象へ「輝度&コントラスト」を追加し、「輝度」を0にして次の式を貼ります。
maxReduction=50では距離1000で−25、1500以上で−50を元の輝度へ加えます。
var startDistance = 500;
var endDistance = 1500;
var maxReduction = 50;
var result = value;
var camera = thisComp.activeCamera;
if (camera && endDistance > startDistance && maxReduction >= 0) {
var d = length(thisLayer.toWorld(anchorPoint), camera.toWorld([0, 0, 0]));
result = value - linear(d, startDistance, endDistance, 0, maxReduction);
}
result;
貼付先は「輝度」です。
コントラストの低下は別の変化なので、明るさの式を同じ結果としてコントラストへ流用しません。
元の輝度が低い場合はさらに下がるため、エフェクトの入力範囲と実際の見た目を確認してmaxReductionを調整します。
endDistanceはstartDistanceより大きくします。
4つのターゲットへカメラ制御を移動する
3Dヌルを5枚作り、制御用をcamControl、独立したターゲットをTarget0・Target1・Target2・Target3とします。
camControl自身をターゲットに指定しません。
camControlへレイヤー制御を4つ追加し、エフェクト名をTarget-0〜Target-3にして対応するターゲットを指定します。
スライダー制御をtargetControl、チェックボックス制御をeaseという名前で追加します。
camControlの位置へ次の式を貼ります。
分割次元のX位置へは貼らず、3要素の位置へ貼ります。
var cc = effect("targetControl")(1).value;
var result = value;
if (isFinite(cc)) {
cc = Math.max(0, Math.min(3, cc));
var n = Math.min(2, Math.floor(cc));
var a = effect("Target-" + n)(1);
var b = effect("Target-" + (n + 1))(1);
var start = a.toWorld(a.anchorPoint);
var end = b.toWorld(b.anchorPoint);
var world = effect("ease")(1).value == 1 ?
ease(cc, n, n + 1, start, end) : linear(cc, n, n + 1, start, end);
result = hasParent ? parent.fromWorld(world) : world;
}
result;
targetControlは0〜3で、1.5はTarget1とTarget2の中間です。
範囲外の数値は0か3へ制限し、3でもTarget-4を読みません。
位置はターゲットのアンカーポイントをワールド座標へ変換して補間します。
camControlに親がある場合は、その親の座標系へ戻します。
カメラをcamControlへ親子付けし、カメラのローカル位置を[0,0,−1000]、回転と方向を0にします。
正面向きのターゲットを練習に使い、カメラの自動方向設定とローカルのオフセットで構図が変わる点を確認します。
回転を補間する場合
回転の練習ではcamControlとターゲットに親を付けず、全ターゲットの「方向」を0にします。
以下をX回転へ貼り、Y回転用はaxisをyRotation、Z回転用はzRotationへ変えます。
var axis = "xRotation"; // X: xRotation / Y: yRotation / Z: zRotation
var cc = effect("targetControl")(1).value;
var result = value;
if (isFinite(cc)) {
cc = Math.max(0, Math.min(3, cc));
var n = Math.min(2, Math.floor(cc));
var a = effect("Target-" + n)(1).transform[axis].value;
var b = effect("Target-" + (n + 1))(1).transform[axis].value;
result = effect("ease")(1).value == 1 ?
ease(cc, n, n + 1, a, b) : linear(cc, n, n + 1, a, b);
}
result;
回転は同じ座標系の各Euler角を数値として補間します。
350度から10度を最短の20度で回す計算や、親の回転・方向を含むワールド回転の補間には対応しません。
エラーの切り分けと戻し方
Targetの参照エラーなら4つのレイヤー制御が未選択でないか、名前が一致するか、ターゲットが3Dかを確認します。
距離の結果が違う場合は、カメラと制御ヌルのオフセットを混同していないか確認します。
変更前にコンポを複製し、親、位置、回転、方向、明るさと不透明度のキーを控えます。
戻すときは追加した式を無効にし、今回変更した親子付け・値・カメラ設定を控えた状態へ戻します。
Adobeの距離によるフェード例を参照しています。
Adobeの輝度&コントラスト資料を参照しています。
今回の本文は上記の式を使います。
関連する操作
| やりたいこと | 最初に読む記事 |
|---|---|
| 画像を規則的に並べる | 中心間隔と端の間隔 |
| RGBをずらして合成する | 色収差の基本設定 |
| 横長・縦長を切り替える | 画面サイズと表示切替 |
| 再生位置の曲名を出す | 曲名と対象レイヤー |
参照資料
Adobeのエクスプレッション言語資料を参照しています。
旧版の参考コード・関連記事
旧版の参考コードは本文の練習と対象・設定が異なる場合があります。
今回の操作は本文のコードを使います。





