2017-07-31 9 views
0

私は、Mayaのyz平面で変換をミラーリングするためのスクリプトを作成しようとしています。どのように行列を別の行列に掛けて、openMayaとしますか?

希望の結果を得るノードネットワークをセットアップできました。私は、szを-1に設定し、左側のソースノード(このテストではlf_grp)を起点にノードを取得し、それらのworldMatrix attrsをmultMatrixノードに送りました。次に、出力(multMatrix.matrixSum)を分解行列と目的地ノードに渡しました。

ミラーリングを行うためのノードをたくさん作成しないでください - 作成/接続/切断/削除サイクルを実行するたびに時間がかかり、痛い...私はむしろ "私のスクリプトを通して、実際には2つの行列を掛け合わせる方法を見つけることができません...

ああ、私はMTransformationMatrixを使用しています。 (少なくとも私が読んだから...)回転順序

ようにあなたが与えることができる任意のヘルプをありがとう - ありません!

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

関連する問題