Hi thanks,
your code has some helpful information for me...
this is what i got so far, though the locator is no vertex... and you have
to execute first part, then rotate reference locator and then execute
second part. Since api 1.0 has no" MMatrix.setElement" I find the very
useful MTransformationMatrix. But as always when using API I find myself
going long and indirect ways to reach my goal...
import maya.OpenMaya as om
# execute this to initialize the selections and get the positions
selCube = om.MSelectionList()
selCube.add("pCube1")
mDagCube = om.MDagPath()
selCube.getDagPath(0, mDagCube)
fnTransCube = om.MFnTransform(mDagCube)
posCube = fnTransCube.translation(4)
selLoc = om.MSelectionList()
selLoc.add("locator1")
mDagLoc = om.MDagPath()
selLoc.getDagPath(0, mDagLoc)
fnTransLoc = om.MFnTransform(mDagLoc)
posLoc = fnTransLoc.translation(4)
# execute this to get the hypothetical child Matrix
vec = posCube - posLoc
mChildTransMatr = om.MTransformationMatrix()
mChildTransMatr.setTranslation(vec, 4)
childMatr = mChildTransMatr.asMatrix()
# now you can move and rotate your parent object and again get his matrix
parentMatr = mDagLoc.inclusiveMatrix()
# this gets the child's world matrix
childWorldMatr = childMatr * parentMatr
# last step is to apply the matrix to the hypothetical child
chMatr = om.MTransformationMatrix(childWorldMatr)
quatRotation = om.MQuaternion()
rot = chMatr.rotation()
trans = chMatr.translation(4)
fnTransCube.setTranslation(trans, 4)
fnTransCube.setRotation(rot,4)
Am Montag, 27. August 2018 05:22:13 UTC+2 schrieb Pedro Bellini:
>
> Hi, see if this works
>
> Basically you need to compute the transformation matrix that represents
> the rotation from a specific point ("vertex" in your case). That can be
> generally done by matrix composition.... m1*m2-1*transform*m2. Where m1 is
> the matrix of the object you want to move, m2-1 is the inverse matrix of
> the object you want to use as reference (parent space), transform is your
> rotation matrix, then you move it back to world by multiplying back m2.
>
> A quick example in maya can look like this:
>
> from maya.api import OpenMaya
> from maya import cmds
>
> cube = cmds.polyCube()[0]
> vtx = cube+'.vtx[2]'
> vtx_pos = cmds.xform(vtx, q=1,ws=1,t=1)
> # vertex does not have orientation, so will keep world
> # you can use vertex normals or custom...
> # ill just extract the position
> vtx_world_mmat = OpenMaya.MMatrix()
> for i in xrange(3):
> vtx_world_mmat.setElement(3,i, vtx_pos[i])
>
> grp = cmds.createNode('transform')
> cmds.xform(grp, t=(5,0,0))
> obj = cmds.polyPrism()[0]
> cmds.parent(obj,grp,r=1)
> obj_world_mat = cmds.xform(obj, q=1,ws=1,m=1)
>
> # compose the rotation matrix however you want, ill just make from euler
> rotation
> rot_eu = OpenMaya.MEulerRotation()
> rot_eu.y=3.1415*.5 # 90 deg (ish)
> rot_mmat = rot_eu.asMatrix()
>
> obj_world_mmat = OpenMaya.MMatrix(obj_world_mat)
>
> # transform
> *resulting_mmat = obj_world_mmat * vtx_world_mmat.inverse() * rot_mmat *
> vtx_world_mmat*
> # rotate
> cmds.xform(obj, ws=1, m=list(resulting_mmat))
>
> If I understood you correctly this should be it.
>
> Cheers.
>
--
You received this message because you are subscribed to the Google Groups
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/python_inside_maya/07851383-12c6-4119-b941-ee486a1e94c8%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.