テクスチャノード・プラグインによって、Maya のテクスチャ・ノードを作成することができます。
ここでは、2Dテクスチャの作成方法を解説します。
2Dテクスチャ・ノードを作成するときには、 最低限以下のアトリビュートを実装する必要があります。
UV座標が0.5以上の部分に色がつくというテクスチャノードを作成してみましょう。
import sys import maya.OpenMaya import maya.OpenMayaMPx kPluginNodeName = 'myTexture1' kPluginNodeId = maya.OpenMaya.MTypeId(0x87010) class myTexture1(maya.OpenMayaMPx.MPxNode): aUVCoord = maya.OpenMaya.MObject() aFilterSize = maya.OpenMaya.MObject() aInColor = maya.OpenMaya.MObject() aOutColor = maya.OpenMaya.MObject() def __init__(self): maya.OpenMayaMPx.MPxNode.__init__(self) def compute(self, plug, block): if plug == myTexture1.aOutColor or plug.parent() == myTexture1.aOutColor: resultColor = maya.OpenMaya.MFloatVector(0.0, 0.0, 0.0) uv = block.inputValue(myTexture1.aUVCoord).asFloat2(); inColor = block.inputValue(myTexture1.aInColor).asFloatVector() if uv[0] > 0.5 and uv[1] > 0.5: resultColor.x = inColor.x resultColor.y = inColor.y resultColor.z = inColor.z outColorHandle = block.outputValue(myTexture1.aOutColor) outColorHandle.setMFloatVector(resultColor) outColorHandle.setClean() else: return maya.OpenMaya.kUnknownParameter def nodeCreator(): return maya.OpenMayaMPx.asMPxPtr(myTexture1()) def nodeInitializer(): nAttr = maya.OpenMaya.MFnNumericAttribute() child1 = nAttr.create('uCoord', 'u', maya.OpenMaya.MFnNumericData.kFloat) child2 = nAttr.create('vCoord', 'v', maya.OpenMaya.MFnNumericData.kFloat) myTexture1.aUVCoord = nAttr.create("uvCoord", "uv", child1, child2) nAttr.setKeyable(1) nAttr.setStorable(1) nAttr.setReadable(1) nAttr.setWritable(1) child1 = nAttr.create("uvFilterSizeX", "fsx", maya.OpenMaya.MFnNumericData.kFloat) child2 = nAttr.create("uvFilterSizeY", "fsy", maya.OpenMaya.MFnNumericData.kFloat) myTexture1.aFilterSize = nAttr.create("uvFilterSize", "fs", child1, child2) nAttr.setKeyable(1) nAttr.setStorable(1) nAttr.setReadable(1) nAttr.setWritable(1) myTexture1.aInColor = nAttr.createColor('inColor', 'ic') nAttr.setStorable(1) nAttr.setReadable(1) nAttr.setWritable(1) nAttr.setDefault(1.0, 1.0, 1.0) myTexture1.aOutColor = nAttr.createColor('outColor', 'oc') nAttr.setStorable(0) nAttr.setHidden(0) nAttr.setReadable(1) nAttr.setWritable(0) myTexture1.addAttribute(myTexture1.aUVCoord) myTexture1.addAttribute(myTexture1.aFilterSize) myTexture1.addAttribute(myTexture1.aInColor) myTexture1.addAttribute(myTexture1.aOutColor) myTexture1.attributeAffects (myTexture1.aUVCoord, myTexture1.aOutColor) myTexture1.attributeAffects (myTexture1.aFilterSize, myTexture1.aOutColor) myTexture1.attributeAffects (myTexture1.aInColor, myTexture1.aOutColor) def initializePlugin(mobject): mplugin = maya.OpenMayaMPx.MFnPlugin(mobject) try: mplugin.registerNode(kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer, maya.OpenMayaMPx.MPxNode.kDependNode, 'texture/2d') 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 = 'myTexture1'
kPluginNodeId = maya.OpenMaya.MTypeId(0x87010)
class myTexture1(maya.OpenMayaMPx.MPxNode):
aUVCoord = maya.OpenMaya.MObject()
aFilterSize = maya.OpenMaya.MObject()
aInColor = maya.OpenMaya.MObject()
aOutColor = maya.OpenMaya.MObject()
def __init__(self):
maya.OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, block):
if plug == myTexture1.aOutColor or plug.parent() == myTexture1.aOutColor:
resultColor = maya.OpenMaya.MFloatVector(0.0, 0.0, 0.0)
uv = block.inputValue(myTexture1.aUVCoord).asFloat2();
inColor = block.inputValue(myTexture1.aInColor).asFloatVector()
if uv[0] > 0.5 and uv[1] > 0.5:
resultColor.x = inColor.x
resultColor.y = inColor.y
resultColor.z = inColor.z
outColorHandle = block.outputValue(myTexture1.aOutColor)
outColorHandle.setMFloatVector(resultColor)
outColorHandle.setClean()
else:
return maya.OpenMaya.kUnknownParameter
def nodeCreator():
return maya.OpenMayaMPx.asMPxPtr(myTexture1())
def nodeInitializer():
nAttr = maya.OpenMaya.MFnNumericAttribute()
child1 = nAttr.create('uCoord', 'u', maya.OpenMaya.MFnNumericData.kFloat)
- uCoord アトリビュートを作成し、短縮名は u 、型は float にします。
uvCoordアトリビュートの子アトリビュートになります。
child2 = nAttr.create('vCoord', 'v', maya.OpenMaya.MFnNumericData.kFloat)
- vCoord アトリビュートを作成し、短縮名は v 、型は float にします。
uvCoordアトリビュートの子アトリビュートになります。
myTexture1.aUVCoord = nAttr.create("uvCoord", "uv", child1, child2)
- uCoordアトリビュートとvCoordアトリビュートを含んだ親アトリビュートuvCoordを作成し、
短縮名は uv にします。
nAttr.setKeyable(1)
- uvCoord アトリビュートにアニメーションキーを設定可能にします。
nAttr.setStorable(1)
- シーンの保存時に uvCoord アトリビュートの値を保存する設定です。
nAttr.setReadable(1)
- uvCoord アトリビュートの値を読み取り可能にします。
nAttr.setWritable(1)
- uvCoord アトリビュートの値を書き込み可能にします。
child1 = nAttr.create("uvFilterSizeX", "fsx", maya.OpenMaya.MFnNumericData.kFloat)
- uvFilterSizeX アトリビュートを作成し、短縮名は fsx 、型は float にします。
uvFilterSizeアトリビュートの子アトリビュートになります。
child2 = nAttr.create("uvFilterSizeY", "fsy", maya.OpenMaya.MFnNumericData.kFloat)
- uvFilterSizeY アトリビュートを作成し、短縮名は fsy 、型は float にします。
uvFilterSizeアトリビュートの子アトリビュートになります。
myTexture1.aFilterSize = nAttr.create("uvFilterSize", "fs", child1, child2)
- uvFilterSizeXアトリビュートとuvFilterSizeYアトリビュートを含んだ親アトリビュートuvFilterSizeを作成し、短縮名は fs にします。
nAttr.setKeyable(1)
- uvFilterSize アトリビュートにアニメーションキーを設定可能にします。
nAttr.setStorable(1)
- シーンの保存時に uvFilterSize アトリビュートの値を保存する設定です。
nAttr.setReadable(1)
- uvFilterSize アトリビュートの値を読み取り可能にします。
nAttr.setWritable(1)
- uvFilterSize アトリビュートの値を書き込み可能にします。
myTexture1.aInColor = nAttr.createColor('inColor', 'ic')
- inColor アトリビュートを作成し、短縮名は ic 、型は Color にします。
nAttr.setStorable(1)
- シーンの保存時に inColor アトリビュートの値を保存する設定です。
nAttr.setReadable(1)
- inColor アトリビュートの値を読み取り可能にします。
nAttr.setWritable(1)
- inColor アトリビュートの値を書き込み可能にします。
nAttr.setDefault(1.0, 1.0, 1.0)
- inColor アトリビュートのデフォールト値を (1.0, 1.0, 1.0) にします。
myTexture1.aOutColor = nAttr.createColor('outColor', 'oc')
- outColor アトリビュートを作成し、短縮名は oc 、型は Color にします。
nAttr.setStorable(0)
- シーンの保存時に outColor アトリビュートの値を保存しない設定です。
nAttr.setHidden(0)
- outColor アトリビュートを GUI で操作できるようにする設定です。
nAttr.setReadable(1)
- inColor アトリビュートの値を読み取り可能にします。
nAttr.setWritable(0)
- inColor アトリビュートの値を書き込み不可にします。
myTexture1.addAttribute(myTexture1.aUVCoord)
- uvCoord アトリビュートを myTexture1 ノードのアトリビュートとして設定します。
myTexture1.addAttribute(myTexture1.aFilterSize)
- uvFilterSize アトリビュートを myTexture1 ノードのアトリビュートとして設定します。
myTexture1.addAttribute(myTexture1.aInColor)
- inColor アトリビュートを myTexture1 ノードのアトリビュートとして設定します。
myTexture1.addAttribute(myTexture1.aOutColor)
- outColor アトリビュートを myTexture1 ノードのアトリビュートとして設定します。
myTexture1.attributeAffects (myTexture1.aUVCoord, myTexture1.aOutColor)
- uvCoord アトリビュートが変化したとき、
プラグを aOutColor として myTexture1 の compute メソッドを実行するように設定します。
myTexture1.attributeAffects (myTexture1.aFilterSize, myTexture1.aOutColor)
- uvFilterSize アトリビュートが変化したとき、
プラグを aOutColor として myTexture1 の compute メソッドを実行するように設定します。
myTexture1.attributeAffects (myTexture1.aInColor, myTexture1.aOutColor)
- inColor アトリビュートが変化したとき、
プラグを aOutColor として myTexture1 の compute メソッドを実行するように設定します。
def initializePlugin(mobject):
- プラグインがロードされたときに実行される初期化関数です。
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
- MFnPlugin クラスのインスタンスを作成します。
mobject は MObject のインスタンスです。
try:
mplugin.registerNode(kPluginNodeName, kPluginNodeId, nodeCreator,
nodeInitializer, maya.OpenMayaMPx.MPxNode.kDependNode, 'texture/2d')
except:
sys.stderr.write('Failed to register node: %s' % kPluginNodeName)
raise
- MFnPlugin のインスタンスに、myTexture1 に関する設定を与えています。
もし設定に失敗した場合は、メッセージを出力して例外を送出します。
引数の最後の 2 つは以下のような意味です。
- maya.OpenMayaMPx.MPxNode.kDependNode
- ノードのタイプを表します。
- 'texture/2d'
- シェーダノードの種類を詳しく説明した文字列です。
GUI の表示などで利用されます。
この場合は、ハイパーシェードの2d テクスチャの部分に表示されます。
def uninitializePlugin(mobject):
- プラグインをアンロードするときに実行される関数です。
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
,,
- MFnPlugin クラスのインスタンスを作成します。
mobject は MObject のインスタンスです。
try:
mplugin.deregisterNode( kPluginNodeId )
except:
sys.stderr.write('Failed to deregister node: %s' % kPluginNodeName)
raise
- プラグインをアンロードします。
もしアンロードに失敗した場合は、メッセージを出力して例外を送出します。