Q100387:如何通过Python脚本设置关键帧和调整动画曲线

关注

概括

Nuke脚本中设置动画关键点(例如为 Transform 节点或 Roto mask 的位置设置关键帧)时,通过 Python 定义动画曲线可以提供很大的灵活性。用户可以自动生成和定位动画关键点,根据需要调整斜率,并在管道中使用的不同工具之间共享曲线数据。

本文介绍如何使用 Python 创建动画关键点并更新曲线斜率,包括可测试的示例脚本。

更多信息

当在Nuke中设置动画关键点(通过关键帧节点旋钮)时,关键帧将在曲线编辑器中显示为曲线。

在下面的屏幕截图中,您可以看到在不同帧设置的动画关键点创建的曲线,用于 ColorCorrect 节点的“saturation.r”旋钮:

curve_editor2.png

  • 关键值是用户向“saturation.r”旋钮添加新值的位置。
  • 曲线编辑器使用XY图表,其中X显示帧范围(帧范围为 0-100), Y显示“saturation.r”旋钮值(0 到 1 之间)。
  • 用户选择的关键帧是第53帧,值为0.59。
  • 选定的关键帧还会显示定义坡度的切线。操纵斜率将自定义关键帧之间的曲线形状,使其更加平滑或恒定。
  • 所选曲线正在使用平滑插值
  • 表达式字段显示其表达式为curve ,这意味着动画由曲线编辑器中的曲线控制。

使用 Python 设置关键帧

在通过 Python 脚本创建关键帧动画时,需要为每个关键点设置多个属性。

其中包括以下内容:

  • x - 点的水平位置(帧值)
  • y - 点的垂直位置(旋钮值)
  • 插值- 用于计算除第一个键的左斜率和最后一个键的右斜率之外的所有斜率
  • 外推法- 计算最左边和最右边的斜率

要设置自定义插值,您可以通过设置以下属性单独编辑创建的每个关键点的切线:

  • lslope - 点左侧的导数
  • r斜率- 该点右侧的导数
  • la - 左侧“双三次”值
  • r a - 正确的“双三次”值

下面是显示关键帧切线的屏幕截图,突出显示 lslope 和 rslope:

切线2.PNG

要了解有关 Python AnimationKey类以及可用于插值和外插属性的选项的更多信息,请查看Nuke Python API 参考指南的AnimationKey部分。

示例脚本

您可以在附件中找到一个示例 Python 脚本,该脚本展示了如何自动创建关键帧动画曲线。当在Nuke的脚本编辑器中执行此操作时,它将创建一个带有动画“color.r”旋钮的 Constant 节点。

要查看脚本,请下载并在Nuke的脚本编辑器或 Python 编辑工具(例如 PyCharm、Sublime Text、Notepad++ 等)中打开附加文件 ( CurveTest.py )。

NUKE中使用脚本

Nuke中,可以通过导入CurveTest.py文件或将其内容复制/粘贴到脚本编辑器中,然后执行来测试脚本。

执行脚本后,它将在“color.r”旋钮上创建一个带有动画键的常量节点。

选择节点并在曲线编辑器中查看它将允许您检查其动画关键点并查看已生成的曲线。

以下是您可以在“曲线编辑器”选项卡中检查的脚本输出:

可以手动操作按键。选择一个关键点将显示其可以进一步操作的切线。

有关编辑曲线的更多信息,包括高级技巧和流程,请阅读Nuke文档的编辑曲线部分

脚本说明

CurveTest.py Python 脚本包含解释每个函数的作用以及为什么在脚本中使用它的注释。以下是某些功能和概念的更高层次的概述:

设置动画曲线变量

该脚本首先初始化用于定义动画曲线的数据。

设置此数据的有效方法是将关键帧、值和切线信息保存在 Python 字典对象中,如下所示:

# Curve data stored in dictionary object
curve_data = {1: {'val': 1, 'in_slope': 0.0}, 30: {'val': 10, 'in_slope': 0.0}, 50: {'val': 5, 'in_slope': -56.957}, 60: {'val': 0, 'in_slope': -14.341}, 70: {'val': 5, 'in_slope': 56.957}, 80: {'val': 5, 'in_slope': -77.891}, 90: {'val': 5, 'in_slope': 0.0}}

新的动画关键帧将附加到字典对象,然后通过将每个关键帧添加到动画曲线来循环字典。

使用定义

为了使曲线在其他脚本中高效且可重用,所有函数都保留在定义中。这可以轻松集成到其他 Python 脚本中,因为所有定义都依赖于字典对象给出的“curve_data”:

def create_curve(curve_data):

设置节点和旋钮

在脚本的示例中,我们创建一个 Constant 节点并将曲线动画数据存储到其“颜色”旋钮中。如果您想将此设置用于不同的节点和旋钮,您可以在以下行中替换它们的名称:

node = nuke .createNode('Constant')
attr = node['color']
attr.setAnimated()

旋钮还必须设置为“动画”,以便可以将多个键添加到动画旋钮。

自定义插值

AnimationKey文档中所述,如果设置了nuke .USER_SET_SLOPE ,则将忽略插值和外插,而将使用用户生成的切线。

如果查看 Python 脚本中的第 55 行, changeInterpolation()函数设置为“nuke.USER_SET_SLOPE”,这意味着动画曲线正在使用自定义插值切线。

curve.changeInterpolation(keys, nuke .USER_SET_SLOPE)

如果您添加如下打印语句:

curve.changeInterpolation(keys, nuke .USER_SET_SLOPE)
print (curve.toScript())

然后在脚本编辑器中执行脚本,您将从曲线内收到以下自定义插值信息:

{curve l x1 1 s0 x30 10 s0 x50 5 s-56.957 x60 0 s-14.341 5 s56.957 5 s-77.891 5 s0}

所有自定义创建的切线都已成功添加到动画曲线中,并且应该出现在常量节点的“color.r”旋钮中。

如果您执行注释掉curve.changeInterpolation(keys, nuke .USER_SET_SLOPE)的示例脚本,并添加相同的打印语句:

#curve.changeInterpolation(keys, nuke .USER_SET_SLOPE)
print(curve.toScript())

曲线将默认数据显示为:

{curve x1 1 x30 10 x50 5 x60 0 5 5 5}

注意:操作新创建的动画曲线的关键点会将曲线插值重置为默认状态,如Nuke Python API 参考指南的AnimationKey部分中所述。

我们很遗憾听到

请告诉我们