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

複雑なアニメーションを作成してリンクするときに、多くのキーフレームを 1 つずつ作成するのは骨の折れる作業です。After Effects には、この作業を簡略化するエクスプレッションという機能があります。エクスプレッションは、ある時点での単一レイヤープロパティの単一の値を評価するスクリプトのような小さい部分からなるソフトウェアです。スクリプトがアプリケーションに指示を伝えるのに対し、エクスプレッションはプロパティの設定内容を表します。

エクスプレッションを使用すると、レイヤープロパティ間の関係を定義し、1 つのプロパティで複数のキーフレームを使用して他のレイヤーを動的にアニメートすることができます。例えば、ピックウイップを使用してパスプロパティをリンクすれば、ブラシストロークやシェイプレイヤーオブジェクトからマスクのパスを取得できます。

エクスプレッション言語は、標準の JavaScript 言語に基づいていますが、エクスプレッションを使用するために JavaScript の知識は必要ありません。ピックウイップを使用するか、エクスプレッションの単純なサンプルをコピーして変更するだけで、エクスプレッションを作成できます。

注意:

エクスプレッションのサンプルは、サンプルプロジェクトテンプレート(ファイル/プロジェクトテンプレートを参照)や、動作カテゴリのアニメーションプリセット(アニメーション/アニメーションプリセットを参照)に含まれています。

アニメーションプリセットにエクスプレッションを含めたり、1 つのエクスプレッションだけで構成するアニメーションプリセットを使用することもできます。キーフレームの代わりにエクスプレッションを使用するアニメーションプリセットを、動作と呼ぶこともあります。

プロパティにエクスプレッションを追加した後も、プロパティにキーフレームを追加したり、プロパティのキーフレームを編集したりできます。エクスプレッションに、キーフレームによって決まるプロパティの値が自動的に入力され、新しい値が生成される場合もあります。例えば、レイヤーの「回転」プロパティに対する次のエクスプレッションは、キーフレームを使用するモーションに加えて、「回転」プロパティの値に 90 度を加算します。

  value + 90

ウィグルなどの一部のメソッドは、プロパティのキーフレームを使用する値に対して直接作用します(プロパティの属性とメソッド(エクスプレッションのリファレンス)を参照)。

レイヤーの「位置」プロパティに次のエクスプレッションを設定すると、レイヤーのキーフレームを使用するモーションが保持され、レイヤーがわずかに揺れます。

  wiggle(10, 10)

注意:

通常は、ウィグラーよりも、wiggle エクスプレッションを使用する方が簡単です。

テキストをアニメートする場合、エクスプレッションセレクターでは、各文字にどの程度アニメータープロパティを適用するかを指定できます。1 つのアニメーターグループに 1 つまたは複数のエクスプレッションセレクターを追加でき、そのアニメーターグループに 1 つまたは複数のプロパティを指定できます

エクスプレッションの使用

エクスプレッションを作成するには、手動で入力するかエクスプレッション言語メニューを使用します。また、ピックウイップでエクスプレッションを作成したり、サンプルのエクスプレッションや他のプロパティからエクスプレッションをコピーすることもできます。

エクスプレッションを使用するすべての作業はタイムラインパネルでおこなえますが、エフェクトコントロールパネルでピックウイップをプロパティにドラッグする方が簡単な場合もあります。エクスプレッションは、エクスプレッションフィールドで入力および編集します。このフィールドは、時間グラフにあるサイズ変更可能なテキストフィールドです。エクスプレッションフィールドは、レイヤーバーモードではプロパティとともに表示され、グラフエディターモードではグラフエディターの下部に表示されます。テキストエディターでエクスプレッションを作成し、エクスプレッションフィールドにコピーすることもできます。エクスプレッションをレイヤープロパティに追加すると、初期設定のエクスプレッションがエクスプレッションフィールドに表示されます。この初期設定のエクスプレッションでは、特に処理は行われません。プロパティの値がそのまま設定されるだけです。このため、エクスプレッションを簡単に編集できます。

タイムラインパネル(レイヤーバーモード)に表示されるエクスプレッションのインターフェイス
タイムラインパネル(レイヤーバーモード)に表示されるエクスプレッションのインターフェイス

A. エクスプレッション使用可能スイッチ B. エクスプレッション実行後のグラフを表示ボタン C. ピックウイップ D. エクスプレッション言語メニュー E. エクスプレッションフィールド 

エクスプレッションの編集中は、プレビューは一切行えません。編集中はパネルの下部に赤いバーが表示されます。

エクスプレッションが含まれているプロパティの値は、赤かピンクで表示されます。

エクスプレッションを初めて使用する場合は、ピックウイップで簡単なエクスプレッションを作成してから、以下に示す簡単な演算子を使用し、その動作を調節すると良いでしょう。

記号

演算

+

加算

-

減算

/

除算

*

乗算

*-1

元のエクスプレッションと逆の演算を実行します。例えば、時計回りが半時計回りになります。

例えば、エクスプレッションの末尾に *2 と入力すると、動作が 2 倍になります。同様に、/2 と入力すると、動作が半分になります。

エクスプレッションの編集に慣れてきたら、これらの簡単な演算子を組み合わせて使用してみましょう。例えば、エクスプレッションの末尾に /360*100 と追加すると、範囲が 0 ~ 360 から 0 ~ 100 に変わります。この変更は、360 度回転のダイアルの値をパーセント表示するスライダーの値に変換する場合などに使用できます。

タイムラインパネルのエクスプレッション言語メニューには、エクスプレッションで使用できる、After Effects 固有の言語要素が表示されます。このメニューは、有効な要素や正しい構文を調べるのに便利で、使用可能な要素に関するリファレンスとして活用できます。このメニューからオブジェクトや属性、メソッドを選択すると、エクスプレッションフィールドの挿入ポイントに挿入されます。エクスプレッションフィールドのテキストを選択した状態でこの操作を行うと、そのテキストが新しいエクスプレッションテキストに置き換えられます。エクスプレッションフィールドに挿入ポイントがない場合は、フィールド内のすべてのテキストが新しいテキストに置き換えられます。

エクスプレッション言語メニューには、引数と初期設定値が一覧表示されます。エクスプレッションの記述時は、この一覧で制御できる要素を確認できます。例えば、言語メニューでは、プロパティカテゴリの wiggle メソッドが wiggle(freq, amp, octaves=1, amp_mult=.5, t=time) の形式で表示されます。wiggle に続くかっこの中には 5 つの引数が指定されています。最後の 3 つの引数で使用されている「=」は、それらの引数が必須引数ではないことを示します。これらの引数に値を指定しない場合は、初期設定の 1、0.5、および現在の時刻に設定されます。

注意:

エクスプレッション言語メニューを使用して挿入した引数名は、実際の値で置き換えます。

Jeff Almasol は、エクスプレッションを自動的に処理して特定の変更を加えるスクリプトを公開しています。例えば、スクリプトを使用して、無効になっているエクスプレッションを自動的に削除または有効化できます。

エクスプレッションエディター

エクスプレッションエディターのコードエディターインターフェイスをカスタマイズできます(カスタムカラー、行番号、コードの折りたたみおよびオートコンプリートによる JavaScript 構文のハイライトを含む)。これらのオプションをカスタマイズするには、環境設定/スクリプトとエクスプレッションを選択します。

スクリプトとエクスプレッションダイアログ
スクリプトとエクスプレッションダイアログ

エクスプレッションエディターコードインターフェイス

  • JavaScript 構文と After Effects のメソッドおよびプロパティをハイライトする構文をカスタマイズします。
    • 各構文、選択範囲および選択範囲のアルファ、背景をハイライトするためのカスタムカラーを割り当てることができます。スポイトアイコンをクリックして、カラーホイールからカラーを選択します。
    • 様々なテーマから選択して、エクスプレッションエディターの外観をカスタマイズできます。テーマドロップダウンメニューをクリックして、テーマから選択します。カスタムテーマを保存することもできます。
構文のハイライトをカスタマイズ
構文のハイライトをカスタマイズ
  • 環境設定を編集
環境設定を編集
環境設定を編集
  • 行番号を表示
  • タブまたはスペース
  • カスタムのタブ幅
  • Backspace によるインデント解除
  • インデントガイド
  • 中括弧:
    • 対応する中括弧の強調表示
    • 閉じ中括弧の自動挿入
    • 中括弧の自動インデント
  • 調整可能なフォントサイズ
  • コードの折りたたみ:
    • プラスとマイナス
    • 円形のツリー
    • 四角形のツリー
  • テキスト折り返し:
    • 単語
    • 文字
    • なし
  • オートコンプリート:
    • JavaScript 構文
    • After Effects のメソッドとプロパティ
    • 現在のプロジェクトで使用されているコンポジション、フッテージ、レイヤーおよびエフェクトの名前
    • カスタム変数の名前
  • オプションのインラインエラーメッセージ
  • コードプレビューボックス:構文のカラーおよびその他のエディター環境設定に対するすべての変更は、このコードプレビューボックスでライブプレビューできます。
コードプレビューボックス
コードプレビューボックス

ヒント:エクスプレッションをインラインでデバッグするには、throw を使用します。

throw でエクスプレッションをインラインでデバッグ
throw でエクスプレッションをインラインでデバッグ

エディターの仕組みを理解するには、以下の例を参照してください。

例 1:コードスニペットのエラーの表示。

  1. エクスプレッションスニペットを含むコンポジションを After Effects で開きます。

  2. タイムラインパネルで、レイヤーを選択して、Alt キーを押しながらクリックします。エクスプレッションエディターフィールドにエクスプレッションが表示されます。

    エクスプレッションエディターフィールド
    エクスプレッションエディターフィールド
  3. エディターフィールドをクリックして、編集モードに移行します。

    エディター内でクリックして、エクスプレッションエディターでの編集を有効にする
    エディター内でクリックして、エクスプレッションエディターでの編集を有効にする
  4. この例では、最初の行の MILE を選択して、小文字の mile に変更します。これにより、コード内でエラーが発生し、After Effects によってコードスニペット内にエラーメッセージが表示されます。

    コードスニペットに表示されたエラーメッセージ
    コードスニペットに表示されたエラーメッセージ

    また、エラーが発生した行番号に関する詳細を含むエラーバナーが表示されます。

    エラーバナー
    エラーバナー

例 2:一般的に使用されるコンポーネントに基づいた自動修正候補

  1. 同じエクスプレッションで、レイヤー名を mile から MILE に変更します。

  2. 入力するたびに、プロジェクトのレイヤー名から取り込んだ候補のセットを含むドロップダウンリストが表示されます。

    レイヤー名の自動修正候補
    レイヤー名の自動修正候補

コンポジション名、レイヤー名、フッテージ名およびエフェクト名は、すべてオートコンプリートに取り込まれ、それぞれ comp()layer()footage() および effect() メソッドの修正コンテキストに表示されます。これにより、プロジェクトでアイテムを参照する間、エクスプレッションのアクティブな状態を維持できます。タイムラインをスクロールしたり、他のパネルを開いたりして、ピックウイップを使用するプロパティやアイテムを参照する必要はありません。

エクスプレッションを追加、無効化、リンク、削除する

  • プロパティにエクスプレッションを追加するには、タイムラインパネルでプロパティを選択してから、アニメーション/エクスプレッションを追加を選択するか、Alt + Shift + = キー(Windows)または Option + Shift + = キー(Mac OS)を押すか、Alt キー(Windows)または Option キー(Mac OS)を押しながら、タイムラインパネルまたはエフェクトコントロールパネルでプロパティ名の横にあるストップウォッチボタン をクリックします。
  • レイヤーおよびコンポジションにまたがるプロパティのセットをリンクさせるには、プロパティリンクを使用します。
    1 つまたは複数のプロパティを選択して、編集/プロパティリンクと一緒にコピーまたは編集/相対的なプロパティリンクと一緒にコピーを選択し、それらのプロパティをコンポジションの任意のレイヤーにペーストします。元のプロパティに加えられた変更が、ペーストしたプロパティリンクのすべてのインスタンスに反映されるように、ペーストしたプロパティは、コピー元のレイヤーへの接続が維持されます。
    プロパティリンクを含めてレイヤー全体をコピーしてペーストし、元のプロパティに対して行われた変更に従う複製を作成することもできます。

    「相対的なプロパティリンクと一緒にコピー」コマンドは「プロパティリンクと一緒にコピー」コマンドと同じように機能しますが、「相対的なプロパティリンクと一緒にコピー」コマンドでは、名前別にソースコンポジションを参照しない式を作成します。これは、式のあるレイヤーとレイヤーが含まれるコンポジションの間の相対的なリンクを維持します。これは、例えば、1 つのコンポジションから別のコンポジションへ式で操作されるレイヤーを移動するものの、そのレイヤーが同じコンポジション内のコントロールレイヤーのみを参照する場合に使用します。「相対的プロパティリンクと一緒にコピー」コマンドを使用して作成された式は、式のピックウイップを使用して作成された式と同一です。

    「相対的プロパティリンクと一緒にコピー」コマンドでレイヤーの位置プロパティをコピーした結果は次のようになります。

    thisComp.layer("control_layer").transform.position

    「プロパティリンクと一緒にコピー」コマンドでレイヤーの位置プロパティをコピーした結果は次のようになります。式では特にレイヤーのソースコンポジションを参照しています。

    comp("source_comp").layer("control_layer").transform.position

  • エクスプレッションを一時的に無効にするには、エクスプレッション使用可能スイッチ をクリックします。エクスプレッションが無効になると、スイッチにスラッシュが付きます( )。
  • プロパティからエクスプレッションを削除するには、タイムラインパネルでプロパティを選択してから、アニメーション/エクスプレッションを削除を選択するか、Alt キー(Windows)または Option キー(Mac OS)を押しながら、タイムラインパネルまたはエフェクトコントロールパネルでプロパティ名の横にあるストップウォッチボタンをクリックします。

ピックウイップを使ってエクスプレッションを編集する

JavaScript または After Effects のエクスプレッション言語に慣れていない場合でも、ピックウイップを使用すればエクスプレッションの強力な機能を活用できます。プロパティのエクスプレッションを別のプロパティとリンクするには、プロパティのピックウイップ を別のプロパティにドラッグします。すると、エクスプレッションフィールドの挿入ポイントにそのエクスプレッションのテキストが挿入されます。エクスプレッションフィールドのテキストを選択した状態でこの操作を行うと、そのテキストが新しいエクスプレッションテキストに置き換えられます。エクスプレッションフィールドに挿入ポイントがない場合は、フィールド内のすべてのテキストが新しいテキストに置き換えられます。

ピックウイップをプロパティにドラッグする
ピックウイップをプロパティにドラッグして、プロパティの値にリンクする操作

ピックウイップはプロパティの名前または値までドラッグできます。プロパティの名前にドラッグした場合は、すべての値が 1 つの値としてエクスプレッションフィールドに表示されます。例えば、ピックウイップを「位置」プロパティの名前にドラッグすると、次のようなエクスプレッションが表示されます。

  thisComp.layer("Layer 1").transform.position

ピックウイップを「位置」プロパティのいずれかのコンポーネント値(この例では y 値)にドラッグした場合は、「位置」プロパティの x 座標と y 座標の両方が y 値に関連付けられ、次のようなエクスプレッションが表示されます。

  temp = thisComp.layer("Layer 1").transform.position[1]; 
  [temp, temp]

ピックウイップのドラッグ先でレイヤー、マスク、またはエフェクトの名前が重複している場合は、名前が自動的に変更されます。例えば、「Mask」という名前のマスクが 1 つのレイヤーに複数あり、ピックウイップをそのうちの 1 つにドラッグした場合は、そのマスクの名前が「Mask 2」に変更されます。

ピックウイップを使って作成するエクスプレッションの形式は、「エクスプレッションピックウイップによる簡潔な英語を記述」(編集/環境設定/一般設定(Windows)または After Effects/環境設定/一般設定(Mac OS)の設定によって決まります。初期設定では、ピックウイップは簡潔な英語のエクスプレッションを生成し、エクスプレッションに含まれるプロパティのタイムラインパネル名が使用されます。これらの名前は After Effects のアプリケーションコードに組み込まれている不変の名前であるため、別の言語で After Effects を実行した場合でも同じエクスプレッションを使用できます。変更可能なプロパティ名はすべて二重引用符で囲まれており、どの言語でも同じです。プロジェクトを複数の言語で使用しない場合は、この設定をオフにしてください。この設定は、エフェクトの名前やプロパティには影響しません。

次は、簡潔な英語で記述した名前の例です。

  thisComp.layer("Layer 1").transform.position

次は、簡潔な英語を使わずに記述した名前の例です。

  thisComp.layer("Layer 1")("Transform")("Position")

注意:

初期設定では、簡潔な英語が選択されているので、このマニュアルのほとんどの例では簡潔な英語の名前を使用しています。

  1. タイムラインパネルまたはエフェクトコントロールパネルで、ピックウイップを他のプロパティにドラッグします。
  2. 必要に応じて、エクスプレッションフィールドで初期設定のエクスプレッションを変更します。

注意:

ピックウイップを使用してあるレイヤーを参照するエクスプレッションを作成し、そのレイヤーの名前が同じコンポジション内の他のレイヤーと同じ場合、そのレイヤーの名前は、以前のレイヤー名の最後に数字が付けられた名前に変更されます。これにより、エクスプレッションはコンポジション内の 1 つのレイヤーを明確に参照できるようになります。

エクスプレッションを手動で編集する

  1. エクスプレッションフィールドをクリックして、テキスト編集モードに入ります。

    注意:

    テキスト編集モードになると、エクスプレッション全体が選択されます。既存のエクスプレッションに追加する場合は、追加位置をクリックして挿入ポイントを表示します。クリックしないと、エクスプレッション全体が置き換えられます。

  2. エクスプレッションフィールドで入力、編集します。この際、エクスプレッション言語メニューを使用することもできます。

    注意:

    複数行あるエクスプレッションの一部が見えない場合は、エクスプレッションフィールドの下部または上部をドラッグしてフィールドのサイズを変更します。

  3. テキスト編集モードを終了し、エクスプレッションを有効にするには、次のいずれかの操作をおこないます。
    • テンキーパッドの Enter キーを押します。

    • エクスプレッションフィールドの外側の領域をクリックします。

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

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

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

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

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

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

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

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

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

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

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

エクスプレッションとエクスプレッショングラフを表示する

グラフエディターモードでは、グラフエディターの下部に、選択したプロパティのエクスプレッションのみを表示するエクスプレッションフィールド(サイズ変更可能)が 1 つだけ表示されます。同時に複数のエクスプレッションフィールドを表示するには、タイムラインパネルをレイヤーバーモードに切り替える必要があります。

注意:

レイヤーバーモードとグラフエディターモードを切り替えるには、Shift+F3 キーを押します。

  • エクスプレッションが含まれるプロパティのみを表示するには、1 つまたは複数のレイヤーを選択し、E キーを 2 回押します。
  • グラフエディターにエクスプレッションフィールドを表示するには、グラフエディターの下部にあるグラフの種類とオプションを選択ボタン をクリックして、「エクスプレッションエディターを表示」を選択します。プロパティにエクスプレッションを追加したときは、この設定に関係なく、必ずエクスプレッションエディターが表示されます。

注意:

エクスプレッションフィールドのサイズを変更するには、レイヤーバーモードでフィールドの下端、またはグラフエディターモードでフィールドの上端を上下にドラッグします。

  • エクスプレッションによって値または速度のグラフがどのように変化するかを確認するには、グラフエディターで値グラフまたは速度グラフを表示しているときに、エクスプレッション実行後のグラフを表示ボタン をクリックします。

    灰色のグラフは、エクスプレッション適用前の値または速度を表し、鮮やかな色のグラフはエクスプレッション適用後の値または速度を表します。「位置」プロパティのグラフオーバーレイをオンにすると、コンポジションパネルのモーションパス表示も変化するので、エクスプレッションの影響を受けたパスを確認することができます。

注意:

タイムラインパネルの検索フィールドを使用して、エクスプレッションやプロパティのその他のコンポーネントを検索できます。検索文字列をエクスプレッションで指定すると、プロパティとプロパティのグループおよびレイヤーはフィルターされた検索結果セットに表示されます。

ソーステキスト用のエクスプレッションを記述する

エクスプレッションでは、テキストレイヤーの「ソーステキスト」プロパティが JavaScript の String オブジェクトとして扱われます。ピックウイップを使用して別のテキストレイヤーからソーステキストを取得することはできますが、この場合はエクスプレッションを加えたレイヤーの先頭文字のスタイルが全文に適用されます。

JavaScript String オブジェクトについて詳しくは、JavaScript の関連文書を参照してください。

文字列エクスプレッションでは「¥r」を使用してテキストで新しい行を開始できます。例えば、レイヤー上のテキストをコピーし、すべて大文字に変換してから同じレイヤー上の次の行に追加するには、次のようにエクスプレッションを記述します。

  text.sourceText + "\r" + text.sourceText.toUpperCase()

コンポジションにテキストレイヤーを追加し、その「ソーステキスト」プロパティにエクスプレッションを追加すると、他のレイヤーのプロパティ値が確認できて便利です。例えば、「ソーステキスト」プロパティに次のエクスプレッションを記述すると、すぐ次のレイヤーの「不透明度」プロパティの名前と値が表示されます。

  thisComp.layer(index + 1).name + "\rOpacity = " + thisComp.layer(index + 1).opacity.value

以下の例では、現在の時間でビデオスイッチがオンになっている一番上のビデオレイヤーの名前、あるいは、そのレイヤーがソースも持つ場合はソースフッテージの名前が表示されます。

  source_footage_name = ""; 
  for (i = 1; i <= thisComp.numLayers; i++){ 
      if (i == index) continue; 
      my_layer = thisComp.layer(i); 
      if (! (my_layer.hasVideo && my_layer.active)) continue; 
      if (time >= my_layer.inPoint && time < my_layer.outPoint){ 
          try{ 
              source_footage_name = my_layer.source.name; 
          }catch(err1){ 
              source_footage_name = my_layer.name 
          } 
          break; 
      } 
  } 
  source_footage_name

Aharon Rabinowitz が、Red Giant TV で、「ソーステキスト」プロパティとスライダーエフェクト(エクスプレッション制御エフェクト)を使用してビデオゲームスコアをアニメートする方法についてのビデオチュートリアルとサンプルを公開しています。

 

エクスプレッションにコメントを追加する

複雑なエクスプレッションを後で再利用できるように、エクスプレッションの処理や詳細などをコメントとして記述しておくと便利です。

エクスプレッションを保存して再利用する

エクスプレッションを記述したら、テキスト編集アプリケーションにコピー&ペーストするか、アニメーションプリセットまたはプロジェクトテンプレートに保存して、将来に備えて保存します。ただし、エクスプレッションはプロジェクト内の別のレイヤーと関連して記述され、特定のレイヤー名を使用する場合があるため、エクスプレッションを変更してプロジェクト間で転送する必要があります。

通常の JavaScript 関数構文を使用して、エクスプレッション内で独自の関数を定義できます。次の例では、2 つの値の平均を計算する関数を定義し、この関数を使用する最後の行を定義します。

  function average(a, b) 
  { 
    return (a + b) / 2; 
  } 
  average(position, thisComp.layer(1).position);

注意:

各関数は、使用する各エクスプレッション内で完全に定義する必要があります。関数を追加できるグローバルライブラリはありません。

他のプロジェクトで使用するためにエクスプレッションを保存する場合は、エクスプレッションにコメントを記述しておきます(エクスプレッションにコメントを追加するを参照)。また、何箇所も値を変更しなくて済むように、変数を使用することもできます。

例えば、次のエクスプレッションでは、先頭にエクスプレッションの処理についてのコメントを記述し、変数宣言および初期化の後にはその変数を説明する簡単なコメントを記述しています。

  /*  This expression on a Source Text property reports the name 
      of a layer and the value of its Opacity property. */  
    
  var myLayerIndex = 1; // layer to inspect, initialized to 1, for top layer  
    
  thisComp.layer(myLayerIndex).name + ": \rOpacity = " +   thisComp.layer(myLayerIndex).opacity.value

エクスプレッションを含むアニメーションプリセットをテンプレートとして保存すると、別のプロジェクトで再利用することができます。ただし、エクスプレッションがそのプロジェクトに存在するプロパティだけを参照する場合に限られます。プロパティにエクスプレッションが含まれていてキーフレームが含まれていないプリセットを保存した場合は、エクスプレッションのみが保存されます。プロパティに 1 つまたは複数のキーフレームが含まれている場合は、プリセットにすべてのキーフレーム値とエクスプレッションが保存されます。

レイヤープロパティのエクスプレッションを、プロパティのキーフレームと一緒に、またはキーフレームなしでコピーできます。

  • あるプロパティのエクスプレッションとキーフレームを別のプロパティにコピーするには、タイムラインパネルでコピー元のレイヤープロパティを選択してコピーしてから、コピー先のレイヤープロパティを選択してペーストします。
  • キーフレームを除き、プロパティのエクスプレッションのみを別のプロパティにコピーするには、コピー元のプロパティを選択し、編集/エクスプレッションのみをコピーを選択してから、コピー先のプロパティを選択してペーストします。

注意:

キーフレームなしでエクスプレッションをコピーする方法は、複数のエクスプレッションを 1 つまたは複数の新規レイヤーに同時にコピー&ペーストする場合や、1 つのエクスプレッションを複数のレイヤーにコピー&ペーストする場合に便利です。

注意:

キーフレームや他のアイテムをペーストするときと同様、通常は After Effects によってコピー先のプロパティが自動的に決定されます。この自動処理は、「位置」プロパティを別のレイヤーの「位置」プロパティにコピーする場合は問題ありませんが、「位置」プロパティから「スケール」プロパティにエクスプレッションをコピーする場合は、コピー先のプロパティを選択する必要があります。

Paul Tuersley は、エクスプレッションの管理と編集のための pt_ExpressEdit スクリプトを公開しています。

エクスプレッション制御エフェクト

エクスプレッション制御エフェクトを使用してコントロールを追加し、エクスプレッションを使ってプロパティをそのコントロールにリンクすることにより、1 つまたは複数のプロパティの値を操作することができます。1 つのコントロールで、一度に複数のプロパティを制御できます。

エクスプレッション制御エフェクトの名前は、エフェクトによって制御するプロパティの種類(角度制御、チェックボックス制御、カラー制御、レイヤー制御、ポイント制御、スライダー制御)を表します。After Effects CS5.5 以降にも、3D ポイント制御は含まれます。

注意:

アニメーションプリセット/Shapes/Backgrounds カテゴリからアニメーションプリセットを適用すると、エフェクトコントロールパネルにカスタムの「アニメーションシェイプ制御」エフェクトが表示されます。このカスタムエフェクトは、このようなアニメーションプリセット用に特別に作成された特殊なエクスプレッションコントロールエフェクトです。このエフェクトは、別のレイヤーにコピー&ペーストしたり、別の場所に適用できるようアニメーションプリセットとして保存したりできます。

エクスプレッション制御エフェクトをレイヤーに適用するには、他のエフェクトを適用するときと同じように、エフェクト&プリセットパネルからレイヤーにエフェクトをドラッグします。

エクスプレッション制御エフェクトはあらゆるレイヤーに適用できますが、ヌルレイヤーに適用して単なる制御レイヤーとして使用すると便利です。その後で、他のレイヤーのプロパティにエクスプレッションを追加し、この制御レイヤーから入力値を取得します。例えば、ヌルレイヤー(Null 1)にスライダー制御エフェクトを追加し、次のエクスプレッションを複数のレイヤーの「位置」プロパティに適用することができます。

  position+[0,10*(index-1)*thisComp.layer("Null 1").effect("Slider Control")("Slider")]

この例では、スライダーをドラッグすると、このエクスプレッションを含むすべてのレイヤーが動きます。各レイヤーは、インデックス番号が 1 つ小さいレイヤーから 10 ピクセルずつずれて表示されます(タイムラインパネルでは、上から下に向かってレイヤーのインデックス番号が大きくなります)。ヌルレイヤーでスライダーのキーフレームを設定すると、その他のレイヤーがそれに従ってアニメートされます。

これは、使用目的を表すためにエクスプレッション制御エフェクトの各インスタンスの名前を変更する場合に便利です。例えば、カラー制御エフェクトのインスタンスの名前を空の色に変更すると、制御するエフェクトの内容が簡単にわかります。エクスプレッション制御エフェクトの各インスタンスの名前は、その他のエフェクトの名前と同じように変更できます。タイムラインパネルまたはエフェクト制御パネルでインスタンスを選択し、Enter キー(Windows)または Return キー(Mac OS)を押します。

注意:

コントロールの値の範囲を変更するには、下線付きのプロパティ値を右クリックするか(Windows)、Control キーを押しながらクリック(Mac OS)し、コンテキストメニューから「値を編集」を選択します。

エクスプレッション制御エフェクトに関するその他のリソース

Jerzy Drozda, Jr.(Maltaannon が)Motionworks の Web サイトで、角度制御エフェクトとエクスプレッション制御エフェクトの概要に関する説明とデモを公開しています。

Todd Kopriva が、sampleImage メソッドとポイント制御エフェクトを使用して、指定した点のカラーをカラー補正時に監視する方法について After Effects Region of Interest ブログで説明しています。

エクスプレッションをキーフレームに変換する

エクスプレッションをキーフレームに変換すると便利な場合があります。例えば、エクスプレッションの値を固定する場合は、エクスプレッションをキーフレームに変換し、そのキーフレームを目的に応じて調整します。エクスプレッションの評価に長い時間がかかる場合は、エクスプレッションをキーフレームに変換すると、レンダリングにかかる時間を短縮できます。エクスプレッションをキーフレームに変換すると、そのエクスプレッションが評価されたあとに、フレームごとにキーフレームが作成されます。その後、エクスプレッションは無効になります。

  1. タイムラインパネルで、エクスプレッションが入力されているプロパティを選択し、アニメーション/キーフレーム補助/エクスプレッションをキーフレームに変換を選択します。

エクスプレッション言語

JavaScript 1.2 に基づく After Effects エクスプレッション言語には、一連の組み込みオブジェクトの拡張セットが追加されています。After Effects では、コアとなる標準 JavaScript 1.2 言語を使用しており、Web ブラウザー専用の拡張は使用していません。After Effects には、レイヤー、コンポジション、フッテージ、カメラなどの独自の拡張オブジェクトセットが組み込まれており、After Effects のプロジェクトのほとんどの値を取得できます。

エクスプレッション言語はスクリプト言語を基にしていますが、スクリプトとエクスプレッションには若干の違いがあります。その違いとは、スクリプトがアプリケーションに指示を伝えるのに対し、エクスプレッションはプロパティの設定内容を表す点です。

JavaScript についての詳細は、JavaScript のリファレンスマニュアルを参照してください。

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

  • エクスプレッションの値は、最後に評価されたステートメントの値です。

  • JavaScript は大文字と小文字を区別する言語です。

  • ステートメントや行の区切りにはセミコロンが必要です。

  • 単語間の空白文字は無視されます(文字列に含まれる空白文字を除く)。

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

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

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

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

  thisComp.layer("Layer B").effect("Gaussian Blur")("Blurriness")

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

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

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

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

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

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

  thisComp.layer("Layer B").effect("Advanced Lightning")("Origin")[1]

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

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

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

  thisComp.layer("Layer A").rotation

注意:

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

Jeff Almasol が、redefinery の Web サイトで、エクスプレッション内で任意のプロパティを参照する方法を指定できるスクリプトを公開しています。

配列と多次元プロパティ

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

  [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]10 で、myArray[1]23 です。

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

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

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

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

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

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

カラーは、4 次元の配列 [, , , アルファ] で表されます。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]

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

  [9, position[1]]

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

  x = thisComp.layer("Layer A").position[0];  
  y = thisComp.layer("Layer B").position[1];  
  [x,y]

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

  thisComp.layer("Layer B").scale[0]

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

  thisComp.layer("Layer B").scale[1]

また、Layer B の「スケール」プロパティから Layer A の「回転」プロパティにピックウイップをドラッグすると、自動的に変数が作成されて 「回転」プロパティの 1 次元の値が割り当てられ、その変数が「スケール」プロパティの両方の次元に使用されます。

  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").param("Get Phase From")  
  effect(1).param(2)

エクスプレッション時間

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

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

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

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

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

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

  comp("nested composition").layer(1).position

次のように、ネスト化されたコンポジションレイヤー 1 の source にアクセスすると、タイムリマップされた後の位置の値が返されます。

  thisComp.layer("nested composition").source.layer(1).position

注意:

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

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

エクスプレッションエラー

エクスプレッションの評価に失敗した場合、エクスプレッションエラーがコンポジションパネルおよびレイヤーパネルの下部にある警告バナーに表示されます。After Effects は、エクスプレッションを無効にしませんが、引き続き評価します。エクスプレッションの評価に失敗する限り(つまり、エクスプレッションが修正されるか、手動で無効にされるまで)、警告バナーが表示されます。

次の例は、エクスプレッションエラー警告バナーがどのように表示されるかを示しています。

エクスプレッションエラーの例
エクスプレッションエラーの例

A. 左向き矢印または右向き矢印ボタン B. エクスプレッションを表示 C. 警告を展開/折りたたむ 
  • 複数のエクスプレッションの評価が失敗した場合、左または右の矢印ボタンで、前または次のエクスプレッションエラーが表示されます。
  • エクスプレッションを表示(拡大鏡)ボタンは、失敗したエクスプレッションのプロパティをタイムラインパネルに表示します。エクスプレッションが別のコンポジションにある場合、そのコンポジションが開きます。
  • 警告を展開/折りたたむ(上向き/下向き矢印)ボタンは、エラーテキストを表示または非表示にします。

エクスプレッションエラーのテキストは、1 行のみで、コンポジションパネルの幅に合わせて省略されます。

エクスプレッションエラーのテキストをすべて確認するには:

エクスプレッションの隣の  をクリックします。すべてのエラーがダイアログボックスに表示されます。

警告バナーを非表示にするには:

After Effects(Mac OS)または編集(Windows)/環境設定/一般設定を選択して、「プロジェクトに式のエラーが含まれている場合に警告バナーを表示」を無効にします。

このオプションが無効な場合、新しいエクスプレッションエラーが発生しても、警告バナーは非表示のままです。

このオプションを再度有効にして、エクスプレッションエラーを表示します。

オンラインリソース

このセクションに記載されている例の多くは、Dan Ebberts によって提供された例に基づいています。Dan Ebberts は、MotionScript の Web サイトで、エクスプレッションの例とエクスプレッションの使用方法のチュートリアルも公開しています。

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

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー