コピペで簡単!FusionのExpression解説まとめ
DaVinci ResolveのFusionで使えるExpressionを紹介します。サンプルコードをコピペして使いたい人は目次から飛んでください(PCのみ)。
Expressionとは?
変数や数式を用いて値を変化させることができるFusionの機能です。簡単な例をいくつか書き出します。
- 「図形のwidthとheightを常に同じ値にする(値の参照)」
- 「3秒後にテキストを赤く、5秒後にはオレンジにする(条件分岐)」
- 「徐々に図形を大きくする(時間経過で変化)」
Expressionの基本
Expressionの使い方
Expressionは、変化させたいパラメータ毎に割り当てます。変化させるパラメータ名を右クリックし、「Expression」を押すことで使えます。
右クリックが面倒な場合は値の入力欄に=
(半角のイコール)を入力してからEnterを押せば同様にExpressionが使えます。
表示された入力欄に数式を書いていきます。次の画像がその例です。
Expressionを削除する場合は同様に右クリックして「Remove Expression」を押せば解除できます。
基本の書き方
Expressionの書き方を紹介します。
Expressionの実体はLuaというプログラミング言語ですが、Expression固有の書き方がいくつかあるため注意が必要です。
数値
一番簡単なのは数字です。そのまま書くだけです。
数字は四則演算ができます。()
を使って式の優先順位を変更できます。
--
(半角ハイフン2個)以降はコメントとして扱われるため、無視されます。
文字列
文字列の場合は"xx"
や'xx'
のようにダブルクオートかシングルクオートで囲みます。
文字列を連結させたいときは..
を使います。
参照
ノードの別のパラメータを参照するには、ノード名.パラメータ名
のように書きます。次の例はBackground1
というノード名のRedの値を参照しています。
名前の確認は簡単です。確認したいパラメータ名の上にカーソルを置くと、画面の左下に小さく名前が表示されます。
同じノード内ならノード名の部分は省略可能です。たとえば、青を赤と同じ値にしたければTopLeftRed
と入力するだけです。
条件分岐
「もし〇〇だったら」という条件分岐を書くにはiif
を使います。if
ではなくiif
です。誤字ではありません。
この==
の部分は条件を表します。==
のように全角で書いてはいけません。半角です。
書き方 | 条件の内容 |
---|---|
a == b | aがbと等しい |
a ~= b | aがbと等しくない |
a > b | aがbより大きい |
a >= b | aがb以上 |
a < b | aがbより小さい |
a <= b | aがb以下 |
数学チックになってきましたね。複数の条件を組み合わせることもできます。
書き方 | 条件の内容 | 例 |
---|---|---|
条件1 and 条件2 | 条件1かつ条件2の時 | a == b and a == c |
条件1 or 条件2 | 条件1または条件2の時 | a == b or a == c |
not 条件1 | 条件1ではない時 | not a == b |
特別な表現
DaVinci Resolve側で用意されている特別な表現を紹介します。
書き方 | 内容 |
---|---|
time | 現在のフレーム番号 |
comp.RenderEnd | 最後のフレーム番号 |
Point(x, y) | 座標を表すペアの数値の表現 |
座標はx
とy
の値がセットで書きます。
数学チックな奴らも一部紹介します。
書き方 | 内容 |
---|---|
sin(x) 、cos(x) 、tan(x) | 三角関数 |
pi | 円周率 |
ceil(x) | 切り上げ(ceilは天井) |
floor(x) | 切り捨て(floorは床) |
abs(x) | 絶対値 |
max(x, y) | 大きい方を返す |
min(x, y) | 小さい方を返す |
サンプルコード
0から1まで増える
0から1まで増えるExpressionです。必要に応じて四則演算してください。
まずは等速バージョン。
徐々に加速するバージョン(二次関数)。
x軸を時間、y軸を出力される値としてグラフにするとこんな感じ。
急→緩やか(平方根)バージョン。
時間が立つにつれて緩やかになる。
0から100まで
単純に掛け算です。プログレスバーでよく使います。
「0から1まで増加」を繰り返す
fps
はプロジェクトのフレームレートを入れてください。comp:GetPrefs().Comp.FrameFormat.Rate
でも取得できますが、長いので値を直接入れた方がよいでしょう。
1秒につき1回転させる
Angle
などに使えるExpressionです。
ただこれだとどんどん値が大きくなっていきます。「気持ち悪い」「純粋に0から360までを繰り返したい」という人は、前の項目と同じように余りを使いましょう。
変数を使いたい・複数行として書きたい時
同じ値を繰り返して使いたい場合は少し特殊です。先に例です。
日本語で書き下すと次のようになります。
文章にするなら次のようなになります。
- 行頭に
:
を入れる - 式の区切りごとに
;
を入れる - 値を返すときは
return
を入れる
Tips
扱うノードが増えると、メモをしたくなるかもしれませんね。メモ帳のソフトやサービスに書いてもよいですが、Sticky Noteノードを使ってFusionの中に書いておくこともできます。
グラフとして可視化に便利なサイト
数式を組み立てる時には一度グラフとして確認したほうが分かりやすいです。
今回のグラフ化にはDesmos | グラフ計算機というサイトを重宝しました。画像の書き出しがちょうど良かったです。
WolframAlphaやGeoGebraもおすすめです。
詳しい情報源
関数は多くて紹介しきれません。頼りになる一次情報を書いておきます。
Fusionのドキュメント
Fusionのドキュメントにsin
(サイン関数)やfloor
(切り捨て)など、便利な関数が一覧になっています。PDF内でMathematical Expressions
などで検索すると出てきます。
Scripting Guide
Fusionのドキュメントでsee the Fusion Scripting Documentation
と出てくるのはおそらくこのFusion8 Scripting Guideっぽいですね。こちらの59ページからRenderEnd
などの情報が載っています。
COMPN_RenderStart
のCOMPN
って何?という話を詳しく知りたい方はこのGuideの39・40ページの「Attributes」を読んでください。
Luaのドキュメント
Expressionの実体はLuaというプログラミング言語であるため、Lua 5.1 Reference Manualを見てみましょう。
もしDaVinci Resolveで使われているLuaのバージョンが変わったらLua公式ドキュメントから探してください(判明次第この記事も更新します)。
DaVinci Resolve18.6の時点で使われているLuaのバージョンは5.1です。確認するにはメニューの「Workspace > Console」から、次のスクリプトを実行してください。
Luaのバージョン情報はFusionのマニュアルにも掲載されてます。
Expressionの基礎と筆者がよく使うサンプルコードを紹介しました。
実際には次のようにsin
やpi
を組み合わせることが多いです。
参考