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)

Reply via email to