Hi folk! Made a custom aim constraint with maya python api(1.0). As I move the aiming object around in the scene for some reason it just keeps spinning in random angel instead of pointing at the aim target and the rotation attr values go up thousands. The final matrix and euler values are actually correct (I printed them out and assigned them to another object ). I guess the issue is probably about the way setting output value but I am not sure. Maya2018 is used. Thanks so much!
Aaron -- 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/4403b087-9337-44b9-bc9b-ad2b776f2773%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
import sys
import math
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
"""
import maya.cmds as cmds
nodePath='/aimNode.py'
cmds.loadPlugin(nodePath)
cmds.createNode("AimNode")
cmds.connectAttr('aimBase.translate', 'AimNode1.inTranslate', f=True)
cmds.connectAttr('up.worldMatrix[0]', 'AimNode1.upVector', f=True)
cmds.connectAttr('aimTarget.worldMatrix[0]', 'AimNode1.driverMatrix', f=True)
cmds.connectAttr('AimNode1.outRotate', 'aimBase.rotate', f=True)
"""
nodeName = 'AimNode'
nodeId = OpenMaya.MTypeId(0x100fff)
class AimNode(OpenMayaMPx.MPxNode):
# create attribte handle
inTranslateX = OpenMaya.MObject()
inTranslateY = OpenMaya.MObject()
inTranslateZ = OpenMaya.MObject()
inTranslate = OpenMaya.MObject()
outRotateX = OpenMaya.MObject()
outRotateY = OpenMaya.MObject()
outRotateZ = OpenMaya.MObject()
outRotate = OpenMaya.MObject()
driverMatrix = OpenMaya.MObject()
upVector = OpenMaya.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, dataBlock):
""""""
if ( plug==AimNode.outRotate or plug==AimNode.outRotateX or plug==AimNode.outRotateY or plug==AimNode.outRotateZ ):
# GET INPUT VALUES
driverMatrixDataHandle = dataBlock.inputValue(AimNode.driverMatrix)
upVectorMatrixDataHandle = dataBlock.inputValue(AimNode.upVectorMatrix)
inTranslateDataHandle = dataBlock.inputValue(AimNode.inTranslate)
driverMatrixV = driverMatrixDataHandle.asMatrix()
upVectorMatrixV = upVectorMatrixDataHandle.asMatrix()
inTranslateV = inTranslateDataHandle.asVector()
# DO CALCULATION
driverMatrixPos = OpenMaya.MVector( driverMatrixV(3,0), driverMatrixV(3,1), driverMatrixV(3,2))
upVectorMatrixPos = OpenMaya.MVector(upVectorMatrixV(3,0),upVectorMatrixV(3,1),upVectorMatrixV(3,2))
# compute needed vectors
upVec = OpenMaya.MVector( upVectorMatrixPos - inTranslateV )
aimVec = OpenMaya.MVector( driverMatrixPos - inTranslateV )
cross = OpenMaya.MVector(aimVec ^ upVec)
upVec = cross ^ aimVec
upVec.normalize()
aimVec.normalize()
cross.normalize()
# build a rotation matrix
rotMatrix = OpenMaya.MMatrix()
matrixList =[aimVec.x , aimVec.y , aimVec.z , 0,
upVec.x , upVec.y , upVec.z , 0,
cross.x , cross.y , cross.z , 0,
inTranslateV[0], inTranslateV[1], inTranslateV[2], 1]
OpenMaya.MScriptUtil.createMatrixFromList(matrixList, rotMatrix)
print '{},{},{},{},'.format( rotMatrix(0,0),rotMatrix(0,1),rotMatrix(0,2),rotMatrix(0,3) )
print '{},{},{},{},'.format( rotMatrix(1,0),rotMatrix(1,1),rotMatrix(1,2),rotMatrix(1,3) )
print '{},{},{},{},'.format( rotMatrix(2,0),rotMatrix(2,1),rotMatrix(2,2),rotMatrix(2,3) )
print '{},{},{},{} '.format( rotMatrix(3,0),rotMatrix(3,1),rotMatrix(3,2),rotMatrix(3,3) )
# SET OUTPUT VALUES
euler = OpenMaya.MTransformationMatrix(rotMatrix).eulerRotation() * (180/math.pi)#rad to degree
dataHandleRotate = dataBlock.outputValue(AimNode.outRotate)
dataHandleRotate.set3Float(euler[0], euler[1], euler[2])
print '{},{},{}'.format( euler[0], euler[1], euler[2] )
dataBlock.setClean(plug)
else:
return OpenMaya.kUnknownParameter
def nodeCreator():
return OpenMayaMPx.asMPxPtr( AimNode() )
def nodeInitializer():
mFnNumAttr = OpenMaya.MFnNumericAttribute()
mFnTypedAttr = OpenMaya.MFnTypedAttribute()
mFnCompoundAttr = OpenMaya.MFnCompoundAttribute()
mFnMatrixAtrr = OpenMaya.MFnMatrixAttribute()
mFnUnitAttr = OpenMaya.MFnUnitAttribute()
AimNode.driverMatrix = mFnMatrixAtrr.create('driverMatrix','drm')
AimNode.upVectorMatrix = mFnMatrixAtrr.create('upVector', 'upvm')
AimNode.addAttribute(AimNode.driverMatrix)
AimNode.addAttribute(AimNode.upVectorMatrix)
AimNode.inTranslateX = mFnNumAttr.create('inTranslateX','intx',OpenMaya.MFnNumericData.kDouble,0.0)
mFnNumAttr.setReadable(1)
mFnNumAttr.setWritable(1)
mFnNumAttr.setStorable(1)
mFnNumAttr.setKeyable(1)
AimNode.addAttribute(AimNode.inTranslateX)
AimNode.inTranslateY = mFnNumAttr.create('inTranslateY','inty',OpenMaya.MFnNumericData.kDouble,0.0)
mFnNumAttr.setReadable(1)
mFnNumAttr.setWritable(1)
mFnNumAttr.setStorable(1)
mFnNumAttr.setKeyable(1)
AimNode.addAttribute(AimNode.inTranslateY)
AimNode.inTranslateZ = mFnNumAttr.create('inTranslateZ','intz',OpenMaya.MFnNumericData.kDouble,0.0)
mFnNumAttr.setReadable(1)
mFnNumAttr.setWritable(1)
mFnNumAttr.setStorable(1)
mFnNumAttr.setKeyable(1)
AimNode.addAttribute(AimNode.inTranslateZ)
AimNode.inTranslate = mFnCompoundAttr.create('inTranslate','int')
mFnCompoundAttr.addChild(AimNode.inTranslateX)
mFnCompoundAttr.addChild(AimNode.inTranslateY)
mFnCompoundAttr.addChild(AimNode.inTranslateZ)
mFnCompoundAttr.setReadable(1)
mFnCompoundAttr.setWritable(1)
mFnCompoundAttr.setStorable(1)
mFnCompoundAttr.setKeyable(1)
AimNode.addAttribute(AimNode.inTranslate)
AimNode.outRotateX = mFnNumAttr.create('outRotateX','orx',OpenMaya.MFnUnitAttribute.kAngle,0.0)
mFnNumAttr.setReadable(1)
mFnNumAttr.setWritable(0)
mFnNumAttr.setStorable(0)
mFnNumAttr.setKeyable(0)
AimNode.addAttribute(AimNode.outRotateX)
AimNode.outRotateY = mFnNumAttr.create('outRotateY','ory',OpenMaya.MFnUnitAttribute.kAngle,0.0)
mFnNumAttr.setReadable(1)
mFnNumAttr.setWritable(0)
mFnNumAttr.setStorable(0)
mFnNumAttr.setKeyable(0)
AimNode.addAttribute(AimNode.outRotateY)
AimNode.outRotateZ = mFnNumAttr.create('outRotateZ','orz',OpenMaya.MFnUnitAttribute.kAngle,0.0)
mFnNumAttr.setReadable(1)
mFnNumAttr.setWritable(0)
mFnNumAttr.setStorable(0)
mFnNumAttr.setKeyable(0)
AimNode.addAttribute(AimNode.outRotateZ)
AimNode.outRotate = mFnCompoundAttr.create('outRotate','or')
mFnCompoundAttr.addChild(AimNode.outRotateX)
mFnCompoundAttr.addChild(AimNode.outRotateY)
mFnCompoundAttr.addChild(AimNode.outRotateZ)
mFnCompoundAttr.setReadable(1)
mFnCompoundAttr.setWritable(0)
mFnCompoundAttr.setStorable(0)
mFnCompoundAttr.setKeyable(0)
AimNode.addAttribute(AimNode.outRotate)
AimNode.attributeAffects(AimNode.inTranslate , AimNode.outRotate)
AimNode.attributeAffects(AimNode.upVectorMatrix, AimNode.outRotate)
AimNode.attributeAffects(AimNode.driverMatrix , AimNode.outRotate)
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode(nodeName,nodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write("Failed to register node:"+ nodeName)
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode(nodeId)
except:
sys.stderr.write("Failed to unregister node:"+ nodeName)
aim.ma
Description: Binary data
