You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maya Python API自定义multiply节点输出无法实时更新问题求助

问题根因与修复方案

核心问题

你的节点无法实时更新是依赖图脏传播机制未正确配置、compute响应范围不正确两个原因共同导致的:

  • 没有通过attributeAffects建立输入属性到输出属性的影响关系,输入属性修改后Maya不会标记输出属性为脏,也就不会主动触发compute求值
  • compute方法仅响应复合父属性的求值请求,而依赖图实际触发求值时请求的是输出子属性,导致计算逻辑不会被自动调用
  • 直接修改输入数据句柄的子输出属性,不会触发依赖图的数值更新通知

修复步骤

步骤1:补充属性影响关系配置

在你的节点初始化函数(nodeInitializer)中补充以下代码,建立属性关联:

# 输入属性变更会影响输出属性和复合父属性
om.MPxNode.attributeAffects(input1VecAttr, outputVecAttr)
om.MPxNode.attributeAffects(input1VecAttr, uniqueArrayComp)
om.MPxNode.attributeAffects(input2VecAttr, outputVecAttr)
om.MPxNode.attributeAffects(input2VecAttr, uniqueArrayComp)

# 输出属性设置为只读、不存储,由compute计算生成
outputVecAttr.setWritable(False)
outputVecAttr.setStorable(False)

步骤2:修正compute方法逻辑

修正后的compute代码如下:

def compute(self, plug, dataBlock):
    # 覆盖所有需要触发计算的plug:输出属性本身、复合父属性、复合属性下的任意子属性
    if plug == arrayTest2.outputVecAttr or plug == arrayTest2.uniqueArrayComp or plug.parent() == arrayTest2.uniqueArrayComp:
        arrayDataHandle = dataBlock.inputArrayValue(arrayTest2.uniqueArrayComp)
        elementCount = arrayDataHandle.elementCount()
        
        # 获取输出数组的写句柄
        outputArrayHandle = dataBlock.outputArrayValue(arrayTest2.uniqueArrayComp)

        for i in range(elementCount):
            # 读输入值
            bindData = arrayDataHandle.inputValue()
            inVal1 = bindData.child(arrayTest2.input1VecAttr).asFloat()
            inVal2 = bindData.child(arrayTest2.input2VecAttr).asFloat()
            output = inVal1 * inVal2
            
            # 写输出值,用输出句柄操作
            outputArrayHandle.jumpToElement(i)
            outputElement = outputArrayHandle.outputValue()
            outputElement.child(arrayTest2.outputVecAttr).setFloat(output)
            
            try:
                arrayDataHandle.next()
            except:
                pass

        # 标记所有相关属性为干净
        dataBlock.setClean(arrayTest2.uniqueArrayComp)
        dataBlock.setClean(arrayTest2.outputVecAttr)
        
        # 告知Maya计算完成
        return om.MStatus.kSuccess
    # 不属于当前节点处理的plug,交给父类处理
    return om.MStatus.kUnknownParameter

内容的提问来源于stack exchange,提问作者Akshat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 17:06:03