コピペで簡単!FusionのExpression解説まとめ

DaVinci ResolveのFusionで使えるExpressionを紹介します。サンプルコードをコピペして使いたい人は目次から飛んでください(PCのみ)。

Expressionとは?

変数や数式を用いて値を変化させることができるFusionの機能です。簡単な例をいくつか書き出します。

  • 「図形のwidthとheightを常に同じ値にする(値の参照)」
  • 「3秒後にテキストを赤く、5秒後にはオレンジにする(条件分岐)」
  • 「徐々に図形を大きくする(時間経過で変化)」

Expressionの基本

Expressionの使い方

Expressionは、変化させたいパラメータ毎に割り当てます。変化させるパラメータ名を右クリックし、「Expression」を押すことで使えます。

Expressionの有効化

右クリックが面倒な場合は値の入力欄に=(半角のイコール)を入力してからEnterを押せば同様にExpressionが使えます。

表示された入力欄に数式を書いていきます。次の画像がその例です。

Expressionの例

Expressionを削除する場合は同様に右クリックして「Remove Expression」を押せば解除できます。

基本の書き方

Expressionの書き方を紹介します。

Expressionの実体はLuaというプログラミング言語ですが、Expression固有の書き方がいくつかあるため注意が必要です。

数値

一番簡単なのは数字です。そのまま書くだけです。

1234

数字は四則演算ができます。()を使って式の優先順位を変更できます。

7 + 3 -- 10になる。足し算
7 - 3 -- 4になる。引き算
7 * 3 -- 21になる。掛け算
7 ^ 3 -- 343.0になる。べき乗。
7 / 3 -- 2.333333になる。割り算
7 % 3 -- 1.0になる。余り
(7 + 3) * 2 -- 20になる。

--(半角ハイフン2個)以降はコメントとして扱われるため、無視されます。

コメントの例

文字列

文字列の場合は"xx"'xx'のようにダブルクオートかシングルクオートで囲みます。

"ダブルクオートで囲った文字列"
'シングルクォートで囲った文字列'
[[このように角括弧を二重に囲っても文字列になります]]

文字列を連結させたいときは..を使います。

"foo" .. "bar" -- foobarという文字列になる

参照

ノードの別のパラメータを参照するには、ノード名.パラメータ名のように書きます。次の例はBackground1というノード名のRedの値を参照しています。

Background1.TopLeftRed

名前の確認は簡単です。確認したいパラメータ名の上にカーソルを置くと、画面の左下に小さく名前が表示されます。

値の入力名を確認する

同じノード内ならノード名の部分は省略可能です。たとえば、青を赤と同じ値にしたければTopLeftRedと入力するだけです。

条件分岐

「もし〇〇だったら」という条件分岐を書くにはiifを使います。ifではなくiifです。誤字ではありません。

iif(Background1.TopLeftRed == 0, 0, 0.5)
-- TopLeftRedが0だったら 0、0でなければ 0.5を返す
-- iif(値1 条件の記号 値2, 条件に当てはまった時, 当てはまらない時)

この==の部分は条件を表します。==のように全角で書いてはいけません。半角です。

書き方条件の内容
a == baがbと等しい
a ~= baがbと等しくない
a > baがbより大きい
a >= baがb以上
a < baがbより小さい
a <= baが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)座標を表すペアの数値の表現

座標はxyの値がセットで書きます。

pointの例

数学チックな奴らも一部紹介します。

書き方内容
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です。必要に応じて四則演算してください。

まずは等速バージョン。

time/comp.RenderEnd

徐々に加速するバージョン(二次関数)。

(time/comp.RenderEnd)^2

x軸を時間、y軸を出力される値としてグラフにするとこんな感じ。

二次関数の例

急→緩やか(平方根)バージョン。

sqrt(time/comp.RenderEnd)

時間が立つにつれて緩やかになる。

ルートを使った例

0から100まで

単純に掛け算です。プログレスバーでよく使います。

(time/comp.RenderEnd)*100

「0から1まで増加」を繰り返す

fpsはプロジェクトのフレームレートを入れてください。comp:GetPrefs().Comp.FrameFormat.Rateでも取得できますが、長いので値を直接入れた方がよいでしょう。

(time/fps)%1
0から1までの増加を繰り返すグラフ

1秒につき1回転させる

Angleなどに使えるExpressionです。

(time/fps)*360

ただこれだとどんどん値が大きくなっていきます。「気持ち悪い」「純粋に0から360までを繰り返したい」という人は、前の項目と同じように余りを使いましょう。

((time/fps)*360)%360

変数を使いたい・複数行として書きたい時

同じ値を繰り返して使いたい場合は少し特殊です。先に例です。

:a=1; b=2; return a+b;

日本語で書き下すと次のようになります。

:変数名=値; return 数式;

文章にするなら次のようなになります。

  • 行頭に:を入れる
  • 式の区切りごとに;を入れる
  • 値を返すときはreturnを入れる

Tips

扱うノードが増えると、メモをしたくなるかもしれませんね。メモ帳のソフトやサービスに書いてもよいですが、Sticky Noteノードを使ってFusionの中に書いておくこともできます。

Sticky Noteノードの例

グラフとして可視化に便利なサイト

数式を組み立てる時には一度グラフとして確認したほうが分かりやすいです。
今回のグラフ化にはDesmos | グラフ計算機というサイトを重宝しました。画像の書き出しがちょうど良かったです。
WolframAlphaGeoGebraもおすすめです。

詳しい情報源

関数は多くて紹介しきれません。頼りになる一次情報を書いておきます。

Fusionのドキュメント

Fusionのドキュメントsin(サイン関数)やfloor(切り捨て)など、便利な関数が一覧になっています。PDF内でMathematical Expressionsなどで検索すると出てきます。

Scripting Guide

Fusionのドキュメントでsee the Fusion Scripting Documentationと出てくるのはおそらくこのFusion8 Scripting Guideっぽいですね。こちらの59ページからRenderEndなどの情報が載っています。

COMPN_RenderStartCOMPNって何?という話を詳しく知りたい方はこのGuideの39・40ページの「Attributes」を読んでください。

Luaのドキュメント

Expressionの実体はLuaというプログラミング言語であるため、Lua 5.1 Reference Manualを見てみましょう。
もしDaVinci Resolveで使われているLuaのバージョンが変わったらLua公式ドキュメントから探してください(判明次第この記事も更新します)。

DaVinci Resolve18.6の時点で使われているLuaのバージョンは5.1です。確認するにはメニューの「Workspace > Console」から、次のスクリプトを実行してください。

print(_VERSION)
Luaのバージョン確認方法

Luaのバージョン情報はFusionのマニュアルにも掲載されてます。


Expressionの基礎と筆者がよく使うサンプルコードを紹介しました。

実際には次のようにsinpiを組み合わせることが多いです。

Point(0.5, 0.06*sin(2*pi*time/30)+0.5)

参考