1

したがって、Maya には 2 つのマトリックスがあります。ある行列を、その他の行列の x と y について反映したいと考えています。

例として:

オブジェクト1のマトリックスは次のようなものです。 x に沿って度。

オブジェクト 2 のマトリックスは次のとおりです。回転値なし。

When reflected on scaleX of object1 we get a matrix like this: [1.0, 0.0, -0.0, 0.0, -0.0, 0.70710678118654746, -0.70710678118654757, 0.0, 0.0, 0.70710678118654757, 0.70710678118654746, 0.0, 2.0, 2.8284271247461898, -2.2204460492503131e-16 、1.0]

これは、オブジェクトのスケールを手動で反映しているときに、マトリックスをクエリしているだけです。Python APIでこれを行うための方法は何ですか?

私は MTransformationMatrix で何らかの方法を想定していますが、それを理解することはできません。

どんな助けでも大歓迎です!

4

4 に答える 4

0

位置を取得するためにベクトルを使用して終了しました。obj1 と obj2 を反射オブジェクトと反射するオブジェクトに置き換えます。

import maya.OpenMaya as OpenMaya
import maya.cmds as cmds
from functools import partial

get_pnt = partial(cmds.xform,
                 query=True,
                 worldSpace=True,
                 translation=True)

N = OpenMaya.MVector(*get_pnt('obj1'))
N.normalize()
V = OpenMaya.MVector(*get_pnt('obj2'))
R = (N * 2.0) * (V * N) - V

loc = cmds.spaceLocator()
cmds.move(R.x, R.y, R.z, loc[0])

ベクトル反射の式

于 2013-08-20T15:42:08.960 に答える
0

これが、あなたがくれたアイデアで作業するためのコードです。今とても理にかなっています!

import maya.OpenMaya as OpenMaya
import maya.cmds as cmds
import math

reflectObj = cmds.xform('pSphere1', query=True, ws=True, matrix=True)
targetObj = cmds.xform('pSphere2', query=True, ws=True, matrix=True)
reflectXZ = [-1 * reflectObj[0], -1 * reflectObj[1], -1 * reflectObj[2], reflectObj[3],
             -1 * reflectObj[4], -1 * reflectObj[5], -1 * reflectObj[6], reflectObj[7],
             reflectObj[8], reflectObj[9], reflectObj[10], reflectObj[11],
             reflectObj[12], reflectObj[13], reflectObj[14], reflectObj[15]]

targetMMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil.createMatrixFromList(targetObj, targetMMatrix)

reflectObjMMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil.createMatrixFromList(reflectObj, reflectObjMMatrix)

reflectXZMMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil.createMatrixFromList(reflectXZ, reflectXZMMatrix)

reflected_matrix = targetMMatrix * reflectObjMMatrix.inverse()
result = reflected_matrix * reflectXZMMatrix

mt = OpenMaya.MTransformationMatrix(result)

trans = mt.translation(OpenMaya.MSpace.kWorld)
eulerRot = mt.rotation().asEulerRotation()
angles = [math.degrees(angle) for angle in (eulerRot.x, eulerRot.y, eulerRot.z)]
loc = cmds.spaceLocator()
cmds.move(trans[0], trans[1], trans[2], loc[0])
cmds.rotate(angles[0], angles[1], angles[2], loc[0])

この場合、私は 2 つの球体を作成しただけで、それらの行列を反映することができました。編集:これを修正して、回転を無効にしました。

于 2013-08-20T00:23:26.473 に答える