3DレイヤーのX・Yを保ち、Zだけにランダムな差を加える方法です。時間で散らばり方が変わらない配置を作り、スライダーで奥行きの幅を調整できます。
多数の画像を奥行き方向に適度に分散して配置するため、Z方向のみにランダムな値を適用するエクスプレッションを作成しました。
Zの範囲と元の位置を確認する練習
別名保存した練習コピーに画像を3枚置き、すべて3D・親なし・位置の次元分離なし・位置のキーなしにします。
元の位置を記録し、まず位置プロパティ全体へ下のrandom-zの式を直接貼り付けます。
X・Yは元の値のまま、Zには0〜2000pxの正方向の差を加える例です。
−2000〜2000pxの両方向に分散させる場合は、randomの引数を「random(-2000,2000)」へ変更します。
0・1・2秒でZの値が変わらず、X・Yが元の値と一致するか確認します。
カメラの向きや遠近によって画面上の見え方が変わるため、奥行きの正負はZの数値でも確認します。
マーカーで共有する場合は、コンポジションマーカーの最初のコメントへ自分のrandom-zコードを貼り、各画像の位置へmarker-zの式を貼ります。
マーカーがない場合やコメントが空の場合は元値を返しますが、コードの誤記は別に修正する必要があります。
スライダーの例では、ヌルのレイヤー名をCTRL、スライダー制御のエフェクト名をSpreadへ変更してから使います。
Spreadの0と2000を比べ、元のZとの差が0〜指定値に収まり、0では元位置になるか確認します。
変化がなければ3Dと貼付先、エラーならCTRL・Spreadの名前やマーカーの内容を確認します。
終了後は式をOFFにして元のXYZへ戻し、練習ZIPの記録欄へ使用版と結果を残します。
2026年10月14日、Windows 11 Pro(OSビルド26200)・After Effects 26.5(26.5×89、Build 89)のJavaScriptエンジンで、本文の3つの式を検証しました。結果は後述します。Adobe公式の乱数の仕様でも、seedRandomの第2引数をtrueにすると、乱数の種に評価時刻を使わないと説明されています。
| 確認すること | 期待する結果 | 違ったとき |
|---|---|---|
| 正方向へ分散 | 元Z+0〜2000px | 乱数の両端を確認 |
| 2Dのまま | この式は元値を返す | 3Dと次元分離を確認 |
| Spread=0 | 元XYZと一致 | 参照名と元値を確認 |
使用するエクスプレッション
①時間に依存しない乱数をZ値へ加えるエクスプレッション
seedRandom(index,true)で、乱数の種から現在時刻を除いてZの差を固定します。
その上でX・Y方向の値を取得し、Z値にのみランダムな数値を加算します。
var result = value;
if (value.length === 3) {
seedRandom(index, true);
result = [value[0], value[1], value[2] + random(0, 2000)];
}
result;
②コンポジションのマーカーコメントを参照するエクスプレッション
複数のレイヤーでエクスプレッションを一括管理する際に役立ちます。
基本は位置へ直接式を貼る方法で、同じ所有コードを共有したい場合だけマーカーコメントを使います。
var result = value;
if (thisComp.marker.numKeys > 0) {
var expressionText = thisComp.marker.key(1).comment;
if (expressionText !== "") {
result = eval(expressionText);
}
}
result;
Z方向のみにランダム値を適用する手順
- 画像の3Dレイヤースイッチを有効化
- まず画像の「位置」全体へ①の式を直接貼り付けて数値を確認
- マーカー管理を使う場合だけ、最初のコンポジションマーカーへ①の式を記述し、位置には②を貼付
- 位置のZ値を直接変更して微調整(エクスプレッション適用後もオフセット調整が可能)
Windowsで確認したZ値とマーカー共有
960×540、30fps、3秒のコンポジションに、180×180の平面を3枚配置しました。画像ファイルの読み込みは今回の対象外です。すべて3D・親なし・位置のキーなし・次元分離なしとし、元の位置を赤[240,270,100]、緑[480,270,100]、青[720,270,100]にしました。タイムラインは上から青・緑・赤・CTRLの順です。
①を位置へ直接貼り、0秒・1秒・2秒で評価すると、赤のZは461.2095、緑は1341.6737、青は1333.9989で、各時刻で同じでした。X・Yは元の値を保ち、元Zとの差は約361.2、1241.7、1234.0です。この数値は今回のレイヤーでの結果であり、別のプロジェクトで同じ値になる保証はありません。
CTRLにSpreadを作り、スライダー版の式を使った場合も、Spread=2000では同じ値でした。画面は1秒時点です。遠近で平面の見かけの大きさや横位置は変わるため、X・Yの保持はタイムラインの数値で確認します。

Spreadを画面上で0へ変更すると、3枚ともZ=100へ戻りました。負の値(検証では−100)もMath.maxで0として扱うため、元位置でした。負のSpreadを指定しても手前側へ散らばるわけではありません。式を無効にした場合も元のXYZへ戻ることを確認しました。

マーカー版では、最初のコンポジションマーカーのコメントに①のコードを入れると、直接貼った場合と各レイヤーのXYZが一致しました。共有するのはコードであり、3枚が同じ乱数値になる仕組みではありません。各レイヤーのindexを使って評価されるので、並べ替えた後は配置を再確認してください。マーカーなし・空コメントでは、3枚とも元位置でした。
2Dへ切り替えた場合、この式による奥行きの分散はありませんでした。ただし検証では3Dから2Dへの切り替えで元Z自体が0になりました。元Z=100を保ったまま3Dスイッチだけを往復できるとは考えず、切り替える前に位置を記録してください。
seedRandom(index,true)が固定するのは乱数の時刻依存です。元の位置やSpreadにキーを付ければ、結果の位置も変わり得ます。今回未検証なのは、親付きレイヤー、次元分離、カメラアニメーション、位置やSpreadのキー付き、別バージョンです。マーカーのコードに誤記があればエラーになるため、まず直接貼る方法で切り分けてください。
適用結果
旧掲載画像:適用前(今回の修正コードを実機で検証した画像ではありません)。

旧掲載画像:適用後(今回の修正コードを実機で検証した画像ではありません)。

スライダー制御で散らばり具合を調整する設定
スライダー制御を組み合わせると、ランダム値の強度を後から調整しやすくなります。
CTRLという名前のヌルを作成し、スライダー制御を追加してエフェクト名をSpreadへ変更します。
追加後、参照先のエクスプレッションをスライダー制御に対応したコードに書き換えます。
var result = value;
if (value.length === 3) {
seedRandom(index, true);
var amount = Math.max(0, thisComp.layer("CTRL").effect("Spread")(1).value);
result = [value[0], value[1], value[2] + random(0, amount)];
}
result;
After Effectsのほかの操作は、まとめから確認できます。

MOTOKI-LLC/cg-method-codeは以前の実装の参照先です。
ランダムな動きを作るエクスプレッションは、ほかにもあります。



