Python API与指针
我们知道,在我们平时使用的一些方法中,有时候传入的参数是一个指针
比如上图中的reset的方法,传入的一个MObject指针,也就是说我们前面要定义好一个MObject,然后再传入进来,或者说setPosition,我们要定义一个MPoint指针传入参数,但是MVector,MVectorArray等一些Maya基本的一些数据类型的指针,
再比如getUV这个方法,他是一个float2的一个指针,我们在python中,就只有float类型,就没有float2这种类型,所以我们要定义这种float2的这种指针,但他又不是Maya单独的数据类型,所以我们就要使用到MScriptUtil。
MScriptUtil
功能:通用工具类,用于在python中使用指针和引用
特性:在pythonAPI多数方法中,需要传递指针参数,并且都依赖于此
我们知道带有Util的一般都是通用的工具函数,那么我们可以用它,来创建我们所需要的数据指针。然后可以用它来读取指针中的值。
接下来我们就循环求出一个多边形所有点的UV值:
我们先创建一个多边形的球体
导入pymel、OpenMaya
扫描二维码关注公众号,回复:
12066508 查看本文章
定义一个迭代器
import pymel.core as pm
import maya.OpenMaya as OpenMaya
#导入pymel、OpenMaya
iterator = OpenMaya.MItMeshVertex(pm.PyNode('pSphereShape1').__apiobject__())
#定义一个迭代器,需要传一个MObject作为参数,使用PyNode传入他的shape类型,转化为API Object
s_util = OpenMaya.MScriptUtil() # 定义一个MScriptUtil实例,每个脚本中定义一个即可
uv_ptr = s_util.asFloat2Ptr() # 定义一个UV的float2的指针,回一次往这个指针里面写入数据,改变它的值,我们在最后访问时,只能访问到它最后一个值,所以写入一次就要访问一次
while not iterator.isDone(): # 使用while循环。来一次访问他的每个元素 条件为有没有结束
print(iterator.index()) # 访问他的索引
iterator.getUV(uv_ptr) # 需要传入一个float2类型的参数,实际上包含了两个浮点数,使用MScriptUtil来创建这种实例
print(s_util.getFloat2ArrayItem(uv_ptr, 0, 0)) # 将UV值取出。将UV的指针传入,第一个元素是固定的0,不用考虑,第二个0,就是U值,1是V值
print(s_util.getFloat2ArrayItem(uv_ptr, 0, 1))
iterator.next() # 依次调用他的每一个元素
Maya里面所有关于数据指针的操作都放在了MScriptUtil里面,可以在里面按照需要选择需要的指针类型,然后加上‘as类型Ptr’直接求就可以了,如果在指针里面求值,就可以使用MScriptUtil,然后使用get开头的方法,传进去指针,然后就可以了
在上图中,我们最常用的也就是这种整数,正整数,布尔,还有浮点数的这种指针,其他的我们随用 随查就可以了。