maya python api 建立节点.doc_第1页
maya python api 建立节点.doc_第2页
maya python api 建立节点.doc_第3页
maya python api 建立节点.doc_第4页
maya python api 建立节点.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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这个,于是在帮助上看了下系统的解释/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。没有就返回0hasMin()返回一个布尔值,如果有设定最小值便返回1。没有就返回0hasSoftMax()返回一个布尔值,如果有设定SoftMax便返回1。没有就返回0hasSoftMin()返回一个布尔值,如果有设定SoftMin便返回1。没有就返回0numericType()返回当前属性的numericType 类型setMax(maxValue)设置最大值setMin(minValue)设置最小值setSoftMax(maxValue)设置SoftMaxsetSoftMin(minValue)设置SoftMin-大概有了点头绪 现在需要添加一个新的属性 ,那么就先修改def nodeInitializer(): 在初始化的是新加入一个属性def nodeInitializer():nAttr = OpenMaya.MFnNumericAttribute();sineNode.input = nAttr.create( input, in, OpenMaya.MFnNumericData.kFloat, 0.0 )nAttr.setStorable(1)nAttr = OpenMaya.MFnNumericAttribute();sineNode.output = nAttr.create( output, out, OpenMaya.MFnNumericData.kFloat, 0.0 )nAttr.setStorable(1)nAttr = OpenMaya.MFnNumericAttribute();sineNode.newAttr = nAttr.create( newAttr, na, OpenMaya.MFnNumericData.kFloat, 10.0 )nAttr.setStorable(1)nAttr.setWritable(1)sineNode.addAttribute( sineNode.input )sineNode.addAttribute( sineNode.output )sineNode.addAttribute( sineNode.newAttr)sineNode.attributeAffects( sineNode.input, sineNode.output)桔黄色部分是新加入的代码-然后再到defcompute(self,plug,dataBlock):中设置我需要进行的计算defcompute(self,plug,dataBlock):if ( plug =sineNode.output ):dataHandle =dataBlock.inputValue( sineNode.input ) inputFloat =dataHandle.asFl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论