ファイル名: animCubeNode.py
注釈付きの出力: 次のイメージでは、点線の矢印は立方体の背面と下部のポリゴンをポイントしており、完全な矢印は前方と上面のポリゴンをポイントしています。このイメージに添付されているテーブルは、MFnMesh.create()
で使用されるさまざまな配列パラメータを示しています。
プログラムの概要: 次のプラグイン コードは、Maya API マニュアルで提供されている animCubeNode.py
サンプルを適合する形式にしたものです。一部の変数名は、クラスのドキュメントとよりよく一致するようにリファクタリングされ、上の出力で注釈されています。この MPxNode
プラグインでは、生成される出力立方体メッシュのスケールを決定する Maya の時間を受け入れる、型付きの入力アトリビュートが定義されています。このコマンドを実行したら、Maya ユーザ インタフェースでタイムラインをスライドして、アニメーションを表示します。
注: この立方体メッシュを作成する方法は、「例: ボクセライザ ノード」でボクセルを作成する場合にも使用されます。
Python API 2.0:
# pyAnimCubeNode.py
import sys
import maya.api.OpenMaya as OpenMaya
def maya_useNewAPI():
"""
The presence of this function tells Maya that the plugin produces, and
expects to be passed, objects created using the Maya Python API 2.0.
"""
pass
kPluginNodeName = "spAnimCube"
kPluginNodeId = OpenMaya.MTypeId(0x8700B)
##########################################################
# Plug-in
##########################################################
class animCube(OpenMaya.MPxNode):
time = OpenMaya.MObject()
outputMesh = OpenMaya.MObject()
def __init__(self):
''' Constructor. '''
OpenMaya.MPxNode.__init__(self)
def createMesh(self, tempTime, outData):
'''
Create a cube mesh, and scale it given the current frame number.
The resulting mesh data is stored within outData.
'''
frame = int(tempTime.asUnits(OpenMaya.MTime.kFilm))
if frame is 0:
frame = 1
cubeSize = 0.5 * float(frame % 10)
numPolygons = 6
numVertices = 8
numPolygonConnects = 4 * numPolygons # four vertices are needed per polygon. (i.e. 24 numPolygonConnects)
vertexArray = OpenMaya.MFloatPointArray()
vertexArray.setLength( numVertices )
vertexArray[0] = OpenMaya.MFloatPoint(-cubeSize, -cubeSize, -cubeSize)
vertexArray[1] = OpenMaya.MFloatPoint( cubeSize, -cubeSize, -cubeSize)
vertexArray[2] = OpenMaya.MFloatPoint( cubeSize, -cubeSize, cubeSize)
vertexArray[3] = OpenMaya.MFloatPoint(-cubeSize, -cubeSize, cubeSize)
vertexArray[4] = OpenMaya.MFloatPoint(-cubeSize, cubeSize, -cubeSize)
vertexArray[5] = OpenMaya.MFloatPoint(-cubeSize, cubeSize, cubeSize)
vertexArray[6] = OpenMaya.MFloatPoint( cubeSize, cubeSize, cubeSize)
vertexArray[7] = OpenMaya.MFloatPoint( cubeSize, cubeSize, -cubeSize)
polygonCounts = OpenMaya.MIntArray()
polygonCounts.setLength( numPolygons )
for i in range (0,numPolygons):
polygonCounts[i] = 4
polygonConnects = OpenMaya.MIntArray()
polygonConnects.setLength( numPolygonConnects )
polygonConnects[0] = 0
polygonConnects[1] = 1
polygonConnects[2] = 2
polygonConnects[3] = 3
polygonConnects[4] = 4
polygonConnects[5] = 5
polygonConnects[6] = 6
polygonConnects[7] = 7
polygonConnects[8] = 3
polygonConnects[9] = 2
polygonConnects[10] = 6
polygonConnects[11] = 5
polygonConnects[12] = 0
polygonConnects[13] = 3
polygonConnects[14] = 5
polygonConnects[15] = 4
polygonConnects[16] = 0
polygonConnects[17] = 4
polygonConnects[18] = 7
polygonConnects[19] = 1
polygonConnects[20] = 1
polygonConnects[21] = 7
polygonConnects[22] = 6
polygonConnects[23] = 2
meshFn = OpenMaya.MFnMesh()
newMesh = meshFn.create(vertexArray, polygonCounts, polygonConnects, parent=outData)
def compute(self, plug, data):
if plug == animCube.outputMesh:
timeData = data.inputValue(animCube.time)
tempTime = timeData.asTime()
outputHandle = data.outputValue(animCube.outputMesh)
dataCreator = OpenMaya.MFnMeshData()
newOutputData = dataCreator.create()
self.createMesh(tempTime, newOutputData)
outputHandle.setMObject(newOutputData)
data.setClean(plug)
else:
return OpenMaya.kUnknownParameter
##########################################################
# Plug-in initialization.
##########################################################
def nodeCreator():
''' Creates an instance of our node class and delivers it to Maya as a pointer. '''
return animCube()
def nodeInitializer():
''' Defines the input and output attributes as static variables in our plug-in class. '''
unitAttr = OpenMaya.MFnUnitAttribute()
typedAttr = OpenMaya.MFnTypedAttribute()
animCube.time = unitAttr.create("time", "tm", OpenMaya.MFnUnitAttribute.kTime, 0.0)
animCube.outputMesh = typedAttr.create("outputMesh", "out", OpenMaya.MFnData.kMesh)
animCube.addAttribute(animCube.time)
animCube.addAttribute(animCube.outputMesh)
animCube.attributeAffects(animCube.time, animCube.outputMesh)
def initializePlugin(mobject):
''' Initialize the plug-in '''
mplugin = OpenMaya.MFnPlugin(mobject)
try:
mplugin.registerNode( kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write( "Failed to register node: " + kPluginNodeName )
raise
def uninitializePlugin(mobject):
''' Uninitializes the plug-in '''
mplugin = OpenMaya.MFnPlugin(mobject)
try:
mplugin.deregisterNode( kPluginNodeId )
except:
sys.stderr.write( "Failed to deregister node: " + kPluginNodeName )
raise
##########################################################
# Sample usage.
##########################################################
'''
# Copy the following lines and run them in Maya's Python Script Editor:
import maya.cmds as cmds
cmds.loadPlugin( "pyAnimCubeNode.py" )
cmds.createNode( "transform", name="animCube1" )
cmds.createNode( "mesh", name="animCubeShape1", parent="animCube1" )
cmds.sets( "animCubeShape1", add="initialShadingGroup" )
cmds.createNode( "spAnimCube", name="animCubeNode1" )
cmds.connectAttr( "time1.outTime", "animCubeNode1.time" )
cmds.connectAttr( "animCubeNode1.outputMesh", "animCubeShape1.inMesh" )
'''
Python API 1.0:
# animCubeNode.py
import sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
kPluginNodeName = "spAnimCube"
kPluginNodeId = OpenMaya.MTypeId(0x8700B)
##########################################################
# Plug-in
##########################################################
class animCube(OpenMayaMPx.MPxNode):
time = OpenMaya.MObject()
outputMesh = OpenMaya.MObject()
def __init__(self):
''' Constructor. '''
OpenMayaMPx.MPxNode.__init__(self)
def createMesh(self, tempTime, outData):
'''
Create a cube mesh, and scale it given the current frame number.
The resulting mesh data is stored within outData.
'''
frame = int(tempTime.asUnits(OpenMaya.MTime.kFilm))
if frame is 0:
frame = 1
cubeSize = 0.5 * float(frame % 10)
numPolygons = 6
numVertices = 8
numPolygonConnects = 4 * numPolygons # four vertices are needed per polygon. (i.e. 24 numPolygonConnects)
vertexArray = OpenMaya.MFloatPointArray()
vertexArray.setLength( numVertices )
vertexArray.set( OpenMaya.MFloatPoint(-cubeSize, -cubeSize, -cubeSize), 0)
vertexArray.set( OpenMaya.MFloatPoint( cubeSize, -cubeSize, -cubeSize), 1)
vertexArray.set( OpenMaya.MFloatPoint( cubeSize, -cubeSize, cubeSize), 2)
vertexArray.set( OpenMaya.MFloatPoint(-cubeSize, -cubeSize, cubeSize), 3)
vertexArray.set( OpenMaya.MFloatPoint(-cubeSize, cubeSize, -cubeSize), 4)
vertexArray.set( OpenMaya.MFloatPoint(-cubeSize, cubeSize, cubeSize), 5)
vertexArray.set( OpenMaya.MFloatPoint( cubeSize, cubeSize, cubeSize), 6)
vertexArray.set( OpenMaya.MFloatPoint( cubeSize, cubeSize, -cubeSize), 7)
polygonCounts = OpenMaya.MIntArray()
polygonCounts.setLength( numPolygons )
polygonCounts.set(4, 0)
polygonCounts.set(4, 1)
polygonCounts.set(4, 2)
polygonCounts.set(4, 3)
polygonCounts.set(4, 4)
polygonCounts.set(4, 5)
polygonConnects = OpenMaya.MIntArray()
polygonConnects.setLength( numPolygonConnects )
polygonConnects.set(0, 0)
polygonConnects.set(1, 1)
polygonConnects.set(2, 2)
polygonConnects.set(3, 3)
polygonConnects.set(4, 4)
polygonConnects.set(5, 5)
polygonConnects.set(6, 6)
polygonConnects.set(7, 7)
polygonConnects.set(3, 8)
polygonConnects.set(2, 9)
polygonConnects.set(6, 10)
polygonConnects.set(5, 11)
polygonConnects.set(0, 12)
polygonConnects.set(3, 13)
polygonConnects.set(5, 14)
polygonConnects.set(4, 15)
polygonConnects.set(0, 16)
polygonConnects.set(4, 17)
polygonConnects.set(7, 18)
polygonConnects.set(1, 19)
polygonConnects.set(1, 20)
polygonConnects.set(7, 21)
polygonConnects.set(6, 22)
polygonConnects.set(2, 23)
meshFn = OpenMaya.MFnMesh()
newMesh = meshFn.create(numVertices, numPolygons, vertexArray, polygonCounts, polygonConnects, outData)
def compute(self, plug, data):
if plug == animCube.outputMesh:
timeData = data.inputValue(animCube.time)
tempTime = timeData.asTime()
outputHandle = data.outputValue(animCube.outputMesh)
dataCreator = OpenMaya.MFnMeshData()
newOutputData = dataCreator.create()
self.createMesh(tempTime, newOutputData)
outputHandle.setMObject(newOutputData)
data.setClean(plug)
else:
return OpenMaya.kUnknownParameter
##########################################################
# Plug-in initialization.
##########################################################
def nodeCreator():
''' Creates an instance of our node class and delivers it to Maya as a pointer. '''
return OpenMayaMPx.asMPxPtr( animCube() )
def nodeInitializer():
''' Defines the input and output attributes as static variables in our plug-in class. '''
unitAttr = OpenMaya.MFnUnitAttribute()
typedAttr = OpenMaya.MFnTypedAttribute()
animCube.time = unitAttr.create("time", "tm", OpenMaya.MFnUnitAttribute.kTime, 0.0)
animCube.outputMesh = typedAttr.create("outputMesh", "out", OpenMaya.MFnData.kMesh)
animCube.addAttribute(animCube.time)
animCube.addAttribute(animCube.outputMesh)
animCube.attributeAffects(animCube.time, animCube.outputMesh)
def initializePlugin(mobject):
''' Initialize the plug-in '''
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode( kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write( "Failed to register node: " + kPluginNodeName )
raise
def uninitializePlugin(mobject):
''' Uninitializes the plug-in '''
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode( kPluginNodeId )
except:
sys.stderr.write( "Failed to deregister node: " + kPluginNodeName )
raise
##########################################################
# Sample usage.
##########################################################
'''
# Copy the following lines and run them in Maya's Python Script Editor:
import maya.cmds as cmds
cmds.loadPlugin( "animCubeNode.py" )
cmds.createNode( "transform", name="animCube1" )
cmds.createNode( "mesh", name="animCubeShape1", parent="animCube1" )
cmds.sets( "animCubeShape1", add="initialShadingGroup" )
cmds.createNode( "spAnimCube", name="animCubeNode1" )
cmds.connectAttr( "time1.outTime", "animCubeNode1.time" )
cmds.connectAttr( "animCubeNode1.outputMesh", "animCubeShape1.inMesh" )
'''