Nuke - 如何从函数内部修改节点?
Nuke - How to modify a node from inside a function?
为了熟悉 Python for Nuke,我正在创建一个在节点图中进行的小游戏,但是我在尝试移动我的 "character" 时遇到了障碍使用一个功能。角色是一个点,函数试图读取它在 X 和 Y 中的位置以确定它可以移动的方向,然后为玩家提供这些选项,最后将角色移动到所选方向。该函数必须接收字符作为输入,但这就是我遇到问题的地方,这是该部分代码的简化版本:
global currentPosX
global currentPosY
currentPosX = 0
currentPosY = 0
def moveArea(self, node):
charT = node
print = currentPosX
currentPosX = charT['xpos'].value()
currentPosY = charT['ypos'].value()
char = nuke.nodes.Dot(hide_input=1, xpos=490, ypos=70)
moveArea(char)
我已经尝试了很多东西,你在这里看到的这段代码是我想不出任何其他选择的地方,我相信问题在于我如何将 'char' 节点输入到函数中,但我找不到任何明确说明的资源。如有任何帮助,我们将不胜感激!
我创建了一个简化的函数,其中包含一些可能对您有用的有用的 nuke 命令。例如,class 之外的函数不需要 self 参数。此代码仅在字符点不存在时创建一个字符点,因此您可以多次执行它并看到点进一步移动。
def moveArea(node, moveX=0, moveY=0):
# query current position of input node
currentPosX = node['xpos'].value()
currentPosY = node['ypos'].value()
# calculate new position based on arguments
newPosX = currentPosX + moveX
newPosY = currentPosY + moveY
# actually move the node
print "moving %s from (%s,%s) to (%s,%s)" % (node.name(), currentPosX, currentPosY, newPosX, newPosY)
node['xpos'].setValue(newPosX)
node['ypos'].setValue(newPosY)
# create the node for the very first time with a unique name (if it doesn't exist)
if not nuke.exists('characterDot'):
characterDot = nuke.nodes.Dot(hide_input=1, xpos=490, ypos=70, name='characterDot')
# find the node based on the name whenever you want
char = nuke.toNode('characterDot')
# run the move function on the character
moveArea(char, 100, 20)
撇开一些语法错误不谈,您的原始代码并没有太大问题 - 尽管您实际上从未为节点设置新值(使用 setValue)并且只查询了节点位置。就我而言,传递整个对象是可以接受的做法!虽然作为使用 nuke 的一部分,可能会涉及大量选择、创建和取消选择节点 - 所以我添加了一些代码,可以根据其唯一名称再次找到该点。
我的建议是为字符点创建一个 class,它具有找到它然后移动它的移动功能。
让我知道这是否有帮助,或者您是否可以提供稍微复杂一点的演示来说明您遇到的问题!
为了熟悉 Python for Nuke,我正在创建一个在节点图中进行的小游戏,但是我在尝试移动我的 "character" 时遇到了障碍使用一个功能。角色是一个点,函数试图读取它在 X 和 Y 中的位置以确定它可以移动的方向,然后为玩家提供这些选项,最后将角色移动到所选方向。该函数必须接收字符作为输入,但这就是我遇到问题的地方,这是该部分代码的简化版本:
global currentPosX
global currentPosY
currentPosX = 0
currentPosY = 0
def moveArea(self, node):
charT = node
print = currentPosX
currentPosX = charT['xpos'].value()
currentPosY = charT['ypos'].value()
char = nuke.nodes.Dot(hide_input=1, xpos=490, ypos=70)
moveArea(char)
我已经尝试了很多东西,你在这里看到的这段代码是我想不出任何其他选择的地方,我相信问题在于我如何将 'char' 节点输入到函数中,但我找不到任何明确说明的资源。如有任何帮助,我们将不胜感激!
我创建了一个简化的函数,其中包含一些可能对您有用的有用的 nuke 命令。例如,class 之外的函数不需要 self 参数。此代码仅在字符点不存在时创建一个字符点,因此您可以多次执行它并看到点进一步移动。
def moveArea(node, moveX=0, moveY=0):
# query current position of input node
currentPosX = node['xpos'].value()
currentPosY = node['ypos'].value()
# calculate new position based on arguments
newPosX = currentPosX + moveX
newPosY = currentPosY + moveY
# actually move the node
print "moving %s from (%s,%s) to (%s,%s)" % (node.name(), currentPosX, currentPosY, newPosX, newPosY)
node['xpos'].setValue(newPosX)
node['ypos'].setValue(newPosY)
# create the node for the very first time with a unique name (if it doesn't exist)
if not nuke.exists('characterDot'):
characterDot = nuke.nodes.Dot(hide_input=1, xpos=490, ypos=70, name='characterDot')
# find the node based on the name whenever you want
char = nuke.toNode('characterDot')
# run the move function on the character
moveArea(char, 100, 20)
撇开一些语法错误不谈,您的原始代码并没有太大问题 - 尽管您实际上从未为节点设置新值(使用 setValue)并且只查询了节点位置。就我而言,传递整个对象是可以接受的做法!虽然作为使用 nuke 的一部分,可能会涉及大量选择、创建和取消选择节点 - 所以我添加了一些代码,可以根据其唯一名称再次找到该点。
我的建议是为字符点创建一个 class,它具有找到它然后移动它的移动功能。
让我知道这是否有帮助,或者您是否可以提供稍微复杂一点的演示来说明您遇到的问题!