見出し画像

【DaVinci Resolve】エクスプレッションでプログレスバーを作る【Fusion】

こんにちは、OMAです。
InterBEE 2024 Blackmagic Designブースのシアターコーナーにて「Fusionモーショングラフィックス 10Tips」と題して、Fusionでモーショングラフィックスを作る上で役立つTipsを紹介しました。
その中でエクスプレッションの紹介もしましたが、例として「コンポジションの長さに自動で合うプログレスバー」を作りました。
せっかくなので、noteの方ではエクスプレッションの式をどういう風に考えて書いたのか?を書き残したいと思います。


エクスプレッションとは

ノードのパラメーターを数式やスクリプトで制御できる機能です。これにより、アニメーションの作成やパラメータの自動化を効率的に行うことができます。
主に「四則演算」「関数」「他パラメータの参照」を組み合わせて記述します。
エクスプレッションを有効にしたい場合は、有効にしたいパラメーターを右クリックし「エクスプレッション」をクリックするか、数値入力欄で「=」と入力してEnterキーを押します。

どんな映像が作りたかったか

コンポジションの始まりから終わりにかけて進むプログレスバー。バーのアニメーションをエクスプレッションで制御していて、尺が変わったらアニメーションも自動で追従してくれます。
つまり10秒なら10秒、5秒なら5秒で完了するプログレスバーです。

望む計算結果

まず、作りたい映像のためにどんな計算結果があればいいのか?を考えます。
エクスプレッションを使わずに手付でテストしてみます。

BackgroundとRectangle×2でプログレスバーを作成

今回はBackgroundとRectangle(同じ大きさのもの2つ)ツールを使ってバーを作成しました。2個目のRectangleのペイントモードを「Minimum」にすることで、2つのRectangleが重なり合った部分だけ表示されるようになっています。
2個目のRectangleのセンターXを手動で左右に動かしてみると、以下のような計算結果があれば期待した動きを作れそうだと考えました。

-- 0フレームの時
0.5 - Rectangleの幅

-- 最後のフレームの時
0.5

「0.5」は、Rectangleの位置の中央です。つまりセンターXが0.5のとき2つのRectangleの差分はないためプログレスバーは100%になりますね。
また、幅の分だけ左にオフセットさせれば、プログレスバーは0%になるため、「0.5 - Rectangleの幅」となります。
ではこの二つの条件を満たし、且つ開始フレーム -> 終了フレームの計算結果にシームレスに移行するにはどういった式を書けばよいか?を次に考えていきます。

必要な式

0.5 - Rectangleの幅 * (開始フレームで1 → 終了フレームで0)

Rectangleの幅を開始フレームではそのまま、終了フレームにむけて0になるようにすれば良さそうです。
つまり、開始フレーム 1 → 終了フレーム 0になるような式をRectangeに対して乗算すれば良いですね。
しかし「開始フレーム 1 → 終了フレーム 0になるような式」を含め、必要な式を書くにはどんな要素が必要なのでしょうか?

必要な要素

  • Rectangle.Width: Rectangleの幅

  • time: 現在のフレーム

  • comp.RenderEnd: コンポジションの最後のフレーム

「time」は現在のフレームを数字で表す関数です。0から始まり、再生が進むごとに増え、最終フレームで「comp.RenderEnd」と同じ数値になります。
ということは「time」を「comp.RenderEnd」で除算すると「開始フレーム 0 → 終了フレーム 1」になります。

-- 開始フレーム 0 → 終了フレーム 1
time / comp.RenderEnd
Text+をコンソール代わりにしてエクスプレッションの確認を行っている

ちなみに記述したエクスプレッションの結果(数値)を確認したいとき、僕はText+のテキスト入力欄のエクスプレッションを有効にしてそこに記述するようにしています。コンソール代わりですね。

計算結果は惜しいですね。求める結果とは逆に0 → 1に変化しています。
「開始フレーム 1 → 終了フレーム 0」にするために1から引く式にして、1 → 0の変化にします。

-- 開始フレーム 0 → 終了フレーム 1
1 - time / comp.RenderEnd

これで「開始フレーム 1 → 終了フレーム 0」になる式ができました。
ではこれを数式に組み込みます。

完成した式

0.5 - Rectangle1.Width * (1 - time / comp.RenderEnd)

エクスプレッションの四則演算は、通常の計算順序通りに計算されるので、適宜()で囲ってあげる必要があります。
また、実際にRectangleのセンターに記述する際は、Xだけでなく、Yも記述しなければなりません。Yの方はエクスプレッションを書く前に手動で設定しておきました。
※Xの入力欄でエクスプレッションを有効にするとYは元の数値が引き継がれる
それを踏まえて、実際に記述したエクスプレッションは以下の通りです。

Point(0.5 - Rectangle1.Width * (1 - time / comp.RenderEnd), 0.0374015748031)

まとめ

いかがでしたでしょうか。
エクスプレッション、慣れないと難しく感じますし、いまだに1から考えるのは面倒だなぁと思いますが、「作りたい映像を実現する計算結果」を考え「必要な計算」と「必要な要素」を書き出すことで、ちょっとだけ楽に書ける気がしています。
どんな関数があるのか、エクスプレッションに使えるパラメーター名はどうなっているのかなどを把握する方が難しいかもしれないと思う今日この頃です。
今回の記事はチュートリアルというより、僕の思考メモみたいなものになりますが、エクスプレッションを考える際の参考になれば幸いです。
それでは。

いいなと思ったら応援しよう!