【DaVinci Resolve】 Expression チートシート
🐥はじめに
みなさん、こんにちは。Mugです✨
これは📽DaVinci Resolveについての記事です。
DaVinci ResolveのFusionでは、コントロールの値としてExpression
を設定することが出来ます。
この記事ではExpression
設定に必要な基礎知識や、よく使う式をチートシートとしてまとめます。
Expression設定メニュー(右クリック)
ここに入力する計算式の話
基礎演算
演算と対応する演算子は以下の通りです。
演算子 | 意味 |
---|---|
+ | たす |
- | ひく |
* | かける |
/ | わる |
% | 余り |
^ | 累乗 |
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 .. "です"
クリップ情報
現在フレーム位置
現在のフレーム位置を取得するにはtime
変数を使用します。
クリップ先頭フレーム番号
クリップ先頭フレーム番号を取得するにはcomp.RenderStart
変数を使用します。
クリップ末尾フレーム番号
クリップ末尾フレーム番号を取得するにはcomp.RenderEnd
変数を使用します。
タイムライン情報
タイムライン情報は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
Value
IDを参照しても値が取得できないときは.Valueをつけます。
Expressionでは必要ないかも🤔
位置の設定
X,Yをもつ位置情報(Point)、例えばTransform
のCenter
のようなものに
Expressionを設定するときはPoint
関数でX,Y両方を設定する必要があります。
Point(0.7, 0.3)
テキストエリア
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
マルチステートメント
マルチステートメント
:
で始めるとマルチステートメントで記述可能になります🤩
最後に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)
🐔おわりに
随時増やしていこうと思います👍
Discussion