maemaewaterの日記

エンジニア兼ゲーマーの人の日記です。PHP/Python/JavaScript/C#/C++などによるプログラムに関することを主に書いています。

After Effects: 2つのレイヤーの位置に対して90度の場所に別のレイヤーの位置を設定

正直何の役に立つかわかりませんが、ベクトルの関数を使ってみる例として作ってみました。

f:id:maemaewater:20190421233926p:plain
結果

Text 3の位置のエクスプレッション

let p1 = thisComp.layer("Text 1").transform.position;
let p2 = thisComp.layer("Text 2").transform.position;
let d = sub(p2, p1);
let n = normalize(d);
let z = [0, 0, 1];
let p = cross([n[0], n[1], 0.0], z);
let position = add(p1, mul([p[0], p[1]], length(d)));

position;

Text 1とText 2の位置に対してText 3がちょうど90度の位置にあるようにエクスプレッションで記述しています(Text 1とText 2が遠いとそれに応じてText 3の位置も離れます)。使用している関数は、add, sub, normalize, cross, mul, lengthになります。

  • add / sub
    • 点の位置の足し算と引き算
    • add([0, 1], [2, 1])の場合は、[2, 2]
    • sub([0, 1], [2, 1])の場合は、[-2, 0]
  • normalize
    • ベクトルの長さを1にしたベクトルを返してくれます
    • normalize([0, 2])であれば、[0,1]が返ってくる
  • cross
    • 外積
    • 二つのベクトル(3次元)に対して丁度90度のベクトルを返してくれます。
    • cross([1,0,0], [0, 1, 0])は[0,0,1]になります。
  • mul
    • ベクトルの長さを指定した値だけ増やしてくれます
    • mul([0,1], 3)であれば、[0,3]が返ってくる
  • length
    • ベクトルの長さです。
    • [0, 2]の場合は、2

今回の例では使っていませんが、内積(dot)もあります。これは、それぞれのベクトルがnormalizeによって長さが1となっていれば2つのベクトルのコサインを返してくれます。

例のエクスプレッションについてですが、p1, p2の変数にはそれぞれのレイヤーの位置を入れています。dは、p2 - p1になりますので、それぞれのレイヤの方向を計算しています。nはdをnormalizeしているので、単純に向いている方向になります。pは、2つのレイヤーの向いている方向(n)に[0,0,1]との外積をかけているので、丁度90度の位置が計算できます。最後のpositionは、Text 1の位置を中心にText 3の位置を計算しています。

Text 1とText 2を動かすと連動してText 3も動くのでぜひ試してみてください! (役に立たないエクスプレッションな気がしますが)

helpx.adobe.com