正直何の役に立つかわかりませんが、ベクトルの関数を使ってみる例として作ってみました。
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も動くのでぜひ試してみてください! (役に立たないエクスプレッションな気がしますが)