【覚書】maya python入門 其の七
今回は昔作った勉強用のスクリプトがあったので
それを紐解いていきたいと思います。
内容は、スライダーで設定された値を持って
球を作成するというモノになります。
こんな感じです。↓
では早速コード
import maya.cmds as cmds if cmds.window("Obj_EditWindow",exists=True): cmds.deleteUI(Set_Window) Set_Window = cmds.window("Obj_EditWindow",t="Edit_Radius",w=300,h=300) cmds.columnLayout(adj = True) cmds.text("Input RadiusValue") SetRadius = cmds.intSliderGrp( l = "Radius_Value", min = 0.01 , max = 100 , f = True) cmds.button( l = "Create_Sphere",c="Create_Sphere()") cmds.showWindow(Set_Window) def Create_Sphere(): GetRadius = cmds.intSliderGrp(SetRadius, q=True , v=True) C_Sphere = cmds.polySphere(r=GetRadius, n="Sphere_SetRadius")
とても簡単なツールなんで、行も少ないですね。
細かい説明は今度するとして、もう一個スクリプトがあったので
こちらも貼ってみたいと思います。
Aimコンストを行うスクリプト?(マクロ)です。
実行するとこんな感じ。↓
コード。
import maya.cmds as cmds oSel = cmds.ls(orderedSelection=True) if len( oSel ) >= 2: target = oSel[0] oSel.remove( target ) for i in oSel: cmds.aimConstraint(target,i,aimVector=[0,1,0]) else: print 'plase two selection!'
こちらも特に説明がなくてもいい気がしますね。
最後にもう一個。
これは今でも偶に観ています。
ってかHELPに全く同じやつが載ってるはずです・・・
こんなやつです。↓
コード↓
mods = cmds.getModifiers() print 'Modifiers are:' if (mods & 1) > 0: print ' Shift' if (mods & 2) > 0: print ' CapsLock' if (mods & 4) > 0: print ' Ctrl' if (mods & 8) > 0: print ' Alt'
これが本当によく使うコードなので
覚えておきたいんですが、すぐ忘れるんですよね・・・。
とまぁ今回はこの辺りで。
以上。
【覚書】maya python入門 其の六
続いて少しだけ数学をしたいと思います。
やっぱりスクリプトやるとなると、この辺り補っていかないと
後々苦労したり、無駄が増えてしまうので…
と書きつつ詳しい事は説明しません。
※できません汗
なので、コード見つつこんな事ができるんだ…。
程度で進めていければ、幸いです。
ってことでまずは、三角関数を使って
球を円状に配置したいと思います。
コード
import maya.cmds as cmds import math num = 60 radius = 6 for i in range(num): Cir = 2.0 * math.pi * i / num x = radius * math.sin(Cir) z = radius * math.cos(Cir) cmds.polySphere(r=0.5) cmds.move(x,0.0,z)
こんな感じになります。
「num」が球の総数で、
「radius」が半径ですね。
円を描いているところは
実質この部分
Cir = 2.0 * math.pi * i / num
x = radius * math.sin(Cir)
z = radius * math.cos(Cir)
一行目で、円周と総数を割って、一個辺りの角度を求め
2,3行目で縦、横の長さ(比率)を取得し、その値でXYに値を代入しています。
原理が分かれば、超簡単なんですが、高校数学を挫折していた人間からすると
相当悩みました。
今でもまだ理解仕切ってません。
ただ、そういうものだ。と思えばとりあえずはいいじゃないでしょうか?
原理が分かれば、多種多様に使えるので覚えた方がいいですが・・・・
さておき、次は上記2Dだったので、3Dにしてみようかと思います。
なので、少しだけいじって螺旋をしてみました。
import maya.cmds as cmds import math num = 60 radius = 6 for i in range(num): Cir = 2.0 * math.pi * i / num x = radius * math.sin(Cir) z = radius * math.cos(Cir) y = i cmds.polySphere(r=0.5) cmds.move(x,y,z)
ほとんど上と変わってないです。
Y(高さ)の値に1ずつ増える値を入れているだけです。
少しの違いで結構な差がでるのは、触ってて面白いですよね。
さて次は折角三角関数を使ってるので、それをエクスプレッションに仕込んでみたいと思います。
ちょうどWEBに似たような奴があったので、簡単にカスタムしてみました。
import maya.cmds num = 10 for i in range(0, num): name = maya.cmds.polySphere() maya.cmds.move(i * 2, i * 2, 0) val = i * 0.5 maya.cmds.expression(object=name[0], string=('ty = 3 * sin(time + ' + str(val) + ');'))
ほとんど変えてませんw
コピペだけはしてませんが。
思ったですが、エクスプレッションMAYAは、編集し易いですね。。。
めちゃくちゃびっくりしました。
では、軽く説明。
maya.cmds.expression(object=name[0], string=('ty = 3 * sin(time + ' + str(val) + ');'))
作成した、オブジェクトに対して、「トランスYにサインカーブ」のエクスプレッション仕込む。
という内容ですね。
特に難しい事はないかな?と思います。
そいや、謎というか、MAYAの仕様というか
エクスプレッション自体はMELで記述しなければいけません。
※微妙にPythonの書き方とは違いますよね?
なので、基本MEL文法になるように、且つ仕込む場合は文字列として記載しなければならないので
「string=()」でMEL記述を文字列にしております。
この辺り少しややこしいので、注意が必要です。
仕込まれたデータを見るとこんな感じですね。
うん。MELですねw
ちなみにエクスプレッションのエディタは、アトリビュートのトランスフォーム(挿入されているノード)
で右クリックで、出ますね。
では続けてもう一個。
2個目のスクリプトをエクスプレッションにしたものですね。
import maya.cmds as cmds import math num = 150 radius = 3 for i in range(num): Cir = 2.0 * math.pi * i / num x = radius * math.sin(Cir) z = radius * math.cos(Cir) y = i oObj = cmds.polySphere(r=0.5) cmds.expression(s=(oObj[0]+'.tx = '+ str(radius) +' * cos(time + ' + str(Cir) + ');')) cmds.expression(s=(oObj[0]+'.ty = time + ' + str(y) + ';')) cmds.expression(s=(oObj[0]+'.tz = '+ str(radius) +' * sin(time + ' + str(Cir) + ');'))
螺旋みたいな、龍みたいな。
今回はエクスプレッションののターゲットを直で指定しています。
cmds.expression(s=(oObj[0]+'.tx = '+ str(radius) +' * cos(time + ' + str(Cir) + ');'))
この方が兎に角楽です。。。。
あ、そいやさっきも使ってましたが、エクスプレッションに「time」を仕込むことで
タイムラインに沿った動きが可能となります。
詳しい事はこちらに譲ります。
最後にタンジェントも使ってみたかったので、こちらも
意図したものと少し離れてしまいましたが、まぁよしとします…
こんな感じで、色々出来たりします。
ちなみにグーグルさんで色々なカーブが見れるので参考に実行してみると
面白いかもですね笑
こんな感じでエクスプレッションも簡単にスクリプトから実行できるので
リグとかも使えそうですね。
ただ、内容がMELなのはイケテナイっす。
まぁ仕方ないですが・・
以上です。
【覚書】maya python入門 其の五
間はさみましたが、続けてキーのコピー、ペーストの方を見て行きたいと思います。
全体的にアニメーターよりの内容になっていきますが、概念は同じなのでご了承下さい。
まずはコードから。
import maya.cmds as cmds oCube = cmds.polyCube(n='Cube_KeyEdit') oTime = cmds.currentTime(q=True) oCurrent = float(oTime) print oCurrent cmds.setKeyframe( oCube[0], t=0 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=10 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=20 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=30 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=40 ,v=5, at='translateZ')
内容は簡単で立方体を作成して、キーを打ってるだけです。
上部の変数は後ほど使う物ですね。
これを元に、キーのコピーだったりペーストをやってみたいと思います。
内容的には再度上記の状態を作成して、それに対して
キーをコピーカレントフレームにペーストし、サイクル処理を行う。
というところまでやってみたいと思います。
コード
import maya.cmds as cmds oCube = cmds.polyCube(n='Cube_KeyEdit') oTime = cmds.currentTime(q=True) oCurrent = float(oTime) print oCurrent cmds.setKeyframe( oCube[0], t=0 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=10 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=20 ,v=5, at='translateZ') cmds.setKeyframe( oCube[0], t=30 ,v=-5, at='translateZ') cmds.setKeyframe( oCube[0], t=40 ,v=5, at='translateZ') cmds.selectKey( oCube[0], attribute='translateZ' ) cmds.copyKey(oCube[0]) cmds.pasteKey(oCube[0],time=(oCurrent,oCurrent),attribute='translateZ') cmds.setInfinity( pri='cycle',poi="cycle")
こんな感じです。
特に難しい処理は行なっておりませんが、SIと違って
Fカーブエディタ(グラフエディタ)の扱いが超絶楽ですね。
さすがにこれだけだと寂しいので、一個簡単なスクリプトを。
SIでよく使っていた、カーブのタンジェントを頭のキーと、お尻のキーを合わせるものです。
今回は難しい事はしたくないので、単純にお尻のキータンジェントを
頭のキータンジェントにコピーしたいと思います。
ではコード
import maya.cmds as cmds cmds.select() oSel = cmds.ls(sl=True) oKeys = cmds.keyTangent(oSel,q=True,outAngle=True) oTan = oKeys[-1] oTime = cmds.keyTangent(oSel,e=True,index=(0,0),inAngle=oTan)
こんな感じです。
ゲームアニメーションとか作ってると、これを多用します。
アウトアングルを配列でGETして、その最後の要素をoTan = oKeys[-1]の「[-1]」で取得。
それを、「cmds.keyTangent(oSel,e=True,index=(0,0),inAngle=oTan)」で頭のキー(index=(0,0))で
キーを指定して、タンジェントにペーストしてます。
これをベースに処理軽減だったり、複数化を仕込むと仕事で使えそうですね。
と今回この辺りで…。
次回はエクスプレッションかランダムについて進めていきたいと思います。
以上。
【覚書】maya python入門 其の四
肝心なことを書き忘れていたので、書いていきたいと思います。
色々書いてもあれなので、まずはコードを書いてみたいと思います。
import maya.cmds as cmds oCube = cmds.polyCube(w=1,h=1,n="Cube_Make") cmds.polyCube(oCube[0],e=True,sx=1,sy=2,sz=3) oSx = cmds.polyCube(oCube[0],q=True,sx=True) oSy = cmds.polyCube(oCube[0],q=True,sy=True) oSz = cmds.polyCube(oCube[0],q=True,sz=True) print oSx print oSy print oSz
立方体を作成して、サブディビジョンの値をを変えて、それをログに出しているだけです。
これで言わないといけない部分が
cmds.polyCube(oCube[0],e=True,sx=1,sy=2,sz=3)
この文の「e=True」という部分です。
前回は「getAttr」「setAttr」を使用して値を取得していましたが
MAYAは基本フラグを使用して
値を編集、取得できます。
それが上記文に書いている「e=True」これは「edit=True」の略語です。
文字通り「edit」なので、編集ができます。
参照(取得)は「q=True」「query=True」
上記スクリプトでいう
oSx = cmds.polyCube(oCube[0],q=True,sx=True) oSy = cmds.polyCube(oCube[0],q=True,sy=True) oSz = cmds.polyCube(oCube[0],q=True,sz=True)
の部分です。
queryの後にサブディビジョンの値を参照(取得)してます。
※サブディビジョンの値一気に取得できる方法ないのかな…
こんな感じでHELPをみて「E」「Q」マークがある物については
フラグの指定で値を編集、参照できたりします。
逆にその指定が無いフラグ、且つ取得編集ができるものについては
「getAttr」「setAttr」を使用して値をいじるわけですね。
あと、これもハマる部分なんですが、MAYAPythonって少数点の扱いがキチンとされていたりしますね。
なので、これで計算すると、四捨五入されてしまいます。
oNumber = 100/15 print oNumber
きちんと指定するとこんな感じ。
ただ、小数点を記載しただけです。
oNumber = 100.0/15.0 print oNumber
地味にハマる所ですよね。
こんな感じでフラグによる参照、編集のお話でした。
とこのまま終わると説明だけですげぇつまんない感じになりそうなので
一個だけ簡単なスクリプトを。
まずはコード。
import maya.cmds as cmds cmds.window(title="Anather_Window",widthHeight=(720, 480)) cmds.paneLayout() cmds.modelPanel() cmds.showWindow()
SIでいう、オブジェクトビュー的な感じを作成するものです。
アニメーションする時によく使うので(SIで)。。
ただ、これHELPに載っていた内容なので、探ればまだまだ色々できそうです。
以上です。
【覚書】maya python入門 其の三
では続き。
前回はSET側のコードで移動させたり、KEYを打ったりしてました。
今回はGET側をやってます。
まず初めに前回の環境を作成します。
import maya.cmds as cmds cmds.polyCube( n='Cube_Move' ) cmds.move( 5, 1, 1 ) cmds.setKeyframe( at='translateX',v=10 ,time=30 )
これで画像みたいな環境ができたと思います。
ここから値を取得して、編集してみたいと思います。
始めに移動値の値を取得します。
値を取るには「getAttr」を使用するみたいです。
※これ以外にもあるのかな??
import maya.cmds as cmds maya.cmds.select('Cube_Move') tx = maya.cmds.getAttr('.tx') print tx
これで取得できました。
getAttr('.tx') この部分の引数を変えてあげると色々取得できますね。
引数についてはこちらを
http://me.autodesk.jp/wam/maya/docs/Maya2009/CommandsPython/getAttr.html
ちなみに「tx」はトランスXです。
もちろん「translateX」と書くことも可能です。
他にも
「ty」「tz」トランスY、トランスZ
「rx」「ry」「rz」ロットXYZ
「sx」「sy」「sz」スケールXYZ
と書きます。
全体を取得したい時は
「translate」「rotation」「scale」と記述して下さい。
それぞれ「X,Y,Z」として取得できます。
では続いてはキーフレームを取得します。
ここについてはやり方が少し分からなかった(他にももっとあると思います)
ので、HELPで引っ掛かった「findKeyframe」を使用してみます。
import maya.cmds as cmds maya.cmds.select('Cube_Move') tx = cmds.findKeyframe( 'Cube_Move',timeSlider=True, which='first' )
※画像は値が「which='next'」となってますが「which='first'」の間違いです。。。
とりあえずこれで取得できました。
findKeyframeについてはこちらを参照。
findKeyframe command
これ以外だとこんな感じ?
import maya.cmds as cmds maya.cmds.select('Cube_Move') tx = cmds.keyframe('Cube_Move.translateX',index=(0,0),query=True); print tx
※結果は上の画像と全く同じです。
ただこれだと一番初めのキーしか取得できない。
一応逆に最後だけ調節すには、こんな感じで記述します。
import maya.cmds as cmds maya.cmds.select('Cube_Move') tx = cmds.keyframe( query=True, lsl=True, timeChange=True )
もしくはこんな感じ。
import maya.cmds as cmds last = cmds.findKeyframe(timeSlider=True, which='last') print lastKey
※結果は上の画像と全く同じです。
GetKeyinfo的なものは「findKeyframe」が一番近いですね。
これを使っていきます。
これで取得できました。
次に値の変更をしてみます。
今上の画像をみると「30Fと66F」にキーフレームがあります。
これを30Fを0Fに、66Fを70Fにした後に、その値を「0」にしてみましょう。
考察すると、頭のキーフレームとお尻のキーフレームが取れれば
なんとかなりそうですね。
って事でコード。
まずは先頭のキーを「0F」にしてみます。
import maya.cmds as cmds maya.cmds.select('Cube_Move') tx = cmds.keyframe(index=(0,0),timeChange=0)
これで先頭は変わりました。
続いてお尻のキーを移動、値変更してみます。
ラストキーフレームはどうやって取得したらいいのか?
全くわからなかったんで、indexで無理やり取得してみました。
値はtimeChange同様にChangevalueで変更できそうです。
import maya.cmds as cmds maya.cmds.select('Cube_Move') cmds.keyframe('Cube_Move',index=(0,0),timeChange=0) cmds.keyframe('Cube_Move',index=(1,1), timeChange=70, valueChange=0 )
うーん。。
すごく最終フレームの処理が汚いですね。
indexがあるんだからlastはあってよ…と思いますが。。
他にもTIMEで指定する方法もあったりしますが
どちらにしても汚いっすね。
import maya.cmds as cmds maya.cmds.select('Cube_Move') cmds.keyframe('Cube_Move',index=(0,0),timeChange=0) cmds.keyframe('Cube_Move',t=(66,66), timeChange=70, valueChange=0 )
※結果は上の画像と全く同じです。
こんな感じで「とりあえず」キーの取得ができました。
ここから拡張するとなると、折角値を取れたんで
キーを全体的にずらす方法を書いてみようと思います。
import maya.cmds as cmds def Time_Offset(): Offset_Number = cmds.textField( "Time_Offset", q=True, tx=True ) selected_object = cmds.ls( type=['animCurveTL','animCurveTU','animCurveTA','animCurveTT']) cmds.keyframe(selected_object,edit=True,relative=True,timeChange=Offset_Number) cmds.window(title="offset") cmds.columnLayout() cmds.textField( "Time_Offset" ) cmds.button( l="Offset", command="Time_Offset()" ) cmds.setParent( '..' ) cmds.showWindow()
こんなかんじで選択した物を、入力された値全体的にずらします。
内容は関数とか使ってますが、めちゃくちゃ簡単です。
def Time_Offset(): Offset_Number = cmds.textField( "Time_Offset", q=True, tx=True ) selected_object = cmds.ls( type=['animCurveTL','animCurveTU','animCurveTA','animCurveTT']) cmds.keyframe(selected_object,edit=True,relative=True,timeChange=Offset_Number)
関数部分です。
一行目で関数宣言し、二行目でインプットボックスを作成
三行目で選択した物をフィルタリング。
この時アニメーションしてるものだけに篩をかけております。
四行目はさっきのコマンドに、入力された値をいれているだけです。
cmds.window(title="offset") cmds.columnLayout() cmds.textField( "Time_Offset" ) cmds.button( l="Offset", command="Time_Offset()" ) cmds.setParent( '..' ) cmds.showWindow()
この部分はウィンドウ生成部分ですね。
詳しくは省きますが、WEBに腐るほど資料がありますよ…
PySide含めて…
…っと
長くなったので、今回はこの辺りで。
次回はアニメーションされたキーフレームのコピペをベースに行きたいと思います。
以上です。
【覚書】maya python入門 其の二
続いて値の設定について書いていきたいと思います。
SIと同じで、アトリビュートのGET,SETValueがあるみたいなんですが
値の設定だけならもっと簡単にできそうです。
今回はまず、SET側からみていきましょう。
import maya.cmds as cmds cmds.polyCube( n='Cube_Move' ) cmds.move( 5, 1, 1 )
とてもシンプルな内容ですね。
立方体を作成して、移動しているだけです。
ただこれSIと少し違ってトランスフォームについて書くわけではなく
「move」と大きく括って書くんですね。
※もちろんトランスフォーム指定して、移動させることも可能です。
とてもシンプルに思いました。
ではここからカスタムしていきたいと思います。
初めに移動したので、キーを打ってみたいと思います。
コードはこんな感じ。
import maya.cmds as cmds cmds.polyCube( n='Cube_Move' ) cmds.move( 5, 1, 1 ) cmds.setKeyframe()
すごくシンプルにキーが打てます。
setKeyframe()
これがキーを打つコマンドになります。
ただ、正直個人的には、パラメータ全体にキーが打たれますよね。
これだと、Fカーブエディタ(グラフエディタ)が汚くなります。
個人的に超絶これが嫌いなので、このままだと使うきすらありません笑
私みたいに、「必要なパラメータだけ打ちたい!」
こんな時はフラグを色々触るといいです。
setKeyframe コマンド
結構ありますね。。
個人的に、見ていって「レイヤー指定」ができるのは少し楽しみかも。
では、今回は移動のXパラメータを指定してみましょう。
こんな感じ。
import maya.cmds as cmds cmds.polyCube( n='Cube_Move' ) cmds.move( 5, 1, 1 ) cmds.setKeyframe( at='translateX' )
はい。
「setKeyframe( at='translateX' )」
ここでアトリビュートをトランスXに指定しているわけです。
とても簡単。
ちなみに、時間や値もsetKeyframe側で変更できますね。
import maya.cmds as cmds cmds.polyCube( n='Cube_Move' ) cmds.move( 5, 1, 1 ) cmds.setKeyframe( at='translateX',v=10 ,time=30 )
こんな感じで値をセットできます。
では次はSETでは無く、GETしてみたいと思います。
以上。
【覚書】maya python入門
一から説明用にmayaMelではなく、mayaPythonの資料を書く必要があったので
メモに残して行こうかと思います。
まずはSIでも同じだが、色々なサイトをめぐりました。
SIからの移行に関しても色々書いて頂いているダイキンさんのサイト
http://www.comtec.daikin.co.jp/DC/UsersNotes/index.html
MELで大変お世話になったサイト
http://www.not-enough.org/abe/manual/maya-python/introduction-python.html
上記のサイトは非常に分かりやすいので
それに沿って、簡易なものを一個一個実行して覚えていくスタイルにしてみます。
あ、あとは英語ですがデジタルチューターズもいい感じですね。
さて前置きはこの程度にしておいて
さっそくコード書いていきます。
今回Python自体の説明については省ける所は
ガンガン省いていきます。
※時間が無いので…
ではまずは選択からですね。
これが無いと始まりませんネ。
import maya.cmds as cmds cmds.select() oSel = cmds.ls(sl=True) print oSel
非常に簡単なコードです。
選択した物をリストにして、プリントしているだけですね。
SI的な感覚だと
import maya.cmds as cmds oSel = cmds.select() print oSel(0)
とかでできねぇのかよ!!!
とか思うんですが、MAYAさんは一度リストで取得する必要があるみたいです。
「oSel = cmds.ls(sl=True)」
ここですね。「ls」リストに「sl」選択を格納
としないとダメなんですね…
ちなみに
「Select」の引数については公式にやたらと羅列されておりますね。
http://help.autodesk.com/cloudhelp/2016/JPN/Maya-Tech-Docs/CommandsPython/select.html
ダイキンさんのサイトでも紹介してましたが、階層以下ノード全て(トランス、シェイプ含む)
選択するにはこんな感じにすればいいみたいです。
import maya.cmds as cmds cmds.select(hierarchy=True) oSel = cmds.ls(sl=True) print oSel
Selectの引数に「Hierarchy」(階層)の引数をONにするだけですね。
これは便利ですね。
ただこれだと全て選ばれるので、微妙に不便です。
なので、引数のところに色々条件を加えてみました。
トランスフォームノードだけ
import maya.cmds as cmds cmds.select(cmds.ls(selection=True, dagObjects=True, type='transform')) oSel = cmds.ls(sl=True) print oSel
シェイプノードだけ
import maya.cmds as cmds
cmds.select(cmds.ls(selection=True, dagObjects=True, type='shape'))
oSel = cmds.ls(sl=True)
print oSel
単純にSelectの引数にDagフラグを立て、タイプを絞っただけです。
こんな形でSIのフィルタや、Typeに近い感じで選択の取得ができます。
ふぅ。。
第一回目はとりあえずここまで。
次は特に考えてないので、お題が出れば作成してみたいと思います。
以上です。