3DCGbook

映像プロダクションに所属しています。主に毎日のアウトプットを配信していこうと思います。

OpenMaya 勉強中 その5 [SinNode]

そういえばMayaってsin、cosノードってありましたっけ?
ノードとしてはないような…

sinノードにPlusMinusAverageとか、MultiplyDivideとかはさめば
結構使えたりしそうですよね。カメラシェイカーとかそういうのに。

個人的に、こういう初歩的なプラグインから拡張していくのがちょっと面白い…
というかまだまだ初心者なのでここから理解しなきゃ;;

import sys
import math
import maya.OpenMaya as om
import maya.OpenMayaMPx as ommpx

class SinNode(ommpx.MPxNode):
	kPluginNodeTypeName = 'sinNode'
	kPluginNodeId = om.MTypeId(0x8879)
	
	input1Attr = None
	kInput1AttrShort = 'in1'
	kInput1AttrLong  = 'input1'
	
	outputAttr = None
	kOutputAttrShort = 'out'
	kOutputAttrLong  = 'output'

	def __init__(self):
		ommpx.MPxNode.__init__(self)
		
	def compute(self, plug, dataBlock):
		if plug == SinNode.outputAttr:
			inputAttr1Handle = dataBlock.inputValue(SinNode.input1Attr)
			inputAttrVal = inputAttr1Handle.asFloat()
			result = math.sin(math.radians(inputAttrVal))
			
			outputHandle = dataBlock.outputValue(SinNode.outputAttr)
			outputHandle.setFloat(result)
			
			dataBlock.setClean(plug)
		
	@classmethod
	def nodeCreator(cls):
		return ommpx.asMPxPtr(cls())
		
	@classmethod
	def nodeInitializer(cls):
		nAttr = om.MFnNumericAttribute()
		cls.input1Attr = nAttr.create(cls.kInput1AttrLong, cls.kInput1AttrShort, om.MFnNumericData.kFloat, 0.0)
		nAttr.setStorable(True)
		
		cls.outputAttr = nAttr.create(cls.kOutputAttrLong, cls.kOutputAttrShort, om.MFnNumericData.kFloat)
		nAttr.setStorable(True)
		nAttr.setWritable(True)
		
		cls.addAttribute(cls.input1Attr)
		cls.addAttribute(cls.outputAttr)
		
		cls.attributeAffects(cls.input1Attr, cls.outputAttr)
		
def initializePlugin(obj):
	mplugin = ommpx.MFnPlugin(obj)
	try:
		mplugin.registerNode(SinNode.kPluginNodeTypeName, SinNode.kPluginNodeId, SinNode.nodeCreator, SinNode.nodeInitializer)
	except:
		sys.stderr.write("Failed to register node: %s\n" % SinNode.kPluginNodeTypeName)
		
def uninitializePlugin(obj):
	mplugin = ommpx.MFnPlugin(obj)
	try:
		mplugin.deregisterNode(SinNode.kPluginNodeId)
	except:
		sys.stderr.write("Failed to deregister node: %s\n" % SinNode.kPluginNodeTypeName)