AfterEffects 6.0 : expression (1)

 今回はAdobe AfterEffectsで手抜きをします。AfterEffectsは映像合成ソフトであり、手作業でレイヤー(映像や画像)の位置を設定しエフェクトを指定するといった感じになります。気に入るまで(?)、変更がある度に手作業で行ってました、AfterEffects 4.1までは。
 5.0になって手作業では面倒な動き、例えば波打つように動かす、左右に反復運動する、ランダムに点滅するなど機械的な動きがexpression(エクスプレッション)で簡単にできるようになりました。expressionはバージョンを重ねるたびに少しずつ改良されてきています。今回はバージョン6.0で利用できる役立つかもしれない(?)expressionについて説明します。ちなみにexpressionの文法はJavaScriptと同じです。関数なども定義できますので、Webで使ったJavaScriptのノウハウが多少活かせるかもしれません。


●expressionの指定方法
 expressionを利用するにはexpressionを使いたいレイヤーのプロパティ(エフェクトプロパティでもOK)を選択してからメニューから「アニメーション」→「エクスプレッションを追加」を選択します。するとプロパティの部分にexpressionが入力できるようになります。Mac版の場合はreturnキーで改行しenterキーで決定になります。この時に入力ミスや間違いがあるとエラーが表示されます。再度入力しなおすか、とりあえず無視する(無効になる)ことができます。


●永久に回転し続ける
 永久にレイヤーを回転させてみましょう。これは回転の部分に以下の1行を書きます。

time;

 1行であればセミコロンは不要ですが、後々のため記述するようにすると良いでしょう。実際に再生してみると、レイヤーが緩やかに右に回転します。左回転させるには以下のように先頭にマイナスを指定します。

-time;

 しかし、どちらも非常にゆっくりと回転していて期待どおりの回転速度ではないかもしれません。そんな場合は以下のように*を使って乗算します。

time * 10;

 これで先ほどの10倍速で回転します。ちなみに、このtimeは現在の再生時間が入っているexpression独自のプロパティです。1秒であれば1、10秒であれば10が入ります。0.5秒なら0.5です。動きのある表現のほとんどは、このtimeプロパティを使って表現します。
 手作業でやるよりも簡単ですね。特にコンポジションの長さが変わったり変更が多い場合に威力を発揮します。


●ランダムに点滅させる
 手作業では面倒すぎるのがランダムな点滅です。expressionには、たくさんのランダム関数が用意されているので非常に簡単にできてしまいます。不透明度の部分に以下のように書くと50%〜100%の範囲でランダムに値が設定されます。

random(50, 100);

 50%〜100%でなく、0%か100%でランダムに点滅させたい場合には以下のように書きます。

Math.floor(random(2)) * 100;

 Math.floor()は小数点以下を切り捨てる命令です。ランダムな値は0以上2未満なので切り捨てることで0か1になります。あとは100倍すれば0か100になります。0%か50%にしたい場合には50を乗算すればOKです。


●ゆっくり点滅させる
 チカチカ点滅させるのではなく、ゆっくり点滅させることもできます。この場合は三角関数を使います。以下のようにすると時間に応じて、レイヤーがゆっくり点滅します。

Math.sin(time*2) * 100;

 もっと早く点滅させたいならtime * 2をtime * 4のように値を変えます。100は最大不透明度です。他にも以下のように書くと警告ランプが点滅しているような感じになります。

Math.abs(Math.sin(time*6)) * 100;

 もっと単純に1秒ごとに点滅させるならば以下のように書きます。

(time & 1) * 100;


●上下にゆっくりと揺動させる
 回転や不透明度だけでなく位置を変更することもできます。ただし、位置の場合には三次元レイヤーの場合と通常の二次元レイヤーの場合で書き方が変わってきます。今回は通常の二次元レイヤーとして説明します。二次元レイヤーだとX座標とY座標の2つがペアになっており、position配列の最初がX座標、次がY座標になっています。座標を設定する場合にも配列で返す必要があり[X座標, Y座標]のように指定します。
 以下のサンプルはレイヤーを上下に揺動させるものです。ゆっくり点滅させる項で説明した命令と、ほとんど一緒です。

x = position[0];
y = Math.sin(time * 4) * 50 + 60;
[x,y];

 こういう動きは手作業では難関です。左右に揺動させる場合には以下のようになります。

x = Math.sin(time * 4) * 50 + 80;
y = position[1];
[x,y];

+60、+80は揺らす中央の基準座標です。これだとコンポジションのサイズが変わってしまうと、その度に変更しないといけません。が、ちゃんとコンポジションの横幅などを取得することもできます。


[サンプルをダウンロード]