dA-tools.com

HOME > AfterFx > expression > 実践 > 外部結合

外部結合

エクスプレッションの守備範囲は基本的に書かれているプロパティの中だけです。この項では外部に記述した関数やプリ・プロセスを使う方法を紹介します。(上級者向け)

  • エクスプレッションを使っていると、同じような処理を一箇所にまとめて記述しておけたら、と時々思います。(C-styleで言うと、外部ファイルのインクルード)
  • 同じようなことを世界のどこでも考えているようで、ベルギーのFilip VanduerenさんがCreativeCow.netのForumでその方法を提案してくれました。感謝感激です。

#include<テキストレイヤー> !?

  • ここで使うのはテキストレイヤーのソーステキストeval( )メソッドで、この2つには次のような特徴があります。
    • ソーステキストのエクスプレッションは値ではなく、文字列として解釈される。
    • eval( )は文字列を式として評価=実行することが出来る。
  • つまりソーステキストに関数やクラスの定義を書いて、それをエクスプレッション内でeval( )を使って実行させるのです。

例:同じ処理をまとめる

  • グローバルタイムライン実例編のInvers KinematiksLinkIconでコードの半分強を占めているのは三角の各辺の長さを求める処理です。その部分は複数のエクスプレッションが必要とするコードです。
  • そのブロックを抜き出してソーステキストに記述して各レイヤーから呼び出すようにしました。かなりすっきりー!です。

例:関数定義

  • グローバル関数タイムラインソーステキストに関数を2つ定義して別レイヤーからそのうちの1つの関数を使ってみました。引数を渡すこことも問題なくできます。
  • どうですか?面白いでしょう!
  • この方法を使えば、よく必要になる汎用的な関数や定数、構造体、クラス定義などをプリセットとして保存しておいてすぐに使うことが出来ます。
  • また、モーショングラフィック等でエクスプレッションを記述したレイヤーを何百も複製するような時にこの方法を使えば、一ヶ所で管理することが出来るので、変更や修正が簡単に出来ます。
  • ソーステキストに書くコードをテキストとして認識させるためにちょっとだけコツが必要です。それは「クォーテーションマーク(引用符)」[ ' ' ] [ " " ] を使い分けることです。
    • 上の例ではレイヤー名”upperArm"をダブル・クォーテーション、エクスプレッション全体をシングル・クォーテーション ' ' で括っています。同じクォーテーションを使うとはじめの文字からレイヤー名の前までが文字列だと認識されてしまいますね。
    • 文章に例えると‘He said, “I will come. ”'という感じですね。
    • CS4からは[""" … """]トリプル・クォーテーションも使えるようになりました。
  • eval( )の引数の最後は[ value ]でなくて[ toString() ]でもOKです。(SAKさん、情報ありがとうございます。)

もっと簡単に

  • 上の例ではコードをソーステキストにエクスプレッションとして書いていますが、テキストレイヤーに直接書けば普通の記述(全体を括るクォーテーション無し)でOKです。これが一番簡単です。ただ、コンポジション画像に重なったり、フレームに入りきらなかったりすることもあります。
  • くれぐれもテキストをレンダリングしてしまわないように。(^^;)