🐆

【DaVinci Resolve】 Expression チートシート

2024/11/07に公開

🐥はじめに

みなさん、こんにちは。Mugです✨

これは📽DaVinci Resolveについての記事です。
DaVinci ResolveのFusionでは、コントロールの値としてExpressionを設定することが出来ます。
この記事ではExpression設定に必要な基礎知識や、よく使う式をチートシートとしてまとめます。

Context Menu
Expression設定メニュー(右クリック)

Expression Sample
ここに入力する計算式の話

基礎演算

演算と対応する演算子は以下の通りです。

演算子 意味
+ たす
- ひく
* かける
/ わる
% 余り
^ 累乗
1 + 2 * 3 / 4

👉2.5
算数と同じ計算順序ルールが適用されるので注意😮

10 % 3

👉 1

10 ^ 3

👉 1000

切り上げ/切り捨て

標準関数を使います。
小数点以下が切り上げ/切り捨てされます。

関数 意味
ceil 切り上げ、天井(ceil)に引き上げるイメージ💭
floor 切り捨て、床(floor)に引き下げるイメージ💭
ceil(1.5)

👉 2

floor(1.5)

👉 1

特定の桁数で切り上げ/切り捨て

小数点第XX位で切り上げ/切り捨てを行いたい場合は、
その桁数分だけ数値を10の累乗でずらしてから
切り上げ/切り捨てを行い、その後元の桁数に戻します。

-- 1.2345を小数点第2位で切り上げ
ceil(1.2345 * 10^2) / 10^2

👉 1.24

-- 1.2345を小数点第3位で切り捨て
floor(1.2345 * 10^3) / 10^3

👉 1.234

四捨五入

四捨五入を行うには0.5を足してから切り捨てます。

-- 1.5を四捨五入
floor(1.5 + 0.5)

👉 2

-- 1.4を四捨五入
floor(1.4 + 0.5)

👉 1

条件分岐

条件によって計算を分けるにはiif関数を使用します。

iifとは

Immediately IF の略だと思います🫡

iif(条件, 真の場合, 偽の場合)の形で記述します。
ExcelのIF関数と同じです

条件を記述するための関係演算子は以下の通りです。

演算子 意味
< 左辺が小さい
> 左辺が大きい
<= 左辺が小さい、または等しい
>= 左辺が大きい、または等しい
== 等しい
~= 等しくない
iif (1 > 1, 1, 0)

👉 0

iif (1 >= 1, 1, 0)

👉 1

iif (1 == 2, 1, 0)

👉 0

iif (1 ~= 2, 1, 0)

👉 1

3分岐以上の分岐

3分岐以上させたい場合iifをネストさせます。
ただし複雑になってわかりにくいのでマルチステートメントを使用したほうが良いです😑

Transform1のsizeが0.5未満, 0.5-1.0, 1.0より大きいのどれに当たるかを
判定し、それぞれ0, 1, 2という値に変換する例

iif (Transform1.Size < 0.5, 0, iif(Transform1.Size <= 1.0, 1, 2))

文字列

文字列を表すには、'または"で囲みます。

'これはもじれつです'
"これももじれつです"

文字列内でクォーテーションを使う

使っていない方のクォーテーションで囲むようにします。

"これは`もじれつ`です"

👉 これは`もじれつ`です

`これは"もじれつ"です`

👉 これは"もじれつ"です

文字列を結合する

文字列を結合するには..を使用します。

"変形ノードのサイズは" .. Transform1.Size .. "です"

String Join

クリップ情報

現在フレーム位置

現在のフレーム位置を取得するにはtime変数を使用します。

String Join

クリップ先頭フレーム番号

クリップ先頭フレーム番号を取得するにはcomp.RenderStart変数を使用します。

Render Start

クリップ末尾フレーム番号

クリップ末尾フレーム番号を取得するにはcomp.RenderEnd変数を使用します。

Render Start

タイムライン情報

タイムライン情報はcomp:GetPrefsを使用してCompから取得します。
Compで取得できる情報はたくさんあるので、代表的なものを紹介します。

一覧を表示するには

consoleから以下を入力します。

dump(comp:GetPrefs("Comp"))

フレームレート

フレームレートは、comp:GetPrefsを使用してComp.FrameFormat.Rateから取得します。

comp:GetPrefs("Comp.FrameFormat.Rate")

👉 60
※ 取得される値はTimelineの設定によります。

解像度

タイムライン解像度は、comp:GetPrefsを使用して
Comp.FrameFormat.Width,Comp.FrameFormat.Hightから取得します。

comp:GetPrefs("Comp.FrameFormat.Width")

👉 3840
※ 取得される値はTimelineの設定によります。

comp:GetPrefs("Comp.FrameFormat.Height")

👉 2160
※ 取得される値はTimelineの設定によります。

コントロールの値取得

コントロールの値はノード名.コントロールIDで取得できます。

Text1ノードのSizeを取得する例

Text1.Size

位置の取得

X,Yをもつ位置情報(Point)は.X, .Yをつけてそれぞれの位置を取得します。

Transform1のCenter位置を取得する例

-- X
Transform1.Center.X
-- Y
Transform1.Center.Y

Position

Value

IDを参照しても値が取得できないときは.Valueをつけます。

Expressionでは必要ないかも🤔

位置の設定

X,Yをもつ位置情報(Point)、例えばTransformCenterのようなものに
Expressionを設定するときはPoint関数でX,Y両方を設定する必要があります。

Point(0.7, 0.3)

Point

テキストエリア

TextNode.Output.DataWindow, .Width, .Heightから求めます。
TextNodeには実際のテキストノード名が入ります

取得される値はすべてpx単位となっているため、Fusionで扱いやすいように
割合になおして使用します。

Text1ノードのテキストエリアを取得する例

-- 右
Text1.Output.DataWindow[3] / Text1.Output.Width
-- 左
Text1.Output.DataWindow[1] / Text1.Output.Width
-- 下
Text1.Output.DataWindow[4] / Text1.Output.Height
-- 上
Text1.Output.DataWindow[2] / Text1.Output.Height

幅/高さ

右から左を引くと幅
上から下を引くと高さになります。

Text1ノードのテキストエリアの幅/高さを取得する例

-- 幅
(Text1.Output.DataWindow[3] - Text1.Output.DataWindow[1]) / Text1.Output.Width
-- 高さ
(Text1.Output.DataWindow[4] - Text1.Output.DataWindow[2]) / Text1.Output.Height

Width/Height

マルチステートメント

マルチステートメント
:で始めるとマルチステートメントで記述可能になります🤩
最後にreturnステートメントで値を返すのを忘れずに。

:
width = 3
height = 4
area = width * height
return area

👉 12

🐦応用

クリップの長さ

クリップ末尾フレーム数からクリップ先頭のフレーム数を引くと
クリップの長さになります。

comp.RenderEnd - comp.RenderStart

フレーム数から秒に変換する

フレーム番号をフレームレートで割ればフレーム時間(秒)になります

現在のフレーム位置の時間を取得する例

time / comp:GetPrefs("Comp.FrameFormat.Rate")

先頭フレームが0では無いことも考慮する場合は以下の計算式になります。

(time - comp.RenderStart) / comp:GetPrefs("Comp.FrameFormat.Rate")

特定の再生位置で処理を分岐させる

特定の再生位置で処理を分岐させたい場合
条件分岐時間計算を組み合わせます。
また、複雑になるのでマルチステートメントの出番です❗️

クリップ2秒までは0, 2秒後は1に設定する例

:
frameRate = comp:GetPrefs("Comp.FrameFormat.Rate")
targetTime = 2.0
firstHalfValue = 0
secondHalfValue = 1

currentTime = (time - comp.RenderStart) / frameRate

return iif(currentTime < targetTime, firstHalfValue, secondHalfValue)


クリップ40%までは0, 40%以上は1に設定する例

:
targetRatio = 0.4
firstHalfValue = 0
secondHalfValue = 1

currentRatio = ((time - comp.RenderStart) / (comp.RenderEnd - comp.RenderStart))

return iif(currentRatio < targetRatio, firstHalfValue, secondHalfValue)

🐔おわりに

随時増やしていこうと思います👍

GitHubで編集を提案

Discussion