2017-07-31 197 views
0

我正在嘗試在Maya中創建一個用於在yz平面上鏡像變換的腳本。如何用openMaya將矩陣乘以另一個矩陣?

我能夠建立一個能獲得理想結果的節點網絡。我將sz設爲-1的源節點以及左側的源節點(此測試爲lf_grp),並將它們的worldMatrix attrs饋送到multMatrix節點。然後,我通過分解矩陣將輸出(multMatrix.matrixSum)傳遞到我的目標節點。

我真的不想創建一堆節點來做我的鏡像 - 每次運行創建/連接/斷開/刪除循環都是緩慢和痛苦的......我寧願只是「它通過我的腳本,但我似乎無法弄清楚如何實際上增加我的兩個矩陣...

哦,我使用MTransformationMatrix,因爲它處理了一些東西,你的MMatrix不像旋轉順序(至少從我讀過的...)

謝謝你的任何幫助,你可以給!

import maya.cmds as mc 
import maya.OpenMaya as om 

src_xfm = 'lf_grp' 
mir_matrix_vals = [-1.0, -0.0, -0.0, 0.0, 
        0.0, 1.0, 0.0, 0.0, 
        0.0, 0.0, 1.0, 0.0, 
        0.0, 0.0, 0.0, 1.0] 

# get src xfm matrix 
# 
selList = om.MSelectionList() 
selList.add(src_xfm) 
mDagPath = om.MDagPath() 
selList.getDagPath(0, mDagPath) 

src_xfmFn = om.MFnTransform(mDagPath) 
src_matrix = src_xfmFn.transformation() 

# construct mir xfm matrix 
# 
mir_matrix = om.MTransformationMatrix() 
tmp_matrix = om.MMatrix() 
om.MScriptUtil().createMatrixFromList(mir_matrix_vals, tmp_matrix) 
mir_matrix = om.MTransformationMatrix(tmp_matrix) 

# multiply matrices to get mirrored matrix 
# 
dst_matrix = src_matrix * mir_matrix # HOW DO YOU DO THIS???? 
+0

忘了提及我不想使用pymel ... –

回答

0

以下是如何使用openMaya api version 2

如今,這是執行Python API工作的首選方法 - 除此之外,它更少羅嗦,並且避免了MScriptUtil,如果使用不正確,容易出現崩潰。對大多數情況來說它也更快。

這是明擺着的矩陣乘法:

from maya.api.OpemMaya import MMatrix 
mat1 = MMatrix ([0.707107, 0, -0.707107, 0, 0.5, 0.707107, 0.5, 0, 0.5, -0.707107, 0.5, 0, 0, 0, 0, 1]) 
mat2 = MMatrix([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 200, 300, 1]) 
print mat1 * mat2 
# (((0.707107, 0, -0.707107, 0), (0.5, 0.707107, 0.5, 0), (0.5, -0.707107, 0.5, 0), (100, 200, 300, 1))) 

不能直接乘以一個MTransformationMatrix - 該類不是一個線性代數矩陣,它是不同的位置,旋轉,縮放的訪問,剪切和樞軸數據函數的矩陣。如果你想在變換節點上自己完成所有的連接數學操作,比如設置其旋轉而不改變其比例,則可以使用它。

您可以從MTransformationMatrix及其asMatrix()函數中獲取底層矩陣。將矩陣應用於對象:

from maya.api.OpenMaya import MTransformationMatrix, MGlobal, MSelectionList, MFnDagNode 

sel = MGlobal.getActiveSelectionList() # selection 
dagpath = sel.getDependNode(0)   # first node 
transform_node = MFnTransform(dagpath) # MFnTransform 
xfm= transform_node.transformation().asMatrix() # matrix 
new_matrix = mat1 * xfm     # math 
new_trans = MTransformationMatrix(new_matrix) 
transform_node.setTransformation(new_trans) 
+0

感謝您的信息!我能夠從中得出我需要的東西。我實際上並不知道openMaya api v2 ......它比原來更適合我 - 你是否知道它是否具有所有相同的功能? –

+0

這幾乎是一樣的。如果你在現有的東西中沒有沉沒成本,這絕對是值得的 – theodox