资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
mayapythonapi建立节点昨天基本上了解如果要建立自己的plug-in,最简单的就是包含一个command命令,可以使用mel或python来调用。现在来看看更高级的,建立一个自己的node节点-import math, sysimport maya.OpenMaya as OpenMayaimport maya.OpenMayaMPx as OpenMayaMPxkPluginNodeTypeName = spSineNodesineNodeId = OpenMaya.MTypeId(0x8700)# Node definitionclass sineNode(OpenMayaMPx.MPxNode): # class variables input = OpenMaya.MObject() output = OpenMaya.MObject() def _init_(self): OpenMayaMPx.MPxNode._init_(self) def compute(self,plug,dataBlock): if ( plug = sineNode.output ): dataHandle = dataBlock.inputValue( sineNode.input ) inputFloat = dataHandle.asFloat() result = math.sin( inputFloat ) * 10.0 outputHandle = dataBlock.outputValue( sineNode.output ) outputHandle.setFloat( result ) dataBlock.setClean( plug )# creatordef nodeCreator(): return OpenMayaMPx.asMPxPtr( sineNode() ) # initializerdef nodeInitializer(): # input nAttr = OpenMaya.MFnNumericAttribute(); sineNode.input = nAttr.create( input, in, OpenMaya.MFnNumericData.kFloat, 0.0 ) nAttr.setStorable(1) # output nAttr = OpenMaya.MFnNumericAttribute(); sineNode.output = nAttr.create( output, out, OpenMaya.MFnNumericData.kFloat, 0.0 ) nAttr.setStorable(1) nAttr.setWritable(1) # add attributes sineNode.addAttribute( sineNode.input ) sineNode.addAttribute( sineNode.output ) sineNode.attributeAffects( sineNode.input, sineNode.output ) # initialize the script plug-indef initializePlugin(mobject): mplugin = OpenMayaMPx.MFnPlugin(mobject) try: mplugin.registerNode( kPluginNodeTypeName, sineNodeId, nodeCreator, nodeInitializer ) except: sys.stderr.write( Failed to register node: %s % kPluginNodeTypeName ) raise # uninitialize the script plug-indef uninitializePlugin(mobject): mplugin = OpenMayaMPx.MFnPlugin(mobject) try: mplugin.deregisterNode( sineNodeId ) except: sys.stderr.write( Failed to register node: %s % kPluginNodeTypeName ) raise-kPluginNodeTypeName = spSineNode这段定义自己的节点的名称,当脚本写好后在maya中使用mel命令行中输入createNode spSineNode;就可以创建这个节点。sineNodeId = OpenMaya.MTypeId(0x8700)给这个节点指定一个ID,括号内的数字,这个数字应该是需要在maya中唯一的。先说说def nodeInitializer():这个方法吧这个方法用于初始化自己定义的节点,比分说里面有包含哪些属性,这些属性的初始值是多少。nAttr = OpenMaya.MFnNumericAttribute();sineNode.input = nAttr.create( input, in, OpenMaya.MFnNumericData.kFloat, 0.0 )nAttr.setStorable(1)首先先给变量nATTR 一个 OpenMaya.MFnNumericAttribute(),这样就定义了nAttr为一个数字类型的属性然后给nAtrr新建立一个属性,长名称为“input”,短名称为“in”,类型OpenMaya.MFnNumericData.kFloat,默认值为0.0 ,并赋予给我们自己定义的sineNode.input属性nAttr.setStorable(1)可以让maya把这个属性保存到maya的场景中。nAttr.setWritable(1)可以让这个属性可写。sineNode.addAttribute( sineNode.input )sineNode.addAttribute( sineNode.output )sineNode.attributeAffects( sineNode.input, sineNode.output ).addAttribute 就是把 我们初始化好的sineNode.input 添加到 sineNode中.attributeAffects 就是告诉maya当我改变input的时候,output会根据计算在面板中一块改变。在看看defcompute这个方法这个方法就定义了节点里面的属性如何处理数据。if ( plug = sineNode.output):当属性为 sineNode.output的时候,进行下面的计算dataHandle=dataBlock.inputValue(sineNode.input)首先提取sineNode.input的数值放到DataHandle中inputFloat = dataHandle.asFloat()在把提取出来的数据转换为Float 浮点 放入inputFloat中 result =math.sin( inputFloat ) * 10.0然后进行计算这里是以sin函数的方式进行变化,并且放大10倍,把结果方到 result中 outputHandle = dataBlock.outputValue( sineNode.output) 提取sineNode.output 的数值放到 outputHandle中 outputHandle.setFloat( result )设置outputHandle的数值为刚才计算好的result dataBlock.setClean( plug )可能是清楚所有的数据。-基本上比较主要的就是nodeInitializer 和compute这两个方法。复制粘贴上面的代码很简单,主要是理解他们的意思,后面想了下扩展,这里是给了节点2个属性,输出属性是以sin()*10的方式变换,现在我想把10着个变成一个变量,也就是第3个属性,自己设定这个数值来控制output的范围,怎么操作呢?继续看帮助。-有关于初始化节点熟悉的内容主要是靠MFnNumericAttribute这个,于是在帮助上看了下系统的解释http:/docs.autodesk.com/MAYAUL/2013/ENU/Maya-API-Documentation/python-api/MFnNumericAttribute.html可以用MFnNumericAttribute()给maya对象构造一个新的属性或者MFnNumericAttribute(object)给指定的maya对象构造一个新的属性他饱含下列方法:create(longName, shortName, type, defaultValue=0)新建一个数字属性create(longName, shortName, child1, child2, child3=MObject.kNullObj)新建立一个复合数字属性 估计是类似于 移动的x,y,z 这种多重属性createAddr(longName, shortName, defaultValue=0)新建立一个地址属性createColor(longName, shortName)新建立一个颜色属性createPoint(longName, shortName)新建立一个 3d point 属性getMax()取得这个属性设置的最大值,如果该属性是一个复合属性,将返回一个元组分别放入他们的最大值,如果没有设定最大值将会返回RuntimeError错误getMin()取得这个属性设置的最小值,如果该属性是一个复合属性,将返回一个元组分别放入他们的最小值,如果没有设定最小值将会返回RuntimeError错误getSoftMax()取得这个属性设置的SoftMax如果没有设定SoftMax将会返回RuntimeError错误getSoftMin()取得这个属性设置的SoftMin如果没有设定SoftMin将会返回RuntimeError 错误hasMax()返回一个布尔值,如果有设定最大值便返回1。没有就返回0
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号