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 [email protected].
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)