进入nuke开发的第一课

Nuke开发相关的文档

Nuke官方的一个技术支持论坛: https://support.foundry.com/hc/zh-cn
Python开发的帮助文档: https://learn.foundry.com/nuke/developers/11.2/pythondevguide/
Nuke Python API帮助文档: https://learn.foundry.com/nuke/developers/11.2/pythonreference/
Nuke TCL (表达式)文档: http://www.nukepedia.com/reference/Tcl/
中文的TCL教程: https://www.yiibai.com/tcl
本堂课的课件: https://github.com/TDChina/TDClass2_Nuke/blob/master/lessons/lesson1.md

用Python操作nuke节点

nuke的脚本编辑器打开位置:
01.png

nuke里获取一个节点

已知节点的名称,使用toNode函数获取,返回一个节点对象。
nuke.toNode('Text1')
获取当前选择的单个节点,返回一个节点对象。
nuke.selectedNode()
获取当前选择的多个节点,返回一个列表。
nuke.selectedNodes()

获取节点的类型

n = nuke.selectedNode()
print n.Class()
>>> Text2

这里我们选择的是Text类型的节点,为何这里返回的是Text2。
是因为Nuke经过多年的发展,少部分的节点分为第一代和第二代。
在新版本中,默认我们创建的是第二代节点。

root相关操作

获取nuke文件路径
nuke.root().name()
02.png
获取项目设置的起始帧
nuke.root().firstFrame()
03.png

获取节点或设置某个属性

比如一个Text节点,我们想获取它的clip to的值是多少。
首先要找到clip to的Knob名称。
可以将鼠标放到clip to上面,查看Knob名称是什么。
04.png
得到Knob的名称就可以用代码去操作它了。

# 获取cliptype的值
t = nuke.toNode('Text1')
print t['cliptype'].value()
>>> format
# 改变cliptype的值
t['cliptype'].setValue('bbox')
# 因为这个值是一个下拉菜单,所以可以传index参数
t['cliptype'].setValue(4)

创建一个节点

nuke.createNode('Write') 这种方式适合nuke界面打开的时候,代码执行后会跳转到节点的属性编辑窗。
nuke.nodes.Write() 这种方法适合没有打开nuke,在后台的一些操作。

连接一个节点

t = nuke.toNode('Text1')
w = nuke.toNode('Write1')
# setInput的第一个参数是输入编号
# 第二个参数是需要连接的上游节点
w.setInput(0, t)
# 得到节点的input关系
w.input(0)
>>> Result: <Text1 at 0x000000001073FF30>

渲染一个Write节点

参数分别是Write节点名,渲染起始帧,渲染结束帧,步长。
nuke.execute('Write1', 1001, 1010, 1)

Gizmo制作与Knob操作

Gizmo是将一堆常用的节点组合,封装成一个节点,并且可以添加设置参数控制。
下面一个案例会用到Gizmo,Knob,tcl用法:
1.首先创建一个“Group”节点,按Tab键输入搜索。
05.png
2.找到Group节点的参数栏,点击这个按钮,进入到Group内。
06.png
3.这个时候我们会看到,一个空的Group节点里,有输入和输出两个节点。
07.png
4.创建一个retime节点,修改参数,让起始帧始终为1001。


5.再创建一个Text节点,这里可以写一个TCL表达式,显示文字为输入的文件名。
10.png
TCL表达式的语法是层层嵌套,从最里面一层开始说明:
[value Read1.file]: 这里返回的是整个输入节点的文件路径
11.png
这里在加一层“file tail”,就只会保留文件名。
[file tail [value Read1.file]]
12.png
我们想去除后面的格式,首先根据“.”符号切割它,类似于python的split()函数。
[split [file tail [value Read1.file]] .]
这个时候返回的文字类似于split()函数返回的一个列表。
13.png
TCL表达式取index值,使用“lindex”。
[lindex [split [file tail [value Read1.file]] .] 0]
14.png
这样我们就得到了去除格式的文件名。(作为标识放到镜头的左上角)
6.我们返回总的节点视图,选择Group节点,双击打开节点参数面板。
15.png
16.png
7.在面板空白处右键,可以看到Manage User Knobs并打开它。
17.png
8.这里的Add按钮,可以添加nuke的标准控件。
18.png
比如我们想添加一个“check box”控件,Add按钮里找到“Check box”。
19.png
添加后Group节点的参数面板,就可以看到添加后的控件。
20.png
9.还有一种方式是从Group里的节点连接属性到控制面板上。
点击Pick按钮
21.png
找到Retime节点的output.first, 点击OK,它的属性就添加到了Group的控制面板上。
22.png
可以点击Edit修改它的名称。
23.png
修改后结果:
24.png
10.这样一个简单的Gizmo案例就完成了,我们可以导入一个素材,并连接它。
可以看到,素材的起始帧会变为1001帧开始,并且左上角有文件名的标识。
25.png
补充一个课程里讲到的Switch节点:
这个节点有0和1两个连接方向。
给予一个条件进行判断,如满足条件或不满足将连接不同的方向。
frame>=Retime1.output.first
课堂案例中判断的是帧数是否大于1001(也就是我们定义的retime起始帧数)

(完)


From zero to hero