見出し画像

【DaVinci Resolve】計算の順序の検証

まえがき

どうも、火注ゆかなです。
9月になってようやく暑さがマシになってきましたね。その代わりというか、最近は台風やらなんやらで雨が多い時期でしたが。

今回のテーマは計算の順序です。
といってもこれだけでは伝わりませんね。
まえがきで書くにはちょっと長いので、さっさと本文に進みましょう。



自動計算ができる機能

DaVinci Resolveにはコントロールの値を自動で動かすための機能がいくつか存在します。
例えば、画像を左右に揺らしたいとき、1フレームごとにクリップを分割して、クリップ一つ一つに値を設定するのは現実的ではありません。
計算とかでまとめて設定したいところです。

そのための機能が以下の5つです。

  • スクリプト

  • キーフレームアニメーション(キースプライン、ベジェスプラインとも)

  • モディファイア(Fuseプラグイン)

  • エクスプレッション(数式)

  • フレームレンダースクリプト(InToolスクリプト)

キーフレームアニメーションは基本ですね。特定のフレームに値を設定し、指定したキーフレーム間の値も補間してくれます。
それからエクスプレッションも使ったことがある人は多いでしょう。
他のコントロールの値に連動させるとか。

スクリプトも使った人はいるはず……というか、私の記事を普段から読んでいらっしゃる方々なら大体は触れたことはありますよね。
Lua・Pythonで記述したコードでアプリを操作できます。これはタイムラインに配置したクリップのコントロール値も弄れます。Text+テンプレートを利用した字幕の自動配置とかはスクリプトによるものです。

モディファイアはいわゆるプラグインと呼ばれるものです。DaVinci ResolveではFuseの一種です。
これはコントロールにつき一つ設定可能で、モディファイアによって自動で値を変更することができます。
(モディファイアのコントロールに別のモディファイアを設定、という入れ子みたいなこともできます)

モディファイアはLuaで自作可能です。
簡単なものですがこんな風に動かしたりもできます。

最後にフレームレンダースクリプトですが、これはレンダリング時に実行されるスクリプトです。公式のマニュアルでInToolスクリプトと呼んでいるものの一種。
インスペクタの「設定」ページから記述できます。

フレームレンダースクリプトの記述欄

Fusionのノード単位で設定できる代わりに、タイムライン上の他のクリップには干渉できません。一つのクリップ、一つのマクロで完結するような処理に向いてますかね。

ただし、1フレームごとに処理するのでレンダリング負荷が増えるという欠点もあります。

さて、ここからが本題です。
これらの計算はどのような順序で行われるのでしょうか?

ということで検証していきましょう。



計算の順序の検証

前提条件

スクリプトは手動実行したタイミングで処理されるので、検証から除外します。
また、キーフレームアニメーションとモディファイアは片方しか設定できません。

キースプラインの設定をしているとモディファイアは選択できない

というか、Fusion8_Scripting_Guideを読む限りではキーフレームアニメーション(ベジェスプライン)はモディファイアの一種です。

BezierSpline
class BezierSpline
Parent class: Spline
Modifier that represents animation on a number value input.
Keyframes are interpolated with a bezier spline.
To animate Points use a Path instead.

(Google翻訳)
数値入力のアニメーションを表す修飾子。
キーフレームはベジェ スプラインで補間されます。
ポイントをアニメーション化するには、代わりにパスを使用します。

https://documents.blackmagicdesign.com/UserManuals/Fusion8_Scripting_Guide.pdf

キーフレームアニメーションはスプラインエディタで直感的に設定できますし、使う機会も多いです。
そういう理由でアプリから使いやすいように特別扱いされてるだけで、内部的にはモディファイアの一種である……として扱われてるんじゃないでしょうか。たぶん。

今回の検証では片方調べれば十分と判断し、キーフレームアニメーションではなく自作のモディファイアを使用します。
(そっちの方が設定する必要がなくて楽だし)
モディファイアを設定すると、その出力に応じてスプラインエディタも変化してるので大丈夫なはずです。

というわけで、モディファイア、エクスプレッション、フレームレンダースクリプトの3つの計算順序を調べる形になります。

今回は画像の位置とサイズを変更します。

  • モディファイア(フレームに応じてSin波の動きをする)でサイズを変更する

  • エクスプレッションで位置座標Xをサイズに同期させる

  • フレームレンダースクリプトでサイズを変更する


検証結果

で、それを再生した結果がこちら。

サイズは変わらず、位置だけが左右に揺れていますね。

処理を順番通りに並べ替えると

  1. モディファイアでサイズ変更

  2. サイズをエクスプレッションで読み取り、位置座標Xが変更

  3. サイズをフレームレンダースクリプトで上書き

  4. 計算結果(レンダリング結果)を表示

順番としてはモディファイア→エクスプレッション→フレームレンダースクリプトになりました。


おまけ

キーフレームアニメーションとモディファイアのどちらかと、エクスプレッションは同時に設定できます。
同時に設定した場合はエクスプレッションが優先されるようです。

検証結果からしてもエクスプレッションの方が後に評価されてるので、これも当然の結果でしょう。

スプラインエディタに表示される波形がモディファイアのSin波じゃなく、エクスプレッションの参照先の値(固定)になってる

まあ、自動計算するときはどれか一つで十分なので、わざわざ両方を設定する必要はありませんし、設定しようとする人もいないとは思いますが。



あとがき

今回は短めですが、これで終わりです。
Fuseプラグインの作成方法を調べている途中で計算の順序がなんとなく気になって調べたものです。

検証結果も大体予想通りでしたが、一応振り返れるように整理しておこうと思って記事にしました。
なんだかんだで、過去に投稿した記事に助けられることも多いので。念のため。

今回の記事も皆様のお役に立てば幸いです。



サポートしていただけるとその分の価値を提供できてるんだなって励みになります。