如何在Nuke表达式中给Python函数传递参数?
我正在尝试把一个Python函数放到一个表达式节点里。下面的写法运行得很好:
[python testMe()]
我想问的是,怎么给我的函数传递一些参数。例如,我想像在tcl里那样,给像素设置红色,比如:r(x,y)
2 个回答
这段代码适用于标准的旋钮,比如浮点滑块:
[python ["testMe([value userknob])"]]
这是一个示例的Python函数:
def testMe(val):
return val
我实在搞不懂怎么让它和表达式节点中的特殊钩子一起工作。这个问题似乎是Nuke和Tcl之间的,而不是Tcl和Python之间的。如果你能解决这个问题,记得告诉我哦!
这里有一个你可以复制粘贴的节点:
Expression {
expr0 "\[python \[\"testMe(\[value userknob])\"]]"
name Expression2
selected true
xpos -648
ypos -554
addUserKnob {20 User}
addUserKnob {7 userknob}
userknob 0.47
}
很遗憾,我觉得你想做的事情是不可能的,因为旋钮表达式和像素处理表达式的计算顺序有问题。
简而言之:在表达式节点的旋钮中的TCL表达式是在你想要的变量实际可用之前就被计算了。
详细说明
这里简化了很多关于Nuke操作符评估的内容,以便更简洁地回答原始问题。
旋钮上的表达式(也就是那些用方括号括起来的,或者通过右键点击 -> “添加表达式...”设置的)是在操作符处理的开始阶段计算的(可以称之为“旋钮存储”阶段),在任何像素处理开始之前。这一步生成了实际的(数值)值,这些值被内部的C++ Knob
对象存储,以便在像素处理时可以使用。这种扩展大多数内置旋钮类型会自动完成,所以插件开发者不需要在他们的操作符代码中担心这个问题。
想要了解发生了什么,可以在没有任何渲染上下文的情况下,在这些旋钮的上下文中计算一个Nuke表达式:
nuke.tcl('in Expression1.expr2 {return [expression x]}')
这段代码使用Nuke的TCL命令in
来设置表达式的计算上下文为某个像素表达式旋钮。然后,expression
命令(不要和TCL的expr
命令混淆)会把给定的字符串作为一个普通的Nuke旋钮表达式进行计算(旋钮表达式使用的是TCL的expr
语法的一个受限子集,只对浮点值操作,并且能够解析像Grade1.blackpoint
这样的字符串中的旋钮和变量)。
你会注意到这个nuke.tcl
调用确实返回了一个值,但不幸的是,这个值是当前的帧编号。如果你把表达式中的x
替换成y
...你会得到0。换句话说,在“旋钮存储”阶段(当Nuke扩展你的TCL表达式时),像素坐标在旋钮的表达式上下文中是不可用的。
当表达式节点实际处理像素时,每个表达式旋钮的文本值会在一个表达式上下文中被扩展,此时x
和y
变量被设置为当前正在处理的像素的坐标。
总之,我知道这可能有点技术性和冗长,但我希望这能帮助你理解这里发生了什么。