目次 [ Contents ]
Fusionでエクスプレッションを覚えると、かなり作業時間の短縮が出来ます。AfterEffectsにも同様の機能がありますが、Fusionの構造上、習得することで得られる恩恵は格段に違うかと思います。
ここでは何か一つの完成イメージを組み立てていくと言うより、簡単な例と共にエクスプレッションの使い方・基本を書いていきたいと思います。
エクスプレッションとは
「エクスプレッション – Expression」はツール上にあるパラメータ値を、他の項目から参照したり、計算式を当てはめたりして、アニメーションを自動化する簡易的なプログラミング機能です。Fusionはパラメータが多いので、1つずつ細かい動きのキーフレームを付けていくと大変ですが、エクスプレッションを使うと、一瞬で条件に沿ったアニメーションをさせたり、修正することが出来たりします。
突き詰めていくと習得に相当時間がかかり、自分もまだ浅い部分の知識しかありません。ただ、基本的な部分は簡単に扱えるようになっているので、ちょっと慣れるだけで合理的に作業が進められるようになると思います。
使用方法
エクスプレッションを使いたい時はまず「有効」にします。例として3Dオブジェクトをひとつ作り、その数値変化に対して別パラメータをリンクさせてみます。
「Shape3D1」を作成。「Shape」を「Cube」に。
「Translation」タブの「Y Offset」上で、右クリック。「Expression」を選択。
出てきたテキストウインドウ内に参照先や数式を書いていきます。
もし「エクスプレッション」を「無効」にしたければ、再度、右クリックで「Remove Expression」を選択します。
ドラッグによる参照指定(同じタブ内)
では、手始めに、「X Offset」の数値を参照して「Y Offset」のパラメータがリンクするようにします。
文法に沿って具体的なパラメータ名を打ち込む方法もありますが、まずは一番簡単なドラッグによる指定をしてみます。エクスプレッション用のテキストウインドウ左にある「+」をドラッグし、「X Offset」のタイトル上で離します。ウインドウ内に指定したリンク先「Transform3DOp.Translate.X」が書き込まれます。
「X Offset」スライダ(スクリューコントローラー)を動かすと、数値(横位置)に沿ってオブジェクトの縦位置(Y Offset)も変化します。
四則計算
エクスプレッションには計算式も書き足せます。例えば、書かれた参照先の後に、
Transform3DOp.Translate.X+0.1
とすれば、Offset Yの値はX Offset値の「0.1」増加された状態に。つまり参照数値をシフトさせる事が出来ます。また、参照先同士でも計算式が組めます。例えば、
Transform3DOp.Translate.X+Transform3DOp.Translate.Z
とすれば、X OffsetとZ Offsetを足した数値がY Offsetに適応されるわけです。
もう一例。「X Rotation」のエクスプレッションを有効にし、「X Offset」を参照させます。更に、テキストボックス内をクリックして「*360」を追記します。計算式のごとく、「X Offset」の数値が1.0ポイント増減するごとに1回転するようになります。
こんな感じで、計算式を使い、相対的な変化量を当てはめられます。
+ | 足し算 |
---|---|
– | 引き算 |
* | 掛け算 |
/ | 割り算 |
x % y | xをyで割った余り |
x ^ y | xのy乗 |
その他、数学関数なども使用可能です。具体的な関数はこちらを参照してください。
ドラッグによる指定(同タブ上にない時)
参照したいパラメータが別のタブにある場合は、ドラッグをタブ上に持っていき、少し待ちます。するとそのタブ項目に切り替わるので、そのまま同様に指定したいパラメータまで持っていって離せばいいだけです。
試しにControlsタブの「Size」もX Offsetにリンクさせてみてください。
ドラッグによる指定(同ツール上にない時)
参照したいパラメータが別のツールの場合は、Flowウインドウで複数選択してから、同様な操作をします。例として新規の「Shape3D2」を作成します。「Shape」を「Cone」に。
Flowウインドウ上で、ドラッグ操作しツールを複数選択。
するとコントロールウインドウ上にも、複数現れます。
後は、同様のドラッグ操作で希望のパラメータを指定できます。「Shape3D2」から、この「Shape3D1」へ「+」を持って行けば、パネルが切り替わります。
試しに「Shape3D2」の「X Rotation」を、同様に「Shape3D1」の「X Rotation」へ追従させてみてください。
参照先のテキスト指定
「+」ドラッグで指定すると、自動的に文字列の参照先が表記されますが、これを直接打ち込むことでも指定できます。何度かやって何となく分かって来たと思いますが、ルールとして大きな指定先から、「.」で区切って詳細を絞っていきます。「ツール」の「タブ」の…と言った感じです。
Shape3D1. | Transform3DOp. | Translate. | Y |
ツール名 | タブ名 | 項目 | パラメータ名 |
同じツール内の場合にはツール名は省略できます。(ちなみに、これら「タブ~パラメータ」とかの名称は便宜的に言っているだけで、ソフトウェア上の正式名称とは限りませんので、あしからず。)
- アルファベットの大文字小文字の違いは識別される。
- 半角スペースは識別されない。ただし、全角スペースはエラーになる。
- 項目表記は「Translation」、指定時は「Translate」、と違う場合がある。
などに注意してください。書き方に関しては全く違ったりする場合もあります。
.Translate.X~Z | 3D X,Y,Zポジション |
---|---|
.Rotate.X~Z | 3D X,Y,Z回転 |
.Point(x,y) | Center, Pivotなど、2Dツールのx,y位置 |
Text(“aaaa“) | 文字列「aaaa」 |
time | 現在フレーム |
畢竟、分からない場合は、「+」ドラッグで拾ったほうが早いです。
time
timeはタイムルーラーの現状フレームをそのまま数値として返す変数です。試しに任意のエクスプレッションを有効にして、「time」と入力すると、現在いるフレーム位置がそのまま数値として連動します。
特定時間の値を参照する
今まで説明した参照方法はリアルタイムでのやり方です。常に「参照先の現状値」を軸にすることしか出来ません。じゃあ、違う時間(フレーム時)の値を拾いたい場合はどうするか?残念ながらtimeだけでそれは出来ません。
GetValue()という関数を併用します。
が、その前に、まず「Shape3D1」の「X Offset」をアニメーションさせます。
これで、1秒間で「Shape3D1」のX位置が1ポイント分移動するアニメが出来ました。
では、「X Rotation」のエクスプレッションを以下のように書き換えます。
(Shape3D1:GetValue(“Transform3DOp.Translate.X”,time)) * 360
さっきまでと何ら変化がありません。これは「参照先の現在値」を取得しているためです。GetValueの書き方は下記のような感じになっています。
Shape3D1 | :GetValue(“ | Transform3DOp.Translate.Y | ”, | 数値 | ) |
参照ツール名 | 参照先名 | 時間 |
timeは現在フレームの値なので、差分を書き足せば相対的な時間の「値」を取得できるようになります。つまり、現在より20フレーム前のX Offset数値を拾いたければ、「time-20」とするだけです。
-20~0フレームはキーフレームを作っていないので回転せず、20フレーム目から「20フレーム前(つまり、0フレーム)のX Offset値」に倣って回転し始めます。
条件式
プログラミング言語で基本のif文もエクスプレッションに組み込めます。ただし、比較演算式の場合は「iif」になるという所、「=」も「==」も同じという所に注意してください。
if(c, x, y) | もしcがfalseでなければx、違えばyを返す |
---|---|
iif(a+b == c, x, y) | 条件式(a+b==c)がtrueがならばx、違えばyを返す |
x = y , x == y | xとyが同じならtrue、違えばfalseを返す |
x <> y , x != y | xとyが違えばtrue、同じならfalseを返す |
x < y | xがyより小さいならtrue、違えばfalseを返す |
x > y | xがyより大きいならtrue、違えばfalseを返す |
x <= y | xがyと同一、又は小さいならtrue、違えばfalse |
x >= y | xがyと同一、又は大きいならtrue、違えばfalse |
x & y , x && y | xとyが共にtrueならtrueを返す |
x | y , x || y | xとyのどちらかがtrueならtrueを返す |
!x | 値xがfalseならtrue、trueならfalseを返す |
「Shape3D1」のScaleを、「X Offsetが特定の数値までは一定サイズ、その後大きくなっていく」という風にしてみます。
まず、「Scale」のエクスプレッションを単純なX Offset参照に戻しておきます。
Transform3DOp.Translate.Y
この状態では0フレーム目の値が0.0なので、最初はオブジェクトが見えません。
例えば、「X Offsetの値が0.5になるまではサイズが0.5のまま、それ以降はX Offsetに倣っていく」といった感じにするために、iifを使って下記のように書き換えます。
iif(Transform3DOp.Translate.X<0.5, 0.5, Transform3DOp.Translate.X)
0フレームの時でも、0.5の大きさで表示されるようになります。
User Controls
例えば、「1.0ポイント毎で360度」と言うエクスプレッションの回転数値を、マウスのドラッグ操作でも変更出来たら楽です。しかし、エクスプレッションを有効にしてしまうと、そのパラメータのグラフィカルな部分は操作できなくなってしまいます。
が、Fusionでは「カスタムコントローラ」で独自のパラメータを追加できるので、グラフィカルな操作をそれに代理させることが出来ます。
カスタムコントローラの追加
コントロールウインドウ上で、パラメータがかぶらない部分を右クリックします。
「Edit Controls…」を選択。
新規に作るコントロールの名前をName:でつけます。分かり易いよう「Sft_Rote」としておきます。
数値を扱いたいので、Type:を「Number」にします。
Page:でツール上のどのタブに作成するか設定します。本来は混乱しないよう「User」タブに追加するのが好ましいですが、扱い易いよう、敢えて3D(Translation)タブにします。
Input Ctrl:で入力方法を指定します。シンプルな「SliderControl」しておきます。
その他、可動範囲や初期値などの設定をします。
- Range:コントローラの初期可動範囲。プラマイ2回転動くよう、-720から720にします。
- Center:コントローラ表示上の中心。左右で均等になるよう0にします。
- Default:リセット時の初期位置。360度/1回転を初期値にするため360にします。
- Integer:小数点以下を扱うかの設定。ここでは整数だけにするためチェックします。
Translationタブ下部に新しいスライダーが出来ました。
後は、新たに「Y Rotation」のエクスプレッションを有効にして、これに絡めてX Offsetとリンクするよう書き換えます。
Transform3DOp.Translate.X*Sft_Rote
再生しながら、「Sft_Rote」スライダーを動かして、回転度合いが変えられることを確認してみてください。
こうしたカスタムコントローラはアニメーション出来るのは勿論、様々な形式のものが作れます(テキストボックス、チェックボックス等)。
カスタムコントローラの削除
こうやって作ったカスタムコントローラは、再度「Edit Controls…」で修正することは出来ますが、Fusion上で削除する方法はないようです。ですが、これらはそのツール内のみの設定なので、「コントローラを作りすぎたので消したい」場合、新規ツールを作り直せば「無かった」事にできます。
ただし、キーフレームを作り直す必要もあります。もし、それが大変であれば、一旦設定ファイルとして書き出した後に直接中身を書き換える事で、「コントローラ」を消すことは出来ます。
Flowウインドウ上で、そのツールを右クリックし「Settings」から「Save As…」を選択します。
保存したセッティングファイルを任意のテキストエディタで開きます。「UserControls…」の箇所を探し、その括りを消去してから上書き保存します。
先ほどと逆で、「Settings」から「Load…」で上書きしたSettingファイルを選択します。ツールの設定がマルッと塗り替えられます。
Fusionの設定ファイルやプロジェクトファイルは、こんな風に理解できるスクリプト形式で書かれているので、直接書き換えられ便利です。ただし、プログラミング知識が全くない状態だと、ファイル自体を壊してしまう恐れもあるので要注意ですが。
また、Save as…とLoad…に関しては、ツールの設定・アニメーションを「お気に入り」として保存、読み込みさせられる機能なので、覚えておくといいかと思います。
Fusionだと、エクスプレッションが「1.0」とか「-5.0」みたいな相対的な整数処理で扱えるし、コントローラーが自由に作れたりと柔軟です。そこら辺で「AfterEffectsより、ざっくりと作業できていいなぁ」と個人的には感じます。