こんにちは!python勉強中の、ビーバー@ゲーム業界歴約20年 です。
CG・ゲーム制作系の3Dデザイナーさんに向けて、maya python のコンテンツを発信しています。
分かりやすいmaya pythonのコマンド一覧ってないのかな?
どう検索すればお目当てのコマンドにたどりつけるのかわからないんだ。。
目的のコマンドを知るにはmaya helpか、あるいは書籍か。そもそもコマンド名さえ分からない場合はどうしたらいいんだと感じませんか(笑)
今回は、そんな私自身が探り探りやってきた方法や書籍で学んだ方法、youTubeや人から教えてもらった方法をまとめて紹介します!
調べ方を知るだけで、スクリプトを書くスピードが断然速くなりますよ!
※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。
前準備
…と、その前に。コマンドを調べる前に欲しい処理を分解して考えてみましょう。
え?いきなりコマンドを調べていくほうが早いんじゃないの?
ひとつのコマンドですむ?と思っていたことが、
実はいくつかの操作の組み合わせだったりするからね。
前準備で調べたいことをはっきりさせておくと、ゴールまでの道のりが短縮できるよ!
コントロールリグを作る例をあげます。
たとえば、こんなシーンで、、
まずどのようなリグにするのか要件を考えると思います。
コントロールリグだから、骨を動かすコントローラ群を作るんだよね。
要件っていうと、、、こんな感じ?
【要件】
- メッシュは骨にスキンバインドされてて
- コントローラはロケータで
- コンストレインノードは邪魔だから、アトリビュートをコネクトして動かしたい
そうそう!
要件が決まれば、次に手作業の場合の手順を考えてみよう。
きっとこんな感じでしょ?
【作業手順】
- 骨とメッシュをバインドして
- ロケータを作って骨の位置に配置して
- ノードエディタでTrans,Rotのアトリビュートをコネクトする
ここで大事なのは、どんなコマンドを使ったか、どんな操作を行ったかを具体化することです。
手順を具体化したら、、必要なコマンドと操作の目星をつけてみよう!
【必要なコマンドと操作】
- スキンバインドコマンド
- ロケータ作成コマンド
- ロケータを骨位置に合わせる操作
- アトリビュートのコネクトコマンド
そうか!このコマンド名を調べていけばいいんだね!
そうだよ!調べるものがはっきりしていると、効率もあがるでしょ?
それでは本編いってみましょ~!!
やりたい処理を見つける方法
mayaのpythonコマンドを探すアプローチは、5つあります。
①maya help から検索
②melのヒストリから探す
③ググる
④pythonコマンドとして存在しない場合、melを呼び出して使う
⑤py友に聞く
それぞれ具体的な例を挙げながら、調べ方を紹介していきます。
①maya help から検索
公式のリファレンスで、網羅性高く、個々のコマンドのフラグ情報まで詳しく解説されています。
また、コマンド解説のページ下部には、コマンド使用のサンプルスクリプトもあり、
そこから具体的な使い方を知ることもできます
鉄板だよね。まずはヘルプから当たってみよう!
アニメーションキーのあるフレーム数を取得したい場合
この場合は、どのようにコマンドを調べるでしょうか?
キーフレーム関連のコマンドだろうから、、、helpから「key」で検索してみるね
いろいろ出てくるけど「keyframe」これじゃない(喜)?
ヘルプの概要を読んでほしい処理に近づきそうかどうか判断、、
- コマンド(python) keyframe
このコマンドは、指定されたオブジェクトまたはパラメータ カーブにおける
キーの時間または値を編集します。
別途、「-query」フラグで指定されていない限り、このコマンドは
既定でキーフレームを編集します。
イケそうな感じです。続いてフラグを確認します。
- フラグ selected(sl)
このフラグが照会で使われた場合、どんなアクティブなキーに対しても要求された値を返します。
これかもしれません。5f目に打ったキーを選択して試してみます。
やったね!欲しい結果がゲットできたよ!
今回はまっすぐにヘルプから答えを見つけることができました。
当たり前と言えばそうですが、最初に頼るのはやはり公式のヘルプではないでしょうか。
②melのヒストリから探す
しかし、、そんなmayaヘルプでも、目的のコマンドにたどり着けないこともあると思います。
そんな時、GUIからのコマンドを知っているなら、
それを実行して、ヒストリからコマンド名を探す手もあります
「トランスフォームのフリーズ」の例
フリーズのpythonコマンドを使いたい場合はどうすればいいのでしょう?
フリーズっていうと、transを0,0,0にするアレだね。
さっそくヘルプで検索してみるよ!
「freeze」、、、っと。あれ?これはノードをフリーズするコマンド?なんか違う。。
こんな時はGUIからコマンドを実行して、
スクリプトエディタで、melヒストリを確認してみるといいよ!
さっそくやってみましょう。適当なboxを作成し、フリーズをかけます。
実行した内容がmelで返ってきました。
「makeIdentity」がそれっぽいです。これをヘルプで検索してみます。
- コマンド(python) makeIdentity
選択したトランスフォーム、およびシェイプレベルまでのすべての子を
ID 変換でリセットする、高速な方法です。 - フラグ apply(a)
true にすると、トランスフォーム ピボットのワールド空間での位置が保持されて
シェイプが移動しないように、トランスフォームが ID になった後で、
累積されたトランスフォームがシェイプに適用されます。既定は false です。
内容がわかりにくいですが、たぶんビンゴです。
pythonスクリプトの書式で打ち込んでみます。
欲しい結果が得られました!
おお、できたああ!
melヒストリからコマンドを探す方法、わかったよ~!
いい調子!じゃあ次の方法だ!
③ググる
ヘルプでも、ヒストリからも手掛かりがつかめない場合もありますよね。。
そんな時はどうしたらいいのでしょうか?
なんだかんだ言って、やっぱり頼りになるのはGoogle先生だよ。
ポリゴンの頂点のワールド位置を取得したいとき
ちょっと手の込んだ(?)コマンドを探したいときは、
Google先生にお世話になることが多いでしょう。
「Maya Python 頂点 取得」 などのキーワードで検索します。
一番目のページから「pointPosition」というコマンドがあることを知ります。
そのページを読みこんでみたり、ヘルプで詳細確認してみましょう。
- コマンド (Python) pointPosition
あらゆるタイプのポイント オブジェクトのワールド空間位置か
ローカル空間位置を返します。
それっぽいですね!
適当に作った、ボックスの頂点を選択して実行してみます。
ズバリ欲しかった結果が得られました!
たいていのコマンドはGoogle先生が教えてくれそうだね♪
ヘルプと、melヒストリと、ググる作戦を組み合わせて探していくといいよ。
④pythonコマンドとして存在しない場合、melを呼び出して使う
え、何?どういうこと??
そもそもpythonコマンドとして存在しない処理もあるんだよ。
そういった処理はmelでしか存在しないんだ。
なんぼ探してもpythonコマンドがみつからん、、
そんな時はpythonからmelを呼び出して使いましょう!具体的なケースで見ていきます。
たとえば、「小さなウェイトの値を削減(Prune Small Weights)」したいとき
スキンバインドされたメッシュから、設定した値より小さいウェイトを削除するコマンドです。
このコマンドの例でみていきましょう。
最初に、pythonコマンドあるかどうかを確認します。
「②melのヒストリから探す」手順と同様、
GUIから実行したコマンドのヒストリを見てみましょう。
GUIメインメニューから
スキン>小さいウェイトを削減 を実行
ヒストリに doPruneSkinClusterWeightsArgList 1 { “0.01” };
と表示されました。どうやら、「doPruneSkinClusterWeightsArgList」というのが
今、探しているコマンド(?)のようです。
Prune や SkinCluster などめぼしいキーワードで、mayaヘルプを検索します。
検索検索、、っと。。
SkinCluster はヒットするけど、どうも違うみたいだなあ。
melコマンドでもヘルプを検索してみたけど、ヒットしないみたいだよ。
オッケーOK!もちょっと深掘りしてみよう。
maya python には 「helpコマンド」があるんだ。これを使って調べていくよ。
maya python の helpコマンド
maya pythonには、helpコマンドというものがあります。
helpコマンドでは、スクリプトエディタにコマンドのクイック ヘルプを表示したり、
ブラウザでオンラインマニュアルを呼び出すことができます。
help( ”コマンド名”, フラグ=○○ )
例)クイックヘルプの表示
cmds.help('polySphere')
例)オンラインマニュアルの表示
cmds.help( 'polySphere', language='python', doc=True )
画像ではhelpコマンドで、polySphere()のクイックヘルプを表示しています。
今回、注目すべきは最下段
Command Type: Command
コマンドタイプがコマンドである内容の記述があります。
これは「polySpher は mayaコマンドである」
とヘルプが返してきている、ということです。
「polySphereはmayaコマンドである」って、あえて書いてるってことは、
ほかに何かあるの?
いいところに気が付いたね!
では、くだんの「doPruneSkinClusterWeightsArgList」をhelpしてみよう。
理由がわかるよ。
さっそくhelpで問い合わせてみます。
長すぎてヒストリが見切れます(笑)が、何やら出てきました。
# 結果: "doPruneSkinClusterWeightsArgList" は
ファイル C:/ProgramFiles/Autodesk/Maya2020/scripts/others/doPruneSkinClusterWeightsArgList.mel
に定義された MEL プロシージャです。 #
「MEL プロシージャです」と帰ってきました。
プロシージャ = 関数です。この処理はコマンドではなく関数だったのですね。
関数!!! …ってコマンドとどう違うん?
関数のパスが返ってきているから、中身をみてみよう
「小さなウェイトの値を削減」の処理がmelで書かれているよ。
こういった特定の動作を行うプログラムが関数だよ。
そっか!なんとなく(?)わかったよ!
mayaの「コマンド」であるなら、pythonコマンドもありそうですが、
mel関数となると、この例の場合対応するpython関数、、はないようです。
こんな時はどうすればいいのでしょうか?
そう、今こそ、pythonからmelを呼び出すのです!
pythonからmelを呼びだすには、先にimport でmelを読み込んでおく必要があります。
これは、melを「mm」として読みこむという宣言です。
melコマンドは、「mm」の後に 「mm.○○○(melコマンド名)」の形で書くことで
pythonから呼び出すことができます。
例えば、ポリゴン球を作成するmelをpythonから呼び出す場合はこのように書きます。
import maya.mel as mm
mm.eval("polySphere;")
eval、、エバる、、、?
なんか違うの想像したでしょう。。。
「eval」はmelスクリプトをpythonで使うためのコマンドだよ。
pythonコマンド「eval」はmelスクリプトを実行します。
ヘルプにはこう書いてあります
- コマンド (Python) eval (maya.mel モジュール)
※Python でのみ使用可能
「この関数は MEL コードを含む文字列を取り、MEL インタプリタを使用して、
この文字列を評価します。結果は Python データ型に変換され、返されます」
要するに、
mm.eval(“○○”)
○○のところにmelスクリプトをコピーしたら、
「その挙動をpythonとして実行しまっせ」ということです。
melは分からないんだけど、コピーで大丈夫なの?
melの行末は必ず「;」セミコロンで終わるルールがあるから、そこに注意しよう。
書き方を詳しくいていくよ。
「小さなウェイトの値を削減」のヒストリを思い出します。
doPruneSkinClusterWeightsArgList 1 { "0.01" };
そのままevalのカッコ内に貼り付けて実行してみましょう。
// エラー: doPruneSkinClusterWeightsArgList 1 { '0.01' }; //
// エラー: Line 1.38: Syntax error //
エラー: RuntimeError: file line 1: MEL スクリプトの実行時にエラーが発生しました
Line 1.38: Syntax error #
めちゃくちゃ怒られたよ(泣)!!
「0.01」の部分が文字列じゃなくって、数値になってる って怒っているみたいだね。
文字列に変換するstr()を使って、前後の文字列と連結しよう
書き直します。
これでどうだ!
成功した~~~~~~(喜)!!
やったね!!これで無事
pythonから「小さなウェイトの値を削減」の mel関数を実行できました!
pythonコマンドの探し方の記事のはずなのに、melを呼び出して使おうなんて、
なんか卑怯な気もしましたが、コマンドがないんだから仕方ありません(笑)
⑤py友に聞く
コマンドを見つける奥の手です。
「py友」?
「ぱいとも」!こころざしを同じくするpython仲間のことだよ。
というかもう人に聞いちゃう(笑)
もし、一緒にmaya pythonを学習する仲間がいるなら、聞いてみるのも良いと思います。
テクニカルアート職の方だったり、その手のプロが身近にいるなら、最高の先生です。
たとえば、ロケータから骨のtrans,rotを動かすリグを作りたいとき
前準備で、作ろうとしているものの要件と手順が具体的になっているなら、
それを伝えてみると、py友も答えやすいと思います。
ひとつの要件に対して、いくつかの解決方法があるかもしれないからね!
じゃあハムちゃん、僕コントロールリグを作りたいんだけど、どうやったらいいのかな、、?
ロケータから骨のtrans,rotを動かす仕組みにしたいんだ。
ロケータで骨を動かせればいいんだね。
それだと、
・parentConstraint()でロケータから骨をうごかす
・connectAttr()でアトリビュートを接続する
どっちかでいけるんじゃないかな?
connectAttr() っていうコマンドもあるんだね!知らなかった~
ありがとう!ヘルプを見てみるよ。
思いがけない方法を教えてもらえるかもしれません。
詳細はぜひヘルプを見たり、ググってみたりして、使い方を自分の血肉にしましょう。
そして、py友へ絶大な感謝を述べましょう。
いつの日か、自分もpy友へお返しができるくらい上達したいものです。
まとめ
今回はやりたい処理のpythonコマンドを見つける方法をご紹介しました!
どんなコマンドもドキュメントだけではわかりづらく、
結局は調べて、試して、地道な学習の繰り返しで覚えていくのかな、と思いますが、
それでもこの記事が皆さんのお役にたてればうれしいです!
コメント