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
-~----------~----~----~----~------~----~------~--~---

Reply via email to