scripted/simpleSolverNode.py
64 import maya.OpenMaya
as OpenMaya
65 import maya.OpenMayaUI
as OpenMayaUI
66 import maya.OpenMayaMPx
as OpenMayaMPx
67 import maya.OpenMayaAnim
as OpenMayaAnim
71 kSolverNodeName =
"spSimpleSolverNode"
72 kSolverNodeId = OpenMaya.MTypeId(0x8700a)
75 class simpleSolverNode(OpenMayaMPx.MPxIkSolverNode):
77 OpenMayaMPx.MPxIkSolverNode.__init__(self)
80 def solverTypeName(self):
81 return kSolverNodeName
88 def doSimpleSolver(self):
90 Solve single joint in the x-y plane
91 - first it calculates the angle between the handle and the end-effector.
92 - then it determines which way to rotate the joint.
94 handle_group = self.handleGroup()
95 handle = handle_group.handle(0)
96 handlePath = OpenMaya.MDagPath.getAPathTo(handle)
97 fnHandle = OpenMayaAnim.MFnIkHandle(handlePath)
100 end_effector = OpenMaya.MDagPath()
101 fnHandle.getEffector(end_effector)
102 tran = OpenMaya.MFnTransform(end_effector)
103 effector_position = tran.rotatePivot(OpenMaya.MSpace.kWorld)
106 handle_position = fnHandle.rotatePivot(OpenMaya.MSpace.kWorld)
109 start_joint = OpenMaya.MDagPath()
110 fnHandle.getStartJoint(start_joint)
111 start_transform = OpenMaya.MFnTransform(start_joint)
112 start_position = start_transform.rotatePivot(OpenMaya.MSpace.kWorld)
115 v1 = start_position - effector_position
116 v2 = start_position - handle_position
141 U = effector_position - start_position
145 zAxis = OpenMaya.MVector(0.0, 0.0, 1.0)
150 P = handle_position - effector_position
153 PdotN = P[0]*N[0] + P[1]*N[1]
160 jointAngles = OpenMaya.MDoubleArray()
162 self._getJointAngles(jointAngles)
167 jointAngles.set(jointAngles[0] + rot, 0)
168 self._setJointAngles(jointAngles)
175 return OpenMayaMPx.asMPxPtr(simpleSolverNode())
178 def nodeInitializer():
184 def initializePlugin(mobject):
185 mplugin = OpenMayaMPx.MFnPlugin(mobject,
"Autodesk",
"1.0",
"Any")
188 mplugin.registerNode(kSolverNodeName, kSolverNodeId, nodeCreator, nodeInitializer, OpenMayaMPx.MPxNode.kIkSolverNode)
190 sys.stderr.write(
"Failed to register node: %s" % kSolverNodeName)
195 def uninitializePlugin(mobject):
196 mplugin = OpenMayaMPx.MFnPlugin(mobject)
198 mplugin.deregisterNode(kSolverNodeId)
200 sys.stderr.write(
"Failed to unregister node: %s" % kSolverNodeName)