当前位置:   article > 正文

如何理解和学习MAYA API_openmaya api学习

openmaya api学习

此文转载中国影视特效界水神梁潮坡先生的博客。http://blog.sina.com.cn/s/blog_60b3e1ab0100hf9m.html点击打开链接

有兴趣的朋友可以看看,觉得没什么需要的就跳过吧。我尽量以下用专业的名词术语来解释python的API架构理解和操作。
  肯定有人提出过这样的问题:哪里有MAYA API的教程?基本上来说想学API跟MAYA没多大关系,重要是你对OO,OOP的理解,接下来我会说这个重点问题,只要真正理解OO,你马上可以看maya help来进行调用编写程序。
  开始之前来说说mel跟API的区别,mel是alias公司为用户定制好的模板函数,方便一般用户来操作MAYA,MEL的工作方式说白了就相当于你对MAYA界面的命令激活操作,然后结合控制流,如循环,判断来进行大规模的操作,特别代替人脑的各种思维模式来对MAYA进行流的操作,MEL非常强大,普通用界面命令的话,因为软件考虑到负荷,不可能把所有的命令都调用出来,那么脚本师就可以进行这些特殊的函数调用操作了。
  但是MEL严格来说不算编程,它是一个树上的果实,是开发师为用户定制好的果实,我们用方法去摘它下来就可以品尝了,非常安全的操作体系,不会发生错误。而API就是一颗树,相信学过程序的人都看过OOP方面的书,API class就是一棵树的比喻,这个类比在python中尤其突出,它直接就是一棵树!API允许我们在开发师的基础上定制自己的软件,这里说MAYA吧。说的更白:有树才有果实,我们写API就是为了写MAYA的底层数据架构。
  OO:面向对象
  OOP:面向对象编程
在python的世界里,一切都是对象,modules,function,class,instance都是对象,举个例子:
myName = 'SlayeR'
myName是对象,=是对象,‘SlayeR’是对象,我们进行OOP就是进行数据与架构的组合。
如何来写对象,对象究竟写OOP里面算什么?对象其实就是Class的实例。
class与def定制函数有点相似,但是复杂一点点,它是一张蓝图,举例子:我们作好建筑规划图,但是没有选好地方建筑,有可能是A城市,有可能是B城市,我们还没有实现。所以OO里面,instance就是class的实体。instance是调用class来实现的。
myName = 'SlayeR'中:myName是一个instance,'SlayeR'是字符串对象,在python里面,对象=类,类=对象,当声明了一个class的时候,就声明了一个新的类型!
接下来我们来看看modules,可能在MAYA里面写PY脚本的人会用过import modules,modules就是PY文件,里面封装好各种数据:可以是modules,functions,class,混合也可以。在MAYA里面用的就是导入MAYA包里面的cmds modules,from maya.cmds import*(import maya.cmds)然后就可以直接调用里面的函数了:
cmds.delete("SlayeR")
在MAYA里面,软件开发师为我们开放了底层的架构,便于我们去(继承)使用,然定制新的数据架构。
API modules里面都存放了这些底层的class:

  我们要学的重点就是Class。class是一颗树,之前人家写好了各式更样的class,我们在python里面可以通过多肽的编程方式来继承这些类来定制新的class,从而达到创建出新的instance来供用户使用,多肽的OOP也是PYTHON的特点,它可以让资源更加合理管理,另外也便于instances的属性访问和调用。
  写class其实就是在写nameSpace的过程,写脚本的人应该有个基本概念:global nameSpace,local nameSpace,这是OO编程的重点,因为我们要不断的访问调用数据,nameSpace就显得严谨了,module,instances,functions,class都有自己的nameSpace。
  我们来写一个容易明白一下的class:
class mayaClass:
      def setdate(self,value):
              self.ver=value
mayaInstance = mayaClass()
  声明了mayaClass后,setdate function就是mayaClass的属性,然后mayaInstance 调用mayaClass来创建新的Instance,ver是mayaClass的属性,我们日后可以通过mayaClass.ver的方式来访问,访问mayaClass.ver相当于调用class的function: mayaClass.setdate(mayaClass,value)
 
  当然你有时候会经常看见有__init__()的构造器,用来初始化调用class生成的Instance:
class mayaClass:
      def __init__(self,value):
              self.ver=value
      def __mul__(self,other):
              self.ver=self.ver*other
那么我们就可以直接在instance里面访问调用:
InsMAYA = mayaClass("2010")
InsMAYA * 2
这也是运算符的继承原理。
  假设上面是MAYA公司为我提供的openMaya modules class,如果我们要定制自己的special class是不是要改这个底层机构呢,不需要,但我们可以继承,这里跟MEL完全不一样,MEL是functions的大量调用结合,所以运算速度慢。class完全两个概念,虽然他们都有各自的nameSpace,但是他对于数据的访问是超级快的,官方说是快10倍以上,我来解释一下为什么API为什么那么快!
  下面我来定制一个私人的class:
  class maxClass(mayaClass):
      def __init__(self,value):
              mayaClass.__init__(self,value):
              self.vet=value
我们可以看到maxClass inherit mayaClass,那么当我们创建instance:
InsMAX = maxClass("2010")
vet = InsMAX.vet
ver = InsMAX.ver
  当寻找InsMAX 的属性vet时候它顺着program tree往上找,先找baseClass,然后superClass,所以在调动数据的时候API显得非常快,他们完全是一棵各个class树枝组合成的树,直到找到相应的nameSpace位置。说的更白,我们写API是放置数据的过程,合理的放置就正确的去调用数据,所以nameSpace是个关键点。
  所以写API的OOP,相当于是软件工程师了,他们在创建架构,在原有的class包基础上不断定制自己新的class数据来封装成新的modules供用户使用,在这种继承的OOP过程,我们叫framework.
  当然会写API class是不够的,我们还需要各项专业知识,MAYA的用户更注重图形学了,让我们一起努力学习进步吧。谢谢你的阅读,转载请表明出处:
http://blog.sina.com.cn/liangchaopo
www.TDcome.com
作者:SlayeR雅
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/418545?site
推荐阅读
相关标签
  

闽ICP备14008679号