当前位置:   article > 正文

[Maya API] lesson24_Maya API 层级迭代器与物体函数类MFnDagNode MItDag_maya 迭代器是什么

maya 迭代器是什么

MFnDagNode

我们知道MFnDagNode就是大纲里的节点,也就是说带有层级的节点,那么MFnDagNode就是针对这些物体拓展出来的函数类,我们可以对于这些节点使用MFnDagNode来访问他们对应的方法。

MFnDagNode是继承MFnDependencyNode而来的,所有的MFnDagNode也都可以使用MFnDependencyNode的方法

MFnAssembly、MFnCamera、MFnField还有流体、晶格、灯光等,这些都可以使用MFnDagNode的方法

MFnDagNode的常用方法,跟我们平时操作差不多,可以获取它的parent、child、hasParent、hasChild,也就是说找到他的父物体、子物体、判断他是不是一个物体的子物资、是不是一个物体的父物体,还有他物体的名字,长名 还有其他的我们都可以使用

我们现在场景里有一个最简单的物体,也就是一个球,我们通过它来学习一下MFnDagNode:针对单个DagNode的处理方法

首先我们先导入pymel和OpenMaya,导入之后我们定义一个变量,要创建一个MFnDagNode可以先传入一个MObject,可以传入一个MDagPath,也就是说两种类型传入禁区都可以生成这一个function的DagNode,在这里我们需要注意的是,我们穿的MObject必须是大纲里的这种节点,那么如果我们传入的是普通节点的MObject,那么他是无法实例化的,

  1. py.pyNode('pSphere1').__apiobject__() # 返回的是MFnDagPath可以传入MFnDagNode
  2. mfn = OpenMaya.MFnDagNode()

现在这个实例就定义好了,现在我们就可以访问它的方法啦,

api和pymel都是直接绑定在节点上的,不是依据字符串来寻找的,当节点有变化时,依然可以追踪到它

mfn.partialPathName(): 返回大纲里的层级的名字

mfn.fullPathName(): 返回他的长名,可以根据自己的层级来实时更改自己的fullPathName

childCount(): 判断它有几个子物体

child(int) : 找出他索引为int的子物体返回一个MObject

  1. import pymel.core as pm
  2. import maya.OpenMaya as OpenMaya
  3. node = pm.PyNode('pSphere1').__apiobject__()
  4. mfn = OpenMaya.MFnDagNode()
  5. mfn.fullPathName()
  6. OpenMaya.MFnDagNode(mfn.child(1)).fullPathName() #将子物体传出的MObject传入MFnDagNode
  7. mfn.removeChildAt(3) # 将索引为3的子物体进行移除

MItDag

我们知道以MIt开头的都是迭代器,也就是说MItDag可以迭代我们场景中所有的层级的节点,我们可以使用它来模拟ls的操作,也就是说ls实际上是从这个地方发展而来的,我们可以使用它高效率的遍历场景中所有的层级节点,然后来寻找我们所需要的

初始化一个MItDag有两种方式,第一种就是先传入他的迭代的类型,然后是我们要迭代的节点的类型,那么他这个类型是他这一个类独有的,它有两种,比如说一个是深度优先,一个是广度优先。那么他们两个的意思是:深度优先他是把第一个层级下边一直迭代到最深处的,最下边的那个子节点,然后开始第二层,那么广度优先事把所有层都遍历完,再回到第二层,然后再继续向下遍历,然后再到第三层,也就是说如果你对他的顺序没有太多要求的话,实际上是选择哪个都无所谓的,如果说真的确切对顺序有特定要求的话,就要按需选择啦

我们来创建一个MItDag

  1. iterator = OpenMaya.MItDag() #定义一个空的,没有任何起始点的MItDag,可以遍历出场景里所有的层级节点
  2. iterator.reset(pm.PyNode('group5').__apiobject__(), OpenMaya.MItDag.kBreadthFirst, OpenMaya.MFn.kMesh ) # 指定一个起始点,返回指定起始点的所有层级 ,指定迭代的类型kMesh
  3. while not iterator.isDone(): # 判断iterato没有结束
  4. print(iterator.fullPathName())
  5. iterator.next() # 迭代下一个

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号