pythonを使ったmayaプラグインの作り方 -Locatorノード編-
2011/10/31
Tag: maya,openGL,plugin,python
皆さん、こんにちは。conieです。
今回は Mayaのノードを作ってみたいと思います。
mayaでpythonを使えなかったころにはc++を使ってノードを作成しましたが、
pythonはmelだけじゃなくてopenMayaも使えるので、c++知識がなくでもノードを作成することができるようになりました。
(openMayaの知識は必要ですけどね~)
ノードの種類には MPxNode classの enum Typeに記入されています。
kDependNode
kLocatorNode
kDeformerNode
kManipContainer
kSurfaceShape
kFieldNode
kEmitterNode
kSpringNode
kIkSolverNode
kHardwareShader
kHwShaderNode
kTransformNode
kObjectSet
kFluidEmitterNode
kImagePlaneNode
kParticleAttributeMapperNode
kCameraSetNode
kConstraintNode
kManipulatorNode
(こんなにいっぱいありますね)
この中で2番目にあるLocator Nodeについて説明して行きたいと思います。
■ sampleノードの設定について
python_file
まずはこのファイルをmayaに設置しましょう。
(このファイルはmaya2012でテストしました。)
DF_TALK_nodes.zipの中にあるDF_TALK_locator.pyを
mayaの設置場所\bin\plug-ins
へ保存します。
Window > Settings / Preferences > Plug-in Manager を選択します。
DF_TALK_locator.py が確認できたら、Loadedにチェックを入れて、
script Editor を開きmelタブで以下の commandを入力します。
createNode DF_TALK_locator
locatorノードが作成されました。
■ DF_TALK_locator.py script 内容について
■ 1 import
import maya.OpenMayaMPx as MPx import maya.OpenMayaRender as MR import maya.OpenMayaUI as MUI import maya.OpenMaya as M
c++ではclassのheaderファイルを一個一個include (import) する必要がありましたが、
pythonではこれで済むので簡単です。
今回使うopenMayaのmoduleについて簡単に説明すると、
OpenMayaMPx - locator を作成するための MPxLocatorNode class が含まれています。
OpenMayaRender - openGLを作るためのMHardwareRenderer class が含まれています。
OpenMayaUI - mayaのview portを制御するためのM3dView class が含まれています。
OpenMaya - MFnPluginなど基本classが含まれています。
■ 2. 変数
kNodeName = "DF_TALK_locator" kTypeID = M.MTypeId(0x79999) kNodeType = MPx.MPxNode.kLocatorNode
kNodeName 、kTypeID 、kNodeType
は6番で説明する ノードをmayaに登録するための情報が記入されています。
kNodeName は mel commandのcreateNodeで作成されるnodeのtypeになります。
createNode DF_TALK_locator//
kTypeID は mayaの作業ファイルをmaファイルとして保存した時、ノードを識別するためのIDに使います。
0x00000 – 0x7ffff (524288 ids)の範囲で使えばいいと思います。
今回は0x79999を使います。
ノードの名前とIDは他のノードと違う名前とIDにする必要があります。
同じ名前またはIDになる場合、Mayaがcrashする原因になります。
kNodeTypeはノードのtypeを設定します。
gl = MR.MHardwareRenderer.theRenderer().glFunctionTable()
openGLを使うための変数です。MPxLocatorNodeのdraw関数に記入して使います。
■ 3 openGL記入
class baseLocator(MPx.MPxLocatorNode): type = M.MObject() def __init__(self): MPx.MPxLocatorNode.__init__(self) def draw(self, view, path, style, status): view.beginGL() gl.glBegin(MR.MGL_LINES) gl.glVertex3f(-1.0, 0.0, 0.0) gl.glVertex3f(1.0, 0.0, 0.0) gl.glEnd() view.endGL()
locatorノードはMPxLocatorNod classを継承して作ります。
__init__(self) はノードの初期化関数です。
draw(self, view, path, style, status)はopenGLを記入して
locatorの形を作る関数です。次のchapterでは少し詳しく説明したいと思います。
■ 4 nodeInitializer
def baseLocatorInitializer(): return M.MStatus.kSuccess
custom attributeが必要な場合はここにattributeを記入します。
たとえばこのように記入します。
def baseLocatorInitializer(): nAttr = M.MFnTypedAttribute() baseLocator.size = nAttr.create( "text", "tx", M.MFnData.kString) nAttr.setStorable(1) nAttr.setWritable(1) baseLocator.addAttribute( baseLocator.size ) return M.MStatus.kSuccess
■ 5 Creator()
def baseLocatorCreator(): return MPx.asMPxPtr(baseLocator())
3番で作ったlocator情報をmayaに渡すためのpointer関数です。
■ 6 initializePlugin / uninitializePlugin関数
def initializePlugin(obj): plugin = MPx.MFnPlugin(obj) plugin.registerNode(kNodeName, kTypeID, baseLocatorCreator, baseLocatorInitializer, kNodeType) def uninitializePlugin(obj): plugin = MPx.MFnPlugin(obj) plugin.deregisterNode(kTypeID)
mayaからcutom nodeを使うためにはplugin登録とノードの登録が必要です。
plugin登録にはinitializePlugin 関数、 plugin解除にはuninitializePlugin関数を使います。
ノード登録にはinitializePlugin 中にMFnPlugin classの registerNode()関数を使い、
ノード解除にはuninitializePlugin 中にMFnPlugin classの deregisterNode()関数を使います。
registerNode()に必要な引数は
ノードの名前、ノードのType ID、 Create関数、Initializer関数 、ノードのタイプ が必要です。
必要な情報は 2、4、5で用意しています。
——————————————————
ノードの名前 -> kNodeName
ノードtypeのID -> kTypeID
Create関数 -> baseLocatorCreator()
Initializer関数 -> baseLocatorInitializer()
ノードのタイプ -> kNodeType
——————————————————
deregisterNode()に必要な引数はノードのType IDだけです。
■ locatorの形を変更してみましょう
def draw(self, view, path, style, status): view.beginGL() gl.glBegin(MR.MGL_LINES) gl.glVertex3f(-1.0, 0.0, 0.0) gl.glVertex3f(1.0, 0.0, 0.0) gl.glEnd() view.endGL()
viewはM3dView classです。
view.beginGL()とview.endGL()の間にopenGLを記入していきます。
gl.glVertex3f(-1.0, 0.0, 0.0) gl.glVertex3f(1.0, 0.0, 0.0)
gl.glVertex3f(-1.0, 0.0, 0.0)とgl.glVertex3f(1.0, 0.0, 0.0)は点の位置を意味します。
以下のようにpointを追加して見ましょう。
■ ライン追加
gl.glBegin(MR.MGL_LINES) gl.glVertex3f(-1.0, 0.0, 0.0) gl.glVertex3f(1.0, 0.0, 0.0) gl.glVertex3f(0.0, -1.0, 0.0) gl.glVertex3f(0.0, 1.0, 0.0) gl.glVertex3f(0.0, 0.0, -1.0) gl.glVertex3f(0.0, 0.0, 1.0) gl.glEnd()
普通のlocatorみたいになりました。色もつけることができます。
■ 色
gl.glBegin(MR.MGL_LINES) gl.glColor3f(1, 0, 0) gl.glVertex3f(-1.0, 0.0, 0.0) gl.glColor3f(0, 1, 0) gl.glVertex3f(1.0, 0.0, 0.0) gl.glColor3f(0, 0, 1) gl.glVertex3f(0.0, -1.0, 0.0) gl.glColor3f(1, 0, 0) gl.glVertex3f(0.0, 1.0, 0.0) gl.glColor3f(1, 0, 1) gl.glVertex3f(0.0, 0.0, -1.0) gl.glColor3f(0, 1, 1) gl.glVertex3f(0.0, 0.0, 1.0) gl.glEnd()
■ 表示モード
gl.glBegin(MR.MGL_LINES)のMR.MGL_LINESは描画モードを設定します。
個人的によく使うモードは以下のようです。
MR.MGL_POINTS - (point)
MR.MGL_LINES – (line)
MR.MGL_LINE_LOOP – (line)
MR.MGL_TRIANGLES – (polygon)
MR.MGL_QUADS – (polygon)
MR.MGL_POLYGON – (polygon)
gl.glBegin(MR.MGL_POINTS) gl.glBegin(MR.MGL_LINES) gl.glBegin(MR.MGL_LINE_LOOP) gl.glBegin(MR.MGL_TRIANGLES) gl.glBegin(MR.MGL_QUADS) gl.glBegin(MR.MGL_POLYGON)
円をつくるには?
gl.glBegin(MR.MGL_POINTS) segValue = 24 radius = 1 angle = (math.pi * 2) / segValue an = M.MAngle(angle) for i in range(segValue ): x = (math.cos(an.asRadians() * i)) * radius y = (math.sin(an.asRadians() * i)) * radius gl.glVertex3f(x , y, 0.0) gl.glEnd()
■ 最後に
M3dView classのdrawText()関数を使えば文字も使えるので、annotationノードも作成することもできます。
(例) Create > Annotation…)
DF_TALK_nodes.zipの中にある DF_TALK_annotation.py ファイルはDF_TALK_locator.py にcustom string attributeを追加し、draw()関数を修正したものです。
このファイルをpluginとして登録し、script editorで以下のcommandを実行して見てください
createNode DF_TALK_annotation
annotationノードが作成されます。
text fieldに文字を入力するとview port上に反映されるのが分かると思います。
これで pythonを使ったmayaプラグインの作り方 -Locatorノード編-の説明は終わりました。
openGLはlocatorだけじゃなくて Manipulator Node にも使えるのでぜひいろいろ試してみてください。
以上、conieでした。
非常に勉強になります
今度はぜひ、C++の方のプラグインの作り方等も載せていただけると嬉しいです!
APIのコマンドとかってどういうところで調べていくと良いんでしょうか?
MELだとMayaのヘルプに詳しく載っていますが。。
APIって勉強しづらいですよね・・・。
Posted at 2011.11.8 01:06 by 通りすがりのおっぱいマニア
こんにちは。コニーです。
コメントありがとうございます。
>>今度はぜひ、C++の方のプラグインの作り方等も載せていただけると嬉しいです!
機会があれば、C++の方のプラグインの作り方もやりたいと思います。
>>APIのコマンドとかってどういうところで調べていくと良いんでしょうか?
>>MELだとMayaのヘルプに詳しく載っていますが。。
>> APIって勉強しづらいですよね・・・。
そうですね。。資料がなさすぎますよね。
私の場合、この本で最初勉強しました。
http://www.amazon.co.jp/gp/product/images/4939007685/ref=dp_image_0?ie=UTF8&n=465392&s=books
あとはヘルプとsampleファイルをみたりネットで調べたりしました。
http://download.autodesk.com/global/docs/mayasdk2012/ja_jp/index.html
周りに詳しい人がいれば一番いいと思いますけどね。。。
Posted at 2011.11.9 13:12 by conie
こんにちはー。開発室のひらくです。
おっぱいマニアさんは、「たっきゅんのガ☆チンコ開発日記」というページをご存知でしょうか?
mayaプラグインの作り方がシンプル且つ詳細に紹介されてるので参考になると思いますよ。
http://takkun.nyamuuuu.net/blog/archives/category/maya/c
(たっきゅんさんの許可は頂いております)
もし宜しければ、そちらも合わせてご参照下さいー。
Posted at 2011.11.9 15:33 by hiraku
ありがとうございます。
周りに詳しい人・・・難しいですねー。
たっきゅんさんのブログ、読ませて頂きます。
ありがとうございました!
Posted at 2011.11.12 17:07 by 通りすがりのおっぱいマニア