Maya で mesh のデーターを作成するには、
maya.OpenMaya.MFnMesh クラスの create() メソッドを使用します。
create() メソッドには以下の引数を与えます。
ポリゴンメッシュのプレーンを作成するプラグインを作ってみましょう。
作成されるプレーンは、フェースがひとつだけのシンプルなものです。
import sys
import maya.OpenMaya
import maya.OpenMayaMPx
kPluginNodeName = 'simplePoly1'
kPluginNodeId = maya.OpenMaya.MTypeId(0x87007)
class simplePoly1(maya.OpenMayaMPx.MPxNode):
widthHeight = maya.OpenMaya.MObject()
outputMesh = maya.OpenMaya.MObject()
def __init__(self):
maya.OpenMayaMPx.MPxNode.__init__(self)
def _createMesh(self, planeSize, outData):
numFaces = 1
vtxs = []
vtxs.append(maya.OpenMaya.MFloatPoint(planeSize, 0.0, planeSize))
vtxs.append(maya.OpenMaya.MFloatPoint(planeSize, 0.0, -planeSize))
vtxs.append(maya.OpenMaya.MFloatPoint(-planeSize, 0.0, -planeSize))
vtxs.append(maya.OpenMaya.MFloatPoint(-planeSize, 0.0, planeSize))
numVertices = len(vtxs)
points = maya.OpenMaya.MFloatPointArray()
points.setLength(numVertices)
for i in range(numVertices):
points.set(vtxs[i], i)
faceConnects = maya.OpenMaya.MIntArray()
faceConnects.setLength(4)
faceConnects[0] = 1
faceConnects[1] = 2
faceConnects[2] = 3
faceConnects[3] = 0
faceCounts = maya.OpenMaya.MIntArray()
faceCounts.setLength(numFaces)
faceCounts.set(4, 0)
meshFS = maya.OpenMaya.MFnMesh()
newMesh = meshFS.create(numVertices, numFaces, points, faceCounts, faceConnects, outData)
return newMesh
def compute(self, plug, data):
if plug == simplePoly1.outputMesh:
dataHandle = data.inputValue(simplePoly1.widthHeight)
size = dataHandle.asFloat()
dataCreator = maya.OpenMaya.MFnMeshData()
newOutputData = dataCreator.create()
self._createMesh(size, newOutputData)
outputHandle = data.outputValue(simplePoly1.outputMesh)
outputHandle.setMObject(newOutputData)
data.setClean(plug)
return maya.OpenMaya.MStatus.kSuccess
else:
return maya.OpenMaya.kUnknownParameter
def nodeCreator():
return maya.OpenMayaMPx.asMPxPtr(simplePoly1())
def nodeInitializer():
nAttr = maya.OpenMaya.MFnNumericAttribute()
simplePoly1.widthHeight = nAttr.create('widthHeight', 'wh', maya.OpenMaya.MFnNumericData.kFloat, 1.0)
nAttr.setStorable(1)
typedAttr = maya.OpenMaya.MFnTypedAttribute()
simplePoly1.outputMesh = typedAttr.create('outputMesh', 'out', maya.OpenMaya.MFnData.kMesh)
simplePoly1.addAttribute(simplePoly1.widthHeight)
simplePoly1.addAttribute(simplePoly1.outputMesh)
simplePoly1.attributeAffects(simplePoly1.widthHeight, simplePoly1.outputMesh)
def initializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode(kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write('Failed to register node: %s' % kPluginNodeName)
raise
def uninitializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode( kPluginNodeId )
except:
sys.stderr.write('Failed to deregister node: %s' % kPluginNodeName)
raise
import sys
import maya.OpenMaya
import maya.OpenMayaMPx
kPluginNodeName = 'simplePoly1'
kPluginNodeId = maya.OpenMaya.MTypeId(0x87007)
class simplePoly1(maya.OpenMayaMPx.MPxNode):
widthHeight = maya.OpenMaya.MObject()
outputMesh = maya.OpenMaya.MObject()
def __init__(self):
maya.OpenMayaMPx.MPxNode.__init__(self)
def _createMesh(self, planeSize, outData):
numFaces = 1
vtxs = []
vtxs.append(maya.OpenMaya.MFloatPoint(planeSize, 0.0, planeSize))
vtxs.append(maya.OpenMaya.MFloatPoint(planeSize, 0.0, -planeSize))
vtxs.append(maya.OpenMaya.MFloatPoint(-planeSize, 0.0, -planeSize))
vtxs.append(maya.OpenMaya.MFloatPoint(-planeSize, 0.0, planeSize))
numVertices = size(vtxs)
points = maya.OpenMaya.MFloatPointArray()
points.setLength(numVertices)
for i in range(numVertices):
points.set(vtxs[i], i)
faceConnects = maya.OpenMaya.MIntArray()
faceConnects.setLength(4)
faceConnects[0] = 1
faceConnects[1] = 2
faceConnects[2] = 3
faceConnects[3] = 0
faceCounts = maya.OpenMaya.MIntArray()
faceCounts.setLength(numFaces)
faceCounts.set(4, 0)
meshFS = maya.OpenMaya.MFnMesh()
newMesh = meshFS.create(numVertices, numFaces, points, faceCounts, faceConnects, outData)
return newMesh
def compute(self, plug, data):
if plug == simplePoly1.outputMesh:
dataHandle = data.inputValue(simplePoly1.widthHeight)
size = dataHandle.asFloat()
dataCreator = maya.OpenMaya.MFnMeshData()
newOutputData = dataCreator.create()
self._createMesh(size, newOutputData)
outputHandle = data.outputValue(simplePoly1.outputMesh)
outputHandle.setMObject(newOutputData)
data.setClean(plug)
return maya.OpenMaya.MStatus.kSuccess
else:
return maya.OpenMaya.kUnknownParameter
def nodeCreator():
return maya.OpenMayaMPx.asMPxPtr(simplePoly1())
def nodeInitializer():
nAttr = maya.OpenMaya.MFnNumericAttribute()
simplePoly1.widthHeight = nAttr.create('widthHeight', 'wh', maya.OpenMaya.MFnNumericData.kFloat, 1.0)
nAttr.setStorable(1)
typedAttr = maya.OpenMaya.MFnTypedAttribute()
simplePoly1.outputMesh = typedAttr.create('outputMesh', 'out', maya.OpenMaya.MFnData.kMesh)
simplePoly1.addAttribute(simplePoly1.widthHeight)
simplePoly1.addAttribute(simplePoly1.outputMesh)
simplePoly1.attributeAffects(simplePoly1.widthHeight, simplePoly1.outputMesh)
def initializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode(kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write('Failed to register node: %s' % kPluginNodeName)
raise
def uninitializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode(kPluginNodeId)
except:
sys.stderr.write('Failed to deregister node: %s' % kPluginNodeName)
raise