マニュアル キャンセル

エクスプレッション言語について

エクスプレッション言語を学習し、After Effects で様々なエクスプレッションを作成します。

JavaScript に基づく After Effects エクスプレッション言語には、ビルトインオブジェクトの拡張セットが追加されています。After Effects では、Web ブラウザー固有の拡張機能ではなく、標準的な JavaScript 言語を使用しており、レイヤーコンポジションフッテージカメラなどの独自の拡張オブジェクトセットが含まれています。

エクスプレッション言語はスクリプト言語に基づいていますが、スクリプトとエクスプレッションの間には微妙ながら本質的な違いがあります。スクリプトはアプリケーションに対して何らかの操作を実行するように指示しますが、エクスプレッションはプロパティに対して操作の実行を指示します。

エクスプレッションを作成する場合は、以下の点に注意してください。

  • エクスプレッションの値は、最後に評価されたステートメントの値です。これは通常、エクスプレッションの最後の行です。最も単純な形式では、エクスプレッションの値は、評価順に基づいてエクスプレッションで呼び出された最後の変数または関数によって生成されます。ただし、値を戻り値として明示的に参照することもできます。これには、エクスプレッションで以前からデバッグの目的で使用されていた値や、記述された順序で処理されない、明示的に宣言された関数や変数の範囲外の値が含まれる場合があります。
  • JavaScript は大文字と小文字を区別する言語です。
  • エクスプレッションの下部で関数を宣言することはできません。

言語の基礎

JavaScript では、オブジェクトに格納されている値をプロパティと呼びます。ただし、After Effects では、タイムラインパネルで定義されているレイヤーコンポーネントを「プロパティ」と呼びます。このため、After Effects では JavaScript プロパティを「メソッド」または「属性」と呼んでいます。一般に、「メソッド」と「属性」の違いは、メソッドは通常、出力値(戻り値)を作成するのに対し、属性は出力値(戻り値)を特定するのに既存の値を参照することです。メソッドにはメソッド名の後に括弧で囲まれている入力引数があるので、メソッドと属性は簡単に区別できます。

オブジェクト」は、別のオブジェクト、属性、およびメソッドを含めることのできるアイテムです。コンポジション、レイヤーおよびフッテージアイテムは、オブジェクトの一例です。コンポジション、レイヤーおよびフッテージアイテムは「グローバルオブジェクト」で、上位レベルのオブジェクトを参照せずにコンテキストで参照できます。

属性とメソッドへのアクセス

レイヤープロパティの属性やメソッドにアクセスするには、エクスプレッション言語を使用します。値にアクセスするには、一連のオブジェクト参照をピリオド(.)演算子で区切って指定します。「エフェクト」プロパティ、マスクまたはテキストアニメーターを参照する場合など、他のレベルのレイヤーのオブジェクトを参照するように指定するには、括弧を使用します。例えば、レイヤー A の「不透明度」プロパティをレイヤー B のブラー(ガウス)エフェクトの「ブラー」プロパティにリンクするには、レイヤー A の「不透明度」プロパティの「エクスプレッション」フィールドに次のエクスプレッションを入力します。

thisCompayer(“Layer B”)ffect(“Gaussian Blur”)(“Blurriness”)
thisCompayer(“Layer B”)ffect(“Gaussian Blur”)(“Blurriness”)
thisCompayer(“Layer B”)ffect(“Gaussian Blur”)(“Blurriness”)

このエクスプレッションは、左から右に向かって上位レベルから 特定のプロパティへのオブジェクトを表しています。

  • 使用しているグローバルオブジェクトは、現在のコンポジション thisComp を参照しています。

  • コンポジション内の特定のレイヤーオブジェクトは、 「layer("Layer B")」という名前で参照されます。

  • レイヤー内の特定のエフェクトオブジェクトは、 「effect("Gaussian Blur")」という名前で参照されます。

  • エフェクト内の特定のエフェクトプロパティは、 「("Blurriness")」という名前で参照されます。

複数のスケール値を持つプロパティの n 番目のコンポーネントは、 エフェクトコントロールポイントの y コンポーネントのように、次のように末尾に [n] を 付加します。

thisCompayer(“Layer B”)ffect(“Advanced Lightning”)(“Origin”1]
thisCompayer(“Layer B”)ffect(“Advanced Lightning”)(“Origin”1]
thisCompayer(“Layer B”)ffect(“Advanced Lightning”)(“Origin”1]

エクスプレッションの初期設定オブジェクトは、エクスプレッションを記述するプロパティで、その後ろにエクスプレッションを含むレイヤーが続きます。したがって、プロパティを指定する必要はありません。例えば、レイヤーの「位置」プロパティについて記述したウィグルのエクスプレッションは次のいずれかになります。

wiggle(5, 10)
position.wiggle(5, 10)
thisProperty.wiggle(5, 10)
wiggle(5, 10) position.wiggle(5, 10) thisProperty.wiggle(5, 10)
wiggle(5, 10)  
position.wiggle(5, 10) 
thisProperty.wiggle(5, 10)

エクスプレッションを作成するレイヤーとプロパティの外からレイヤーとプロパティを取得する場合は、レイヤーとプロパティを指定します。例えば、レイヤー B の「不透明度」プロパティをレイヤー A の「回転」プロパティにリンクするエクスプレッションは次のようになります。

thisCompayer(“Layer A”)otation
thisCompayer(“Layer A”)otation
thisCompayer(“Layer A”)otation
注意:

同様の例を見るには、ピックウイップを使用してレイヤープロパティを別のレイヤープロパティとリンクし、それによって生成されるエクスプレッションを参照してください。

配列と多次元プロパティ

配列は、配列とは順序付けられた一連の数値を格納できる種類のオブジェクトです。配列は、次の例のように、コンマで区切られ、かっこで囲まれた数字のリストとして表されます。

[10, 23]
[10, 23]
  [10, 23]

変数に配列オブジェクトを割り当てれば、エクスプレッションの他の領域で 配列値を容易に参照することができます。以下に例を示します。

myArray = [10, 23]
myArray = [10, 23]
  myArray = [10, 23]

配列オブジェクトのディメンションは、配列内の 要素の数のことです。myArray のディメンションは 2 です。 After Effects のプロパティのディメンションは、 保持している値引数の数によって異なります。エクスプレッション言語では、 プロパティの値は単一の値(数値オブジェクト)または配列(配列オブジェクト)の いずれかです。

次の表に、プロパティとそのディメンションの例を 示します。

次元

プロパティ

1

回転 °

不透明度 %

2

拡大・縮小 [x=幅, y=高さ]

位置 [x, y]

アンカーポイント [x, y]

オーディオレベル [左, 右]

3

スケール [幅, 高さ, 深度]

3D 位置 [x, y, z]

3D アンカーポイント [x, y, z]

方向 [x, y, z]

4

カラー [赤, 緑, 青, アルファ]

配列オブジェクトの個々の要素にアクセスするには、 目的の要素を示すインデックス番号と括弧を使用 します。配列オブジェクトの要素には 0 からインデックスが付けられます。 前の例では、myArray[0]10myArray[1]23 です。

以下の 2 つのエクスプレッションは等価です。

[myArray[0], 5]
[10, 5]
[myArray[0], 5] [10, 5]
  [myArray[0], 5] 
  [10, 5]

プロパティの配列の位置

「位置」プロパティ配列のインデックスは次のとおりです。

  • position[0] は位置の x 座標です。

  • position[1] は位置の y 座標です。

  • position[2] は位置の z 座標です。

配列でのカラーの表示

カラーは 4D 配列として表示されます。

  • アルファ

8 bpc または 16 bpc の色深度のプロジェクトでは、カラー配列の各値が 0(黒)~ 1(白)になります。例えば、の場合は 0(色なし)~ 1(赤)です。したがって、[0,0,0,0] は黒で透明、[1,1,1,1] は白で不透明です。色深度が 32 bpc のプロジェクトでは、0 未満や 1 を越える値を指定することもできます。

配列オブジェクト内で、次元のコンポーネントの最高値より大きなインデックスを使用すると、エラーになります。例えば、myArray[2] ではエラーが発生しますが、position[2] では、位置の z 座標が返されます。

After Effects エクスプレッション言語に含まれる多くのプロパティやメソッドでは、配列オブジェクトを引数として取ったり、戻り値として返したりします。例えば、thisLayer.position は、レイヤーが 2D か 3D かに応じて、2 次元または 3 次元の配列になります。

位置のアニメーションの y 値を維持しながら x 値を 9 に固定するエクスプレッションは、次のようになります。

y = position[1];
[9,y]
y = position[1]; [9,y]
  y = position[1]; 
  [9,y]

さらに簡潔に記述すると次のようになります。

[9, position[1]]
[9, position[1]]
  [9, position[1]]

これは重要なポイントなので、もう 1 つ例を見てみます。 レイヤー A から取得した x 位置の値とレイヤー B から取得した y 位置の値を 組み合わせる場合は、次のように記述できます。

x = thisCompayer(“Layer A”)osition[0
y = thisCompayer(“Layer B”)osition[1
[x]
x = thisCompayer(“Layer A”)osition[0 y = thisCompayer(“Layer B”)osition[1 [x]
  x = thisCompayer(“Layer A”)osition[0  
  y = thisCompayer(“Layer B”)osition[1  
  [x]

2D プロパティまたは 3D プロパティの配列の値を 1 つだけ参照するエクスプレッションを作成することができます。初期設定では、特に指定がない限り、最初の値が使われます。例えば、レイヤー A の「回転」プロパティからレイヤー B の「拡大・縮小」プロパティにピックウイップをドラッグすると、次のエクスプレッションが表示されます。

thisCompayer(“Layer B”)cale[0]
thisCompayer(“Layer B”)cale[0]
  thisCompayer(“Layer B”)cale[0]

デフォルトでは、「拡大・縮小」プロパティの最初の値である幅の値が使用されます。幅の代わりに高さを使用する場合は、プロパティ名ではなく 2 番目の値に直接ピックウイップをドラッグするか、エクスプレッションを次のように変更します。

thisCompayer(“Layer B”)cale[1]
thisCompayer(“Layer B”)cale[1]
  thisCompayer(“Layer B”)cale[1]

逆に、レイヤー B の「拡大・縮小」プロパティからレイヤー A の「回転」プロパティにピックウイップをドラッグすると、自動的に変数が作成されて「回転」プロパティの 1 次元の値が割り当てられ、その変数が「拡大・縮小」プロパティの両方のディメンションに使用されます。

temp = thisComp.layer(1).transform.rotation;
[temp, temp]
temp = thisComp.layer(1).transform.rotation; [temp, temp]
  temp = thisComp.layer(1).transform.rotation; 
  [temp, temp]

ベクトル

After Effects では、多くのプロパティおよびメソッドがベクトルを返します。配列が空間におけるポイントまたは方向を表す場合、After Effects ではそれを「ベクトル」と呼びます。例えば、position はベクトルを返す、というように表現します。

ただし、audioLevels のような関数は 2 次元の値(左と右のチャンネルのレベル)を返しますが、これはポイントや方向を表しているわけではないので、「ベクトルを返す」とは言いません。After Effects の関数の中にはベクトル引数を取るものがありますが、このような関数が便利なのは渡される値が方向を表している場合のみです。例えば、cross(vec1, vec2) では、入力ベクトルに対して垂直な第 3 のベクトルを計算します。これは、vec1vec2 が空間内の方向を表している場合は便利ですが、2 組の任意の数値の組み合わせを表している場合は特に意味がありません。

インデックスとラベル

After Effects のレイヤーエフェクトマスク要素のインデックスは、1 から始まります。例えば、タイムラインパネルの最初のレイヤーは layer(1) です。

特に理由がない限り、レイヤー、エフェクト、マスクのラベルには番号ではなく、名前を使用してください。番号を使用すると、これらのオブジェクトを移動した場合や、After Effects のアップデートまたはアップグレード時に引数が変更された場合に区別しづらくなり、エラーの原因となりかねません。名前を使用する場合は、必ず半角の二重引用符("")で囲みます。例えば、次に示す最初のエクスプレッションの方が 2 番目のエクスプレッションよりわかりやすく、また最初のエクスプレッションはエフェクトの順序を変更しても機能します。

effect(“Colorama”)aram(“Get Phase From”)
effect(1)aram(2)
effect(“Colorama”)aram(“Get Phase From”) effect(1)aram(2)
  effect(“Colorama”)aram(“Get Phase From”)  
  effect(1)aram(2)

エクスプレッション時間

エクスプレッション内の時間は、レイヤー時間ではなく常にコンポジション時間にあり、秒単位で測定されます(sourceRectAtTime() エクスプレッションには当てはまりません)。エクスプレッションの初期設定の時間は、エクスプレッションが評価されるコンポジションの現在の時間です。次のエクスプレッションでは、両方ともコンポジションの初期設定の時間が使用され、同じ値が返されます。

thisComp.layer(1).position
thisComp.layer(1).position.valueAtTime(time)
thisComp.layer(1).position thisComp.layer(1).position.valueAtTime(time)
thisComp.layer(1).position  
thisComp.layer(1).position.valueAtTime(time)

相対時間を使用するには、time 引数に相対値を追加します。例えば、現在の時間の 5 秒前の位置の値を取得するには、次のエクスプレッションを使用します。

thisComp.layer(1).position.valueAtTime(time-5)
thisComp.layer(1).position.valueAtTime(time-5)
thisComp.layer(1).position.valueAtTime(time-5)

ネスト化されたコンポジションに含まれるプロパティが参照する初期設定の時間は、リマップされた時間ではなく、コンポジションの元の初期設定の時間です。ただし、プロパティの取得に source 関数を使用する場合は、リマップされた時間が使用されます。

例えば、包含コンポジション内のレイヤーのソースがネスト化されたコンポジションで、包含コンポジション内でタイムリマップされているとします。この場合、次のエクスプレッションで、ネスト化されたコンポジション内にあるレイヤーの位置の値を取得すると、コンポジションの初期設定時間の位置の値が返されます。

comp(“nested composition”)ayer(1)osition
comp(“nested composition”)ayer(1)osition
comp(“nested composition”)ayer(1)osition

ただし、ソース関数を使用してレイヤー 1 にアクセスすると、 タイムリマップされた後の位置の値が返されます。

thisCompayer(“nested composition”)ourceayer(1)osition
thisCompayer(“nested composition”)ourceayer(1)osition
thisCompayer(“nested composition”)ourceayer(1)osition
注意:

エクスプレッションで特定の時間を指定すると、 タイムリマップされた時間は無視されます。

エクスプレッションはフレーム単位ではなく、秒単位で時間どおりに動作するため、フレームで動作するように時間変換メソッドを使用して時間値の変換が必要になる場合があります。

例:エクスプレッション言語の要素を使ってエクスプレッションを記述する

ここでは、エクスプレッション言語の要素を使用してエクスプレッションを記述する例を紹介します。この例で作成されるエクスプレッションは、「平面 2」の「位置」プロパティを「平面 1」の「位置」プロパティにリンクし、「平面 2」の動きは「平面 1」の動きの 2 秒分オフセットされます。

  1. 2 つの平面レイヤー(「平面 1」と「平面 2」)を作成します。

  2. キーフレームを使用して、「平面 1」の「位置」プロパティ値をアニメートします。(アニメーション、キーフレームおよびエクスプレッションについてを参照)。

  3. 「平面 2」の「位置」プロパティを選択して、アニメーションエクスプレッションを追加を選択するか、Alt キー(Windows)または Option キー(macOS)を押しながらプロパティのストップウォッチ ボタンをクリックします。初期設定では、次のエクスプレッションが表示されます。

    transform.position
    transform.position
      transform.position
  4. transform.position を次のエクスプレッションで直接上書きします。

    thisComp
    thisComp
      thisComp
  5. 要素 thisComp はグローバル属性で、その値は、現在のコンポジションを表す Comp オブジェクトになります。このエクスプレッションで thisComp の後に入力できる要素を確認するには、グローバルオブジェクト、属性、メソッドthisComp の戻り値を調べます。

    thisCompComp オブジェクトを返します。次に、Comp の属性とメソッドを参照して、Comp オブジェクトで使用できる属性とメソッドを確認します。1 つの選択肢として layer(index) があります。括弧内のインデックスまたは数字に、使用するレイヤーを示す番号を指定します。この例では、「平面 1」がコンポジションの最初のレイヤーとします。アクティブなコンポジションの最初のレイヤーから値を取得するには、次のように入力します。以下のようにエクスプレッションの末尾に layer(1) と入力します。

    thisComp.layer(1)
    thisComp.layer(1)
      thisComp.layer(1)
  6. 再びエクスプレッション要素リファレンスを参照して、layer(index)レイヤーオブジェクトを返すことを確認します。レイヤーの一般属性とメソッドを参照して、使用する要素を確認します。例えば、レイヤーの「位置」プロパティの値を取得するには、以下のようにエクスプレッションの末尾に .position と入力します。

    thisComp.layer(1).position
    thisComp.layer(1).position
      thisComp.layer(1).position
  7. レイヤーの一般属性とメソッドから、位置属性がプロパティを返すことがわかります。プロパティの属性とメソッドを参照すると、このエクスプレッションに時間係数を追加できることがわかります。現在の時刻から 2 秒後など、特定の時刻を追加するには、次のようにエクスプレッションの末尾に .valueAtTime(time+2) と入力します。

    thisComp.layer(1).position.valueAtTime(time+2)
    thisComp.layer(1).position.valueAtTime(time+2)
      thisComp.layer(1).position.valueAtTime(time+2)
  8. プロパティの属性とメソッドから、valueAtTime メソッドが数字または配列を返すことがわかります。エクスプレッションが数字、配列またはブーリアン(正か誤か)を返す場合は、エクスプレッションにその他の属性またはメソッドを追加することはできません(ただし、必要に応じて、+-*/ などの演算子を使用することはできます)。

その他のエクスプレッション関連リソース

ここまでで、エクスプレッションの背景となる概念を理解したので、今度はコミュニティにアクセスして実例を参考にしたり、自分の作品を共有したりしてください。

AE Enhancers フォーラムには、エクスプレッションの多くの例や情報、スクリプトやアニメーションプリセットも公開されています。

ヘルプをすばやく簡単に入手

新規ユーザーの場合