Here's simple field that adds force to particles based on particle id. In
this field I use only particle positions and velocities, but in similar way
you can obtain mass and other particle attributes using MPxFieldNode static
variables ( check torusField.py in devkit).
import sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaUI as OpenMayaUI
import maya.OpenMayaMPx as OpenMayaMPx
import maya.OpenMayaRender as OpenMayaRender
import maya.OpenMayaFX as OpenMayaFX
kPluginName = "myField"
kPluginNodeId = OpenMaya.MTypeId(0x87008)
glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
glFT = glRenderer.glFunctionTable()
def statusError(msg):
sys.stderr.write("%s\n" % message)
raise # called from exception handlers only, reraise exception
# Node definition
class MyField(OpenMayaMPx.MPxFieldNode):
def __init__(self):
OpenMayaMPx.MPxFieldNode.__init__(self)
def compute(self, plug, block):
thisNode = self.thisMObject()
outputForce = OpenMayaMPx.cvar.MPxFieldNode_mOutputForce
if not (plug == outputForce):
return
multiIndex = plug.logicalIndex()
mInputData = OpenMayaMPx.cvar.MPxFieldNode_mInputData
hInputArray = block.outputArrayValue( mInputData )
hInputArray.jumpToElement( multiIndex )
hCompond = hInputArray.inputValue()
mMagnitude = OpenMayaMPx.cvar.MPxFieldNode_mMagnitude
hMagnitude = block.inputValue( mMagnitude )
magnitude = hMagnitude.asDouble()
inputPositions = OpenMayaMPx.cvar.MPxFieldNode_mInputPositions
hPosition = hCompond.child( inputPositions )
dPosition = hPosition.data()
fnPosition = OpenMaya.MFnVectorArrayData( dPosition )
points = fnPosition.array()
inputVelocities = OpenMayaMPx.cvar.MPxFieldNode_mInputVelocities
hVelocity = hCompond.child( inputVelocities )
dVelocity = hVelocity.data()
fnVelocity = OpenMaya.MFnVectorArrayData( dVelocity )
velocities = fnVelocity.array()
if points.length() != velocities.length():
return
hOutArray = block.outputArrayValue( outputForce )
bOutArray = hOutArray.builder()
hOut = bOutArray.addElement( multiIndex )
forceArray = OpenMaya.MVectorArray()
forceArray.clear()
for i in range(points.length()):
forceArray.append( OpenMaya.MVector( i , 0, 0) * magnitude )
fnOutputForce = OpenMaya.MFnVectorArrayData()
dOutputForce = fnOutputForce.create( forceArray )
hOut.setMObject( dOutputForce )
block.setClean(plug)
# creator
def nodeCreator():
return OpenMayaMPx.asMPxPtr(MyField())
# initializer
def nodeInitializer():
pass
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject, "Autodesk", "1.0", "Any")
try:
mplugin.registerNode(kPluginName, kPluginNodeId, nodeCreator,
nodeInitializer, OpenMayaMPx.MPxNode.kFieldNode)
except:
statusError("Failed to register node: %s" % kPluginName)
# uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode(kPluginNodeId)
except:
statusError("Failed to deregister node: %s" % kPluginName)
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/python_inside_maya
-~----------~----~----~----~------~----~------~--~---