3Dレイヤーのアンカーポイントとカメラをワールド座標に変換し、距離に応じて不透明度や輝度を変える式です。元の不透明度60%なら、距離500で60%、1000で30%、1500で0%になります。
2026年10月14日、Windows 11 Pro(10.0.26200)・After Effects 26.5(Build 89)で掲載式を検証しました。カメラレイヤーを作らない場合も既定カメラで計算され、元の値を維持するとは限りません。再現するには、位置を指定したカメラを作って試してください。
距離で不透明度を変える
練習コンポへ明示的なカメラと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]へ置き、計算された不透明度を見ます。
画面内の構図の確認とは分けて試します。
掲載式の実機検証:距離500・1000・1500
練習では960×540・30fps・3秒、クラシック3Dのコンポジションに320×180のオレンジ色の3D平面を作りました。平面のアンカーポイントは中央、不透明度の元値は60%です。2ノードカメラの位置を[480,270,−1000]、目標点を[480,270,0]、ズームを1000にして、平面のX・Y位置を480・270に揃えます。
平面のZ位置だけを−500、0、500へ変え、不透明度と下の輝度の式をそれぞれ指定のプロパティへ適用しました。輝度の元値は0、「従来方式を使用」はOFFです。
| 平面のZ位置 | カメラとの距離 | 不透明度 | 輝度 |
|---|---|---|---|
| −500 | 500 | 60% | 0 |
| 0 | 1000 | 30% | −25 |
| 500 | 1500 | 0% | −50 |
3条件とも式エラーはなく、各条件のPNGもAEから保存しました。距離1500では不透明度が0%になるため、輝度の違いを見比べたい場合は不透明度の式を一時的に無効にして確認します。

画面は距離1000で不透明度30%・輝度−25になった状態です。さらに、位置[100,0,0]の3Dヌルへ平面を親子付けしても、ワールド位置を維持した場合は30%・−25のままでした。親子付け後のローカル位置だけを距離として比較しないでください。
カメラを作らない場合の注意
旧説明の「明示的なカメラなしなら元の不透明度」は、今回の環境では成立しませんでした。カメラを1枚も作らない960×540の新規コンポジションで、中心[480,270,0]の3D平面へ同じ式を適用すると、不透明度は約10%、輝度は約−41.67となりました。画面の輝度表示は丸められて−42です。

if (camera)だけでは「カメラレイヤーを作成済みか」を判定できません。式を止めて元値へ戻したい場合はカメラを非表示にするのではなく、式自体を無効にしてください。今回、不透明度・輝度の式を無効にすると60%・0へ戻りました。既定カメラの値はこの練習条件での結果であり、別のコンポでも10%になるという意味ではありません。
明るさへ減少量を加える
対象へ「輝度&コントラスト」を追加し、「輝度」を0にして次の式を貼ります。
maxReductionには正の50を指定します。距離1000で25、1500以上で50を元の輝度から引きます。負の−50を指定すると条件を満たさず、今回の確認では元の輝度0のままでした。
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より大きくします。
以下の2枚は以前のブラーの撮影例です。今回の不透明度・輝度式とは別の効果なので、上の数値検証と区別して参照してください。
本文の不透明度や輝度ではなく、「ブラー(ガウス)」の値が変わる画面です。
エフェクトコントロールには、レイヤー「DistanceText17762」の「DistanceTargetControl17762」(レイヤー制御)と、「ブラー(ガウス)」が並んでいました。
アクティブカメラは「DistanceCamera17762」でした。
0:00:00:00では、「ブラー」は0.0で、文字「DISTANCE」ははっきり見えていました。

0:00:00:01では、「ブラー」は30.0になり、文字は小さく、ぼけて見えました。

カメラとターゲットの距離の値や、式は、画像に写っていません。
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へ親子付けして使う場合は、カメラのローカル位置と自動方向設定も構図へ影響します。今回の実機検証はcamControlの位置・X回転までです。カメラの連続移動は、各ターゲットの時刻で構図を確認しながら設定してください。
正面向きのターゲットを練習に使い、カメラの自動方向設定とローカルのオフセットで構図が変わる点を確認します。
回転を補間する場合
回転の練習では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度で回す計算や、親の回転・方向を含むワールド回転の補間には対応しません。
4ターゲットの位置と回転を照合した結果
3DヌルTarget0〜Target3の位置を[100,270,0]、[300,270,0]、[500,270,0]、[700,270,0]、X回転を0・20・40・60度にしました。camControlへ上の位置・X回転の式を貼り、各レイヤー制御の参照先を指定しました。
| targetControl | ease | 位置X | X回転 |
|---|---|---|---|
| −1 / 0 | OFF | 100 | 0度 |
| 1.25 | OFF | 350 | 25度 |
| 1.5 | OFF | 400 | 30度 |
| 3 / 4 | OFF | 700 | 60度 |
| 1.25 | ON | 331.25 | 23.125度 |
いずれも式エラーはありません。ease ON・1.25のcamControlを位置[100,0,0]の3Dヌルへ親子付けすると、位置Xのローカル値は231.25になり、親の100を加えたワールドXは331.25を維持しました。この確認は位置の座標変換についてのもので、親の回転を含む角度補間を保証するものではありません。
今回確認したのは指定時刻の位置・X回転と距離による不透明度・輝度です。ターゲットに沿ったカメラの連続移動映像、カメラ切替、親の回転・スケール、Y/Z回転式、Undo、他バージョンは未検証です。まず親なし・方向0の練習設定で数値を合わせてから、本番コンポへ適用してください。
エラーの切り分けと戻し方
Targetの参照エラーなら4つのレイヤー制御が未選択でないか、名前が一致するか、ターゲットが3Dかを確認します。
距離の結果が違う場合は、カメラと制御ヌルのオフセットを混同していないか確認します。
変更前にコンポを複製し、親、位置、回転、方向、明るさと不透明度のキーを控えます。
戻すときは追加した式を無効にし、今回変更した親子付け・値・カメラ設定を控えた状態へ戻します。
Adobeの距離によるフェード例を参照しています。
Adobeの輝度&コントラスト資料を参照しています。
今回の本文は上記の式を使います。
関連する操作
| やりたいこと | 最初に読む記事 |
|---|---|
| 画像を規則的に並べる | 中心間隔と端の間隔 |
| RGBをずらして合成する | 色収差の基本設定 |
| 横長・縦長を切り替える | 画面サイズと表示切替 |
| 再生位置の曲名を出す | 曲名と対象レイヤー |
参照資料
Adobeのエクスプレッション言語資料を参照しています。
旧版の参考コード・関連記事
旧版の参考コードは本文の練習と対象・設定が異なる場合があります。
今回の操作は本文のコードを使います。





