AEいじっていて思いついたことを書いていきます(´・ω・`)

Expression偏

1.コンポジションのサイズやレイヤーのサイズを求める

thisComp.width や thisComp.height でコンポジションの横幅と縦幅が求められる。

同様にthisLayer.width や thisLayer.height でそのレイヤーの横幅と縦幅で求められる。
1280 x 720のサイズのコンポジションに1280 x 720の平面を置いて、
平面のトランスフォームの位置に

x = thisComp.width;
y = thisComp.height;

と書くと位置が X:1280,Y:720 に移動する。

2.name.sliceで一個前のレイヤーを指定

レイヤー名
syobo_0
syobo_1
※syobo_0はダミーのレイヤー。(エクスプレッション制御用にするとよい)
syobo_1の回転に

ns = name.slice(6,9) -1;
thisComp.layer("syobo_" + ns).transform.rotation;

とエクスプレッションを書くと前のレイヤーの角度を求められる。

3.別コンポジションを参照する

コンポジション「しょぼーん1」の中のレイヤー「しゃきーん_1」のレイヤーの回転を、
コンポジション「しょぼーん2」の中のレイヤー「ワッフル_1」の回転を同期させたいとき。

「しょぼーん2」の「ワッフル_1」の回転へエクスプレッションを書きます。

comp("しょぼーん1").layer("しゃきーん_1").transform.rotation;

コンポジション「しょぼーん1」でname.slice()などで大量に複製したレイヤーがあって、
それらの位置をコンポジション「しょぼーん2」のレイヤーにも反映させたいとき。

「しょぼーん2」の「ワッフル_1」の位置へエクスプレッションを書きます。

ns = name.slice(5, 9);
comp("しょぼーん1").layer("しゃきーん_" + ns).transform.position;

4.AをBで割ったあまりの数字

A = 17;
B = 13;
C = A % B;

[出力される値] 4

name.slice()を使った例
平面レイヤーをコンポに入れてレイヤー名「Layer_1」とする。
エクスプレッションを書くプロパティはとりあえず回転とする。

ns = name.slice(6, 9);
ns % 2

上記のエクスプレッションを書いてレイヤーをCtrl + Dで複製していくと、

Layer_1の回転は「1」
Layer_2の回転は「0」
Layer_3の回転は「1」
Layer_4の回転は「0」
Layer_5の回転は「1」

と、出力される。
これを応用すれば偶数レイヤーと奇数レイヤーで分けることができる。

5.try{}catch(err)とfor文、を使ってレイヤーのMAX枚数を出力する

平面レイヤーをコンポに入れてレイヤー名「Layer_1」とする。
エクスプレッションを書くプロパティはとりあえず不透明感とする。

try {
for (i = 1; i <= 11; i++)
thisComp.layer("Layer_" + i).transform.opacity;
}
catch(err)
{i - 1}

上記のエクスプレッションを書いてレイヤーをCtrl + Dで複製していくと、
複製していくにつれて不透明度が1ずつ全レイヤーが増えていきます。
「Layer_11」まで増やすと

thisComp.layer("Layer_11").transform.opacity;

とtry{}内の条件が成立するので「Layer_11」のopadityのプロパティを参照して100となります。
それ以上増やしたい場合は

i <= 101

など、値を変えてください。

解説するとtry{}catch(err){}は最初の括弧で囲った内のプログラムを処理します。
何にも問題が無かったらそのまま数値等を出力します。

エラーだった場合はcatch(err)の括弧内のプログラムを処理して出力します。

for文では「i = 1」、「i <= 11」になるまでi + 1を繰り返しなさいとしています。
出力される最初のiは「1 + 1 = 2」となります。

これを

thisComp.layer("Layer_" + i).transform.opacity;

このiに代入すると

thisComp.layer("Layer_2").transform.opacity;

となります。
tryした結果「Layer2」なんて無いからエラーだよとなり、
catch(err)の方の処理になります。

catch(err)内では

{i – 1}

となっているのでiに2を代入して

2 – 1 = 1

となります。
これでレイヤーを複製するだけで「Layer_x」が何枚使われてるかを出力することができます。

使う場面は少ないけど今日使いたいって思ったけど、
どのaep見ても書いてなくて困ったから久しぶりにメモに書いた。

6.function 関数の宣言

自分で作った数式を使い回すのに便利。
エクスプレッションを書いていてレイヤー名やエフェクト名だけしか変わらない数式なのに、
何度も使用して凄く長ったらしく見えるときにスッキリさせてくれる。

例1

ns0 = name.slice(0, 14);
ns1 = name.slice(11, 13);
ns2 = name.slice(14, 16);

random3DPointo = thisComp.layer(ns0 + "01").effect("3D ポイント制御")("3D ポイント");
delayAllRandom = thisComp.layer(ns0 + "01").effect("DelayAllRandom")("スライダー");

nullAll = thisComp.layer("null_All");
delayAll = nullAll.effect("DelayAll")("スライダー");

positionAllX = nullAll.effect("3D ポイント制御")("3D ポイント").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
positionAllX = nullAll.effect("PositionAllX")("スライダー").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
positionAllY = nullAll.effect("PositionAllY")("スライダー").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
positionAllZ = nullAll.effect("PositionAllZ")("スライダー").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
rotationPosition = nullAll.effect("RotationPosition")("角度").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
rotationPositionX1 = nullAll.effect("RotationPositionX")("スライダー").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
rotationPositionY1 = nullAll.effect("RotationPositionY")("スライダー").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
rotationPositionZ1 = nullAll.effect("RotationPositionZ")("スライダー").valueAtTime(time + ns1 * -delayAll -delayAllRandom);
rotationPositionTime = nullAll.effect("RotationPositionTime")("スライダー").valueAtTime(time + ns1 * -delayAll -delayAllRandom);

これが

ns0 = name.slice(0, 14);
ns1 = name.slice(11, 13);
ns2 = name.slice(14, 16);

random3DPointo = thisComp.layer(ns0 + "01").effect("3D ポイント制御")("3D ポイント");
delayAllRandom = thisComp.layer(ns0 + "01").effect("DelayAllRandom")("スライダー");

nullAll = thisComp.layer("null_All");
delayAll = nullAll.effect("DelayAll")("スライダー");

function effectsName1(effectName1_1, effectName1_2, nameSlice)
{
	return nullAll.effect(effectName1_1)(effectName1_2).valueAtTime(time + (nameSlice - 1) * -delayAll -delayAllRandom);
}
point3D = effectsName1("3D ポイント制御", "3D ポイント", ns1);
positionAllX = effectsName1("PositionAllX", "スライダー", ns1);
positionAllY = effectsName1("PositionAllY", "スライダー", ns1);
positionAllZ = effectsName1("PositionAllZ", "スライダー", ns1);
rotationPosition = effectsName1("RotationPosition", "角度", ns1) / 360;
rotationPositionX1 = effectsName1("RotationPositionX", "スライダー", ns1);
rotationPositionY1 = effectsName1("RotationPositionY", "スライダー", ns1);
rotationPositionZ1 = effectsName1("RotationPositionZ", "スライダー", ns1);
rotationPositionTime = effectsName1("RotationPositionTime", "スライダー", ns1);

こうなる。

文字数だけで見ると1,330文字が1,074まで減った。
たくさんこういうのあるとfunction使ったほうが良いかも。

あとfunction{ return }を書き忘れて値が戻ってこなくて苦しんだからreturnは忘れずに。

例2
もう少しわかりやすく

function a(b, c, d)
{
	return b + c + d;
}
a(1, 2, 3)

aというのは

b + c + d

という数式の入った自分で作った関数。
実際に数字を入れると

1 + 2 + 3

で結果は「6」と出ます。

function

現在コメントは受け付けていません。