lesson26_Maya API 中的指針 - MScriptUtil

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

定義一個迭代器

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開頭的方法,傳進去指針,然後就可以了

在上圖中,我們最常用的也就是這種整數,正整數,布爾,還有浮點數的這種指針,其他的我們隨用 隨查就可以了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章