中文为机翻,仅供参考。
原文地址 https://www.buymeacoffee.com/mrjholt/expressions-484626
视频编辑和动态图形中的表达世界开辟了一个充满可能性的世界。在本文中,我将把我在 DaVinci Resolve 中发现和试验过的表达式汇总在一起。这份清单绝不是完整的,而是一份工作文件,我会一次又一次地回来。
当我试验一个表达式时,我养成了将一个文本节点放入合成中并将该表达式添加到样式文本表达式输入中的习惯。这使我能够以可读格式查看表达式的输出。然后我可以调整表达式以获得我想要的结果。
另一个提示:在重命名节点之前首先使用表达式,因为重命名节点将更新表达式。
--在简单表达式中放置“ ”将忽略右边的字符。就像在“ GetPrefs("Comp.FrameFormat.Rate") -- Returns TL FPS”中一样,这是添加提醒的好方法。
带有注释的表达式列表。
没有特别的顺序。
DaVinci Resolve基础
time这将返回当前帧。(在“角度”参数上使用逆时针旋转对象)
time-1返回前一帧的值。(time- n) ( n = 前一帧数计数,因此time-10将是从当前时间回溯 10 帧)
-time返回当前帧的负值。(使用“角度”参数顺时针旋转对象)
math.floor(3.5) 向负取整(就是向左取整),3.5取整话就是3或者4。往左是负往右是正。3和4两个数是3在左边所以取3。如果是-3.5,那么-4是在左边,所以取的是-4
math.ceil(3.5)向正取整(就是向右取整),3.5取整话就是3或者4。往左是负往右是正。3和4两个数4在右边所以取4
math.modf(-3.5)向0取整。取两个值。一个整型值,一个浮点值。返回值为-3和-0.5
用在表达式上会取前面一个值也就是-3
用在FUSION的表达式上可以不用写math.)
abs 将负数转换为正数
time/600返回当前帧除以 600(可用于控制速度,数字越大越慢)
time*600返回当前帧乘以600(可用于控制速度,数字越大越快)
sin(time) 这导致从 -1 到 1 的 14 位小数
ceil(sin(time)) 这导致在 2 帧内从 0 到 +1 的进展,因为 ceil 将小数点向上舍入。
floor(sin(time)) 当 ceil 将小数点向下舍入时,这会导致在 2 帧内从 -1 到 0。
comp.RenderEnd 这将返回当前合成中的帧数
comp.RenderEnd/2 返回合成的中间位置帧数
(1-(time/comp.RenderEnd)*2) 这导致在合成长度的 50% 内从 0 到 1 的进展,非常适合创建响应式动画
((comp.RenderEnd-comp.RenderStart)) 结果在合成中的帧数
time/comp.RenderEnd 这导致从 0 到 1 的进展,非常适合创建响应式动画
1-(time/comp.RenderEnd) 这导致从 1 到 0 的进展,非常适合创建响应式动画
(time*360)/fps 1 每秒完整旋转。(fps = 时间线帧率。)用于“角度”参数
(time360)/(fps2)每 2 秒旋转 1 次。(fps = 时间线帧率。)用于“角度”参数
ceil(time/fps)结果倒数第二。(fps = 时间线帧率。)
ceil((time)/comp:GetPrefs("Comp.FrameFormat.Rate"))结果倒数第二。(当 fps 未知时有用)
ceil((comp.RenderEnd-time)/fps)根据组合长度以秒为单位返回倒计时。(fps = 时间线帧率。)
ceil((comp.RenderEnd-time)/comp:GetPrefs("Comp.FrameFormat.Rate")) 根据合成长度以秒为单位返回倒计时,(当 fps 未知时很有用)
max(floor(30-(time/fps)),0)结果是从 30 倒数到 0 的整数。(fps = 时间线帧率。)
ceil(time/comp.RenderEnd*100) 返回组合长度的百分比。
ceil(time/comp.RenderEnd*100) .. "%"返回组合长度的百分比,并在末尾连接 .. % 符号。(所有字符串都需要“”)
ceil((1-time/comp.RenderEnd)*100 返回组合长度的下降百分比。
ceil((1-time/comp.RenderEnd)*100) .. "%" 返回组合长度的向下百分比,并在末尾连接 .. % 符号。(所有字符串都需要“”)
math.floor(PolylineStroke1.WriteOnEnd*100).."%" 创建“擦除”效果的“样式文本”百分比。
math.floor(Circle1.Radius*100) 根据圆半径向上计数。
math.floor(Rectangle1.Width*50).."%" 创建“矩形蒙版”的“样式文本”百分比
:randomseed(floor(time/6)) ; return random() 会给你一个简单的 0.1.0 值,每 6 帧改变一次
ceil(time/comp.RenderEnd*100) .. "%" 结果百分比“..”将百分比连接到最后
"Progress: " .. ceil(time/comp.RenderEnd*100) .. "%" 进行中的结果百分比“..”将百分比连接到最后
ceil((1-time/comp.RenderEnd)*100) .. "%" 结果在百分比中,comp ".." 将 % 连接到最后
"Progress: " .. ceil((1-time/comp.RenderEnd)*100) .. "%" 结果进行中 比较“..”的百分比下降将 % 连接到末尾
"Loading " .. ceil(time/24) .. "/" .. ceil(comp.RenderEnd/fps) 结果在 comp 的加载时间
文本驱动的表达式
((Text1.Output.DataWindow[4]-Text1.Output.DataWindow[2])/Text1.Output.Height)返回文本节点的数据窗口的高度。(用于确定文本的高度)
((Text1.Output.DataWindow[3]-Text1.Output.DataWindow[1])/Text1.Output.Width) 返回 Text 节点的 DataWindow 的宽度。(用于确定文本的宽度)
[1]=左侧,[2]=顶部,[3]=右侧,[4]=底部
Text1.StyledText.ValueORText1.StyledText[0]从 text+ 节点返回文本
Text1.StyledText.Value .. Text2.StyledText.Value 连接 2 个样式文本字段
string.len(Text1.StyledText.Value 返回字符串的长度
:_, mylines = string.gsub(Text1.StyledText.Value, "\n", ""); return mylines 返回样式文本字段中的行数
min(time/(comp.RenderEnd/2),1)-(Text1.Delay)用于加扰文本随机性以在合成(从单词到加扰)延迟的中途结束加扰,这是一个从 0 到 0.25 的滑块控件以允许延迟。使用 TimeSpeed 速度 -1 来反转压缩。延迟是一个从 0 到 0.25 的滑块。
1-(time/comp.RenderEnd) 用于从加扰到单词的加扰文本随机性。
写在表达式上
time/(comp.RenderEnd/fps)结果每帧一个字母“写上”。(fps = 时间线帧率。)
time/(comp.RenderEnd/fps)*2导致每帧两个字母“写入”(fps = 时间线帧速率。)
time/(comp.RenderEnd/fps)/2结果在 fps 15 帧的一半内出现“写入”一词。(fps = 时间线帧率。)
time/(comp.RenderEnd/comp:GetPrefs("Comp.FrameFormat.Rate"))/2当帧速率未知时,会在 fps 的一半内产生“写入”一词。小心奇数 fps 23.976 等,因为动画将尝试在帧之间。
time/(comp.RenderEnd/comp:GetPrefs("Comp.FrameFormat.Rate"))/(Text1.WriteOn)添加一个带有整数和步长 2 的滑块控件“WriteOn”,用户可以控制写入速度
掩码表达式
floor(-1*((Rectangle1.Height))/2)或floor(-Rectangle1.Height)/2返回遮罩的底部位置。
floor((Rectangle1.Height)/2) 返回遮罩的顶部位置。
我还没有尝试过,但是将 Height 更改为 Width 应该可以获得侧面位置。
(理想情况下使用转换作为空对象)
Point(Rectangle1.Center.Y-(Rectangle1.Width/2)+(Ellipse1.Width/2))将项目的边缘放在蒙版的左侧内侧
Point(Rectangle1.Center.Y-(Rectabgle1.Width/2)-(Ellipse1.Width/2)) 将项目的边缘放在蒙版的左侧
Point(Rectangle1.Center.X, (Rectangle1.Center.Y+(Rectangle1.Height/2))) 返回矩形遮罩的顶部位置
Point(Rectangle1.Center.X, (Rectangle1.Center.Y-(Rectangle.Height/2))) 返回矩形遮罩的底部位置
Point(Rectangle1.Center.Y+(Rectangle1.Width/2)) 返回矩形遮罩的 Right 位置
Point(Rectangle1.Center.Y-(Rectangle1.Width/2)) 返回矩形遮罩的左侧位置
math.floor(((Transform1.XSize*100)-100)+100).."%"% 读数为空。% 随着 RectangleMask 的宽度变小而减少
math.floor((100-Transform1.XSize*100)).."%"% 读到完整。% 随着 RectangleMask 的宽度变大而增加
显示日期和操作系统功能
Text1.StyledText = os.date('%x')返回日期。从下面更改 %x 将给出规定的结果。
%a缩写的工作日名称(例如,Wed)
%A完整的工作日名称(例如,星期三)
%b缩写的月份名称(例如,Sep)
%B完整月份名称(例如,九月)
%c日期和时间(例如,09/16/98 23:48:10)
%d每月第16天 (16) [01-31]
%H小时,使用 24 小时制 (23) [00-23]
%I小时,使用 12 小时制 (11) [01-12]
%M分钟 (48) [00-59]
%m月 (09) [01-12]
%p "am" 或 "pm" (pm)
%S秒 (10) [00-61]
%w工作日 (3) [0-6 = 周日-周六]
%x日期(例如 09/16/98)
%X时间(例如,23:48:10)
%Y全年 (1998)
%y两位数年份 (98) [00-99]
%%字符 `%'
打开本地网页 (Windows)
os.execute ("start ../galleries/gallery.html" )使用本地 .htm 文件打开默认安装的浏览器。在编辑控制按钮内使用。
打开本地网页 (Mac)
os.execute ("open ../galleries/gallery.html" )使用本地 .htm 文件打开默认安装的浏览器。在编辑控制按钮内使用。
打开网页 (Mac)
os.execute('open "" "你的网址"')在编辑控制按钮内使用
打开网页 (Windows)
os.execute('start "" "你的网址"')在编辑控制按钮内使用。
不是这样的表达式,而是用于向文本编辑器中的节点添加按钮的 LUA。这是放在下面的行ViewInfo = OperatorInfo { Pos = { 0, 82.5 } },
UserControls = ordered() {
ScriptButton = {
LINKS_Name = "ScriptButton",
LINKID_DataType = "Number",
INPID_InputControl = "ButtonControl",
INP_Integer = false,
BTNCS_Execute = [[
os.execute('open "" "你的网址"')
os.execute('start "" "你的网址"')
]],
ICS_ControlPage = "Controls"
}
}
引用另一个节点中一个节点的值
Transform1:Angle结果是变换节点的角度。因此,您可以引用任何其他节点内的任何节点属性。(节点名称:属性)
从特定时间/框架获取价值
Rectangle1:GetValue("Width", 10)返回节点“ Rectangle1 ”在第 10 帧处的宽度
Rectangle1.Width返回整个合成中每一帧“ Rectangle1 ”节点的宽度值
Merge1:GetValue("Center", time-1).X 从前一帧获取点的 X 坐标
self:GetValue(....)要在不同时间获取同一工具上的控件值,请使用self表示法:
获取上一个节点值
我还没有真正想出这个表达式的实际用例,但已经尝试根据框的宽度更改框的颜色。然而,这个表达式的实际应用是无限的。
self:GetSourceTool("[connected input]"):GetValue("[source parameter]",[source time]
一个重要的注意事项是在 Blackmagic Fusion 和 DaVinci Resolve 中,大多数这种性质的表达都需要引用帧来从中提取数据。尽管如果需要,这可能只是第 0 帧,但当您添加time表达式时,乐趣就开始了。
上面的表达式将查看self:GetSourceTool("[connected input]"):节点的输入,实际节点输入例如“EffectMask”。这不会被误认为是节点的名称。
然后在此示例中需要源时间 time=frame 节点所在的帧乘以 2。表达式 =
self:GetSourceTool("EffectMask"):GetValue(("Width2",time2))
comp:GetPrefs( )返回有关当前组合的信息
comp:GetPrefs("Comp.FrameFormat.Rate") 确定用户时间线帧速率
这将返回实际的时间线帧率,这对于将变量添加到任何其他需要计算帧率的表达式非常有用。
comp:GetPrefs("Comp.FrameFormat.Width") 返回 DaVinci Resolve 中时间线分辨率的宽度,基本上 1080p 高清分辨率将返回 1920
comp:GetPrefs("Comp.FrameFormat.Height") 返回 DaVinci Resolve 中时间轴分辨率的高度,基本上 1080p 高清分辨率将返回 1080
实际图像宽度和高度
我最近遇到有人想要获得 MediaIn1 - MediaIn6 节点的分辨率而不是时间线的分辨率
self.Input.OriginalWidth 返回 DaVinci Resolve 中输入分辨率的宽度 基本上 1080p 高清时间线上的 4K 视频将返回 3840
self.Input.OriginalHeight 返回 DaVinci Resolve 中输入分辨率的宽度 基本上 1080p 高清时间线上的 4K 视频将返回 2160
下一个对我来说是新的,我仍在确定它的用途。目前,似乎确保 KEYFRAMESTRETCHER 根据全局输入/输出的长度计算所需的设置。经过进一步调查,当使用全局输入/输出将节点设置在组合的总长度内时,此表达式很有用。例如。通过将 KeyFrameStretcher 连接到此背景节点并使用此表达式将使其响应,149 帧的合成可以具有介于 0 - 149 之间的背景节点开始或结束。
KeyframeStetcher - 源端
min(Background1.GlobalOut,F1.FPS)这是查看反映全局输入/输出长度的背景节点参数。表达式中的FPS是时间线帧率。
溶解开关
溶解节点可用作背景和前景输入之间的有效切换。它们可以链接在一起以在检查器中创建用户选项。
iif((comp.RenderEnd-time)<(comp.RenderEnd/2),0,1) 在合成的中点从背景输入切换到前景输入
时光机
这是一个强大的节点,这个节点有无数的表达式。
time<HoldFrame and time or time>HoldFrame+HoldTime and time-HoldTime or Hold_Frame 在 EditControls 中添加工具以提供 2 个滑块,其中包含合成中的帧,然后您可以在一段时间内暂停动画。
整个工具都在这里,因此您可以对其进行逆向工程。TimeStrecher 动画暂停节点
如果-那么-否则
iif(Merge1.Blend > 0.5, 1, 0)要根据条件(例如 if-then-else 表达式)切换值,请使用 iif() 函数。如果 Merge1.Blend 大于 0.5,这会将输入的值设置为 1,否则设置为 0
或者,
(Merge1.Blend > 0.5) and 1 or 0 以下 Lua 条件表达式也适用:
运营商
运算符用于评估语句。它们与函数结合使用以在 Number Out 和 Point Out 选项卡中执行逻辑和数学计算。
x + yx 加 y。
x - yx 减去 y。
x < y 1.0如果 x 小于 y,则 x < y 1.0,否则为 0.0。
x > y 1.0如果 x 大于 y,则 x > y 1.0,否则为 0.0。
!x 1.0 如果 x = 0,否则为 0.0。
-x (0.0 - x)。
+x (0.0 + x)(实际上什么都不做)。
x ^ yx 的 y 次方。
x * yx 乘以 y。
x / yx 除以 y。
x % yx 取模 y,((x 除以 y)的余数)。
x <= y 1.0如果 x 小于或等于 y,则 x <= y 1.0,否则为 0.0。
x >= y 1.0如果 x 大于或等于 y,则 x >= y 1.0,否则为 0.0。
x == y 1.0如果 x 正好等于 y,则 x = y 1.0,否则为 0.0。
x <> y 1.0如果 x 恰好等于 y,则 x == y 1.0,否则为 0.0(与上述相同)。
x <> y 如果 x 不等于 y,则为 1.0,否则为 0.0。
x != y 如果 x 不等于 y,则为 1.0,否则为 0.0(与上述相同)。
x & y 1.0如果 x 和 y 都不为 0.0,则 x & y 1.0,否则为 0.0。
x && y 1.0如果 x 和 y 都不是 0.0,则 x && y 1.0,否则为 0.0(与上述相同)。
x | y 1.0如果 x 或 y(或两者)不为 0.0,则为 1.0,否则为 0.0。
x || y 1.0如果 x 或 y(或两者)不是 0.0,则 y 1.0,否则为 0.0(与上述相同)。
公式
公式作为表达式的一部分输入到 Number Out 或 Point Out 选项卡中。它们可以由以下功能组成:
n1..n9 数字输入 1..9 的值。
p1x..p9x 位置控制 1..9 的 X。
p1y..p9y 位置控制 1..9 的 Y。
time 当前时间(帧数)。
pi pi 的值。
e e 的值。
log(x) x 的以 10 为底的对数。
ln(x) x 的自然(以 e 为底)对数。
sin(x) x 的正弦值(x 是度数)。
cos(x) x 的余弦(x 是度数)。
tan(x) x 的正切(x 是度数)。
asin(x) x 的反正弦,以度为单位。
acos(x) x 的反余弦值,以度为单位。
atan(x) x 的反正切,以度为单位。
atan2(x, y) x,y 的反正切,以度为单位。
abs(x) x 的绝对(正)值。
int(x) x 的整数(整数)值。
frac(x) x 的分数值。
sqrt(x) x 的平方根。
rand(x, y) x 和 y 之间的随机值。
rands(x, y, s) x 和 y 之间的随机值,基于种子 s。
min(x, y) x 和 y 的最小值(最低)。
max(x, y) x 和 y 的最大值(最高)。
dist(x1, y1, x2, y2) 点 x1,y2 和 x2,y2 之间的距离。
dist3d(x1,y1,z1,x2,y2,z2) 3D 点 x1,y2,z1 和 x2,y2,z2 之间的距离
noise(x) 基于 x 的平滑变化的 Perlin 噪声值
noise2(x, y) 基于 x 和 y 的平滑变化的 Perlin 噪声值
noise3(x, y, z) 基于 x、y 和 z 的平滑变化的 Perlin 噪声值
if(c, x, y) 如果 c <> 0,则返回 x,否则返回 y。
缓动函数
1 - cos((time/comp.RenderEnd * pi) / 2)
easInSine
sin(((time/comp.RenderEnd) * pi) / 2)
easeOutSine
-(cos(pi * (time/comp.RenderEnd)) - 1) / 2
easeInOutSine
(time/comp.RenderEnd) * (time/comp.RenderEnd)
easeInQuad
1 - (1 - (time/comp.RenderEnd)) * (1 - (time/comp.RenderEnd))
easeOutQuad
iif((time/comp.RenderEnd) < 0.5, 2 (time/comp.RenderEnd) (time/comp.RenderEnd), 1 - pow(-2 * (time/comp.RenderEnd) + 2, 2) / 2)
easeInOutQuad
(time/comp.RenderEnd)^3
easeInCubic
1-(1-time/comp.RenderEnd)^3
easeOutCubic
iif((time/comp.RenderEnd < 0.5), (((time/comp.RenderEnd)^3)4), 1-(((1-time/comp.RenderEnd)^3)4))
easeInOutCubic
(time/comp.RenderEnd) ^ 4
easeInQuart
1 - pow(1 - (time/comp.RenderEnd), 4)
easeOutQuart
iif((time/comp.RenderEnd) < 0.5, 8 (time/comp.RenderEnd) (time/comp.RenderEnd) (time/comp.RenderEnd) (time/comp.RenderEnd), 1 - pow(-2 * (time/comp.RenderEnd) + 2, 4) / 2)
easeInOutQuart
(time/comp.RenderEnd)^5
easeInQuint
1 - pow(1 - (time/comp.RenderEnd), 5)
easeOutQuint
iif((time/comp.RenderEnd) < 0.5, 16 (time/comp.RenderEnd) (time/comp.RenderEnd) (time/comp.RenderEnd) (time/comp.RenderEnd) (time/comp.RenderEnd), 1 - pow(-2 (time/comp.RenderEnd) + 2, 5) / 2)
easeInOutQuint
pow(2, 10 * (time/comp.RenderEnd) - 10)
easeInExpo
1 - pow(2, -10 * (time/comp.RenderEnd))
easeOutExpo
iif((time/comp.RenderEnd) < 0.5, pow(2, 20 (time/comp.RenderEnd) - 10) / 2, (2 - pow(2, -20 (time/comp.RenderEnd) + 10)) / 2)
easeInOutExpo
1 - sqrt((1 - (time/comp.RenderEnd) ^ 2))
easeInCirc
sqrt(1 - pow((time/comp.RenderEnd) - 1, 2))
easeOutCirc
iif((time/comp.RenderEnd < 0.5), (1 - sqrt((1 - (2 (time/comp.RenderEnd)) ^ 2))) / 2, (sqrt(1 - (-2 (time/comp.RenderEnd) + 2) ^ 2) + 1) / 2)
easeInOutCirc
(1.70158 + 1) (time/comp.RenderEnd) (time/comp.RenderEnd) (time/comp.RenderEnd) - 1.70158 (time/comp.RenderEnd) * (time/comp.RenderEnd)
easeInBack
1 + (1.70158 + 1) pow((time/comp.RenderEnd) - 1, 3) + 1.70158 pow((time/comp.RenderEnd) - 1, 2)
easeOutBack
iif((time/comp.RenderEnd) < 0.5, (pow(2 (time/comp.RenderEnd), 2) ((2.594909 + 1) 2 (time/comp.RenderEnd) - 2.594909)) / 2, (pow(2 (time/comp.RenderEnd) - 2, 2) ((2.594909 + 1) ((time/comp.RenderEnd) 2 - 2) + 2.594909) + 2) / 2)
easeInOutBack
联系客服