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

概括

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

本文解释了如何使用 Python 创建动画关键帧和更新曲线斜率,并提供了一个可测试的示例脚本。

更多信息

Nuke中设置动画关键帧(通过动画参数)时,关键帧会在曲线编辑器中显示为曲线。

在下面的截图中,您可以看到由设置在不同帧的动画关键帧创建的曲线,该曲线用于调整 ColorCorrect 节点的对比度旋钮:

  • 关键值是指用户向对比度旋钮添加新值的地方。
  • 曲线编辑器使用XY图,其中X 轴显示帧范围, Y 轴显示对比度旋钮值。
  • 用户选择的关键帧是第 351 帧,值为 1.16。
  • 选定的关键帧还会显示定义斜率的切线。调整斜率可以自定义关键帧之间的曲线形状,使其更加平滑或恒定。
  • 所选曲线采用平滑插值。
  • 表达式字段显示其表达式为曲线,这意味着动画是由曲线编辑器中的曲线控制的。

使用 Python 设置关键帧

使用 Python 脚本创建关键帧动画时,需要为每个关键帧设置多个属性。

其中包括以下几项:

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

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

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

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

Tangents2.PNG

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

示例脚本

附件中提供了一个 Python 脚本示例,展示了如何自动创建关键帧动画曲线。在Nuke的脚本编辑器中执行此脚本后,它将创建一个带有动画颜色旋钮的常量节点。

要查看脚本,请下载打开附件文件( CurveTest.py ),可以使用Nuke的脚本编辑器或文本编辑软件(如 PyCharm、Sublime Text、Notepad++ 等)。

NUKE中使用脚本

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

脚本执行后,它将创建一个常量节点,并在颜色旋钮上设置动画关键帧。

选择节点并在曲线编辑器中查看,即可检查其动画关键帧并查看已生成的曲线。

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

可以手动调整按键。选择一个按键将显示其切线,并可进一步调整这些切线。

有关编辑曲线的更多信息,包括高级技巧和流程,请阅读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}}

将新的动画关键帧添加到字典对象中,然后循环遍历字典,将每个关键帧添加到动画曲线中。

使用函数

为了使曲线高效且易于在其他脚本中复用,所有函数都保存在一个def(函数)中。由于所有定义都依赖于字典对象提供的 'curve_data',因此可以轻松地将其集成到其他 Python 脚本中:

def create_curve(curve_data):

设置节点和旋钮

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

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

此外,必须将旋钮设置为“动画”模式,以便可以将多个按键添加到动画旋钮中。

自定义插值

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

如果你查看 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}

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

如果将示例脚本中的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部分所述。

我们很遗憾听到

请告诉我们