Hi guys! I am learning the maya python api and have been trying to write a deformer that will offset vertices in the direction of there given velocity. Currently it is doing absolutley nothing, and i cant seem to figure out why. Any tips would be really helpfull for a beginner :)
Cheers guys! The code is attatched below . -- 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 python_inside_maya+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/3a315e20-4f6d-49d5-9462-09e564f3976dn%40googlegroups.com.
import math import sys import maya.OpenMaya as OpenMaya import maya.OpenMayaAnim as OpenMayaAnim import maya.OpenMayaMPx as OpenMayaMPx import maya.cmds as cmds kPluginNodeTypeName = "velocityDeformer" velocityDeformerId = OpenMaya.MTypeId(0x8731) outputGeom = OpenMayaMPx.cvar.MPxGeometryFilter_outputGeom envelope = OpenMayaMPx.cvar.MPxGeometryFilter_envelope ## Node definition ## class velocityDeformer(OpenMayaMPx.MPxDeformerNode): aTime = OpenMaya.MObject() def __init__(self): OpenMayaMPx.MPxDeformerNode.__init__(self) self._initialized = False self._previousPosition = OpenMaya.MPointArray() self._previousTime = OpenMaya.MTime() def deform(self, dataBlock, geomIter, matrix, multiIndex): ## get input mesh point array ## inputAttribute = OpenMayaMPx.cvar.MPxGeometryFilter_input inputGeom = OpenMayaMPx.cvar.MPxGeometryFilter_inputGeom hInput = dataBlock.outputArrayValue(inputAttribute) hInput.jumpToElement(multiIndex) oInputGeom = hInput.outputValue().child(inputGeom).asMesh() fnInputMesh = OpenMaya.MFnMesh(oInputGeom) input_points = OpenMaya.MPointArray() fnInputMesh.getPoints(input_points) ## get time ## currentTime = OpenMayaAnim.MAnimControl.currentTime() ## get envelope ## envelopeHandle = dataBlock.inputValue(envelope) envelopeValue = envelopeHandle.asFloat() ## get multiplier ## multiplier = dataBlock.inputValue(velocityDeformer.aMultiplier).asFloat() ## Initialize the data ## if not self._initialized: self._previousTime = currentTime self._previousPosition = input_points self._initialized = True while geomIter.isDone() == False: point = geomIter.position() time = self._previousTime - OpenMayaAnim.MAnimControl.currentTime() velocity = (point - self._previousPosition[geomIter.index()]) / time newPosition = point + (velocity * multiplier) input_points[geomIter.index()] = newPosition point = newPosition * envelopeValue geomIter.setPosition(point) geomIter.next() self._previousPosition = OpenMaya.MPointArray(input_points) self._previousTime = OpenMayaAnim.MAnimControl.currentTime() ## creator ## def nodeCreator(): return OpenMayaMPx.asMPxPtr(velocityDeformer()) ## initializer ## def nodeInitializer(): nAttr = OpenMaya.MFnNumericAttribute() velocityDeformer.aMultiplier = nAttr.create('Multiplier', 'mp', OpenMaya.MFnNumericData.kFloat) nAttr.setKeyable(True) velocityDeformer.addAttribute(velocityDeformer.aMultiplier) velocityDeformer.attributeAffects(velocityDeformer.aMultiplier, outputGeom) ## initialize the script plug-in ## def initializePlugin(mobject): mplugin = OpenMayaMPx.MFnPlugin(mobject) try: mplugin.registerNode(kPluginNodeTypeName, velocityDeformerId, nodeCreator, nodeInitializer, OpenMayaMPx.MPxNode.kDeformerNode) except: sys.stderr.write("Failed to register node: %s\n" % kPluginNodeTypeName) ## uninitialize the script plug-in ## def uninitializePlugin(mobject): mplugin = OpenMayaMPx.MFnPlugin(mobject) try: mplugin.deregisterNode(velocityDeformerId) except: sys.stderr.write("Failed to unregister node: %s\n" % kPluginNodeTypeName)