【maya python4限目】階層内の骨だけを選択するスクリプトを作ろう

mayapy04 python入門
過去セミナー再配信のお知らせ

過去2回のセミナーが期間限定でアンコール配信中です!
「MayaPython習得に苦しんだ過去の自分に教えてあげたい。。」調べてもわからなかったこと、教えて欲しかったことを、とことん詰め込みました。初心者の方はぜひご覧ください!

ツール作成の全体フローを最短距離で体験できます。スクリプト未経験の方におすすめ!
https://tutorials.cgworld.jp/set/2050

Mayaのオペレーションの自動化について徹底解説。様々な操作を自動化できるようになります
https://tutorials.cgworld.jp/set/2041

こんにちは!ビーバー@ゲーム業界歴約20年 です。maya python初心者の方のために、カンタン・わかりやすい解説サイトを作っています。

maya pythonの学習情報って少ないですよね。(最初のころは本当に苦労しました。。)自分が骨を折った経験をもとに、maya python基礎を最速で習得できる10回のチュートリアルを作ってみたので参考にしていただければ幸いです。

今回は、4回目。骨だけを選択するスクリプトの作成を通して、シーンのノードを任意にフィルタリングして取得する方法をまなびます。

このチュートリアルでわかること
  • シーンのノードを任意のタイプでフィルタリングして選択する方法
  • 取得と選択の違い
  • 「変数」について

>> Pythonの勉強方法を知りたい方はこちらをどうぞ

※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。

階層内の骨だけを選択してみよう

ハムちゃん
ハムちゃん

まず実際のスクリプトを見てみよう。そのあとに解説をしていくね。

ジョイントとメッシュが複数あるシーンで試してみましょう。

mayapy04_01

ジョイントだけを選択するには、下記のように書きます。

joints =cmds.ls(selection=True,dag=True,type="joint")
cmds.select(joints)

トップノードを選んで実行。

mayapy04_02

ジョイントだけが選択できました!

ピヨちゃん
ピヨちゃん

すっごおおおおい!こういうのがやりたかったんだよー-! どうなってるの?どうやったの?!

ハムちゃん
ハムちゃん

いいリアクションですねぇ~!それではひとつずつ見ていこう

ジョイントを取得する

先ほどのスクリプトの1行目、cmds以降の部分からひも解いていきましょう。
赤字の部分です。

joints =cmds.ls(selection=True,dag=True,type="joint")
cmds.select(joints)

「cmds.ls」(エルエス)というmayaコマンドを使っています。
フラグは、selection, dag, type の3つです。

lsコマンドとは

lsコマンドとは、シーンのノードを取得するコマンドです。

取得は、選択とは異なります。
「mayaが対象のノードを一時的におぼえている状態」ととらえるとよいでしょう。

例えば、何も選択せず print(cmds.ls()) を実行すると、
シーンにあるすべてのノードがヒストリに表示されます。

lsコマンドは、あくまで名前の取得で、選択しているわけではない点に注意しましょう

ハムちゃん
ハムちゃん

名前の取得≠選択 勘違いしやすいから気を付けて!

lsのフラグ

取得するノードをフィルタしたい場合は、フラグを使います。

フラグ名挙動引数タイプ
selection  現在選択中のノードに対して ls を実行します。
boolean
dagselectionフラグとの併用で、
「選択したノード以下の階層すべて」に対して
DAGノードを取得します。
boolean
typeノードタイプで取得をフィルタリングすることができます。
例)ジョイントを選択したい場合 type=”joint”
string

今回は、階層のトップノードを選んで実行するスクリプトのため、
3つのフラグを使って
「選択中のノード以下のジョイントを取得する」挙動を作りました。

joints =cmds.ls(selection=True,dag=True,type="joint")
ハムちゃん
ハムちゃん

フラグ自体の解説は3限目にあるよ!

>> lsコマンドのいろいろなフラグについての解説はこちら

取得したジョイントを変数にする

お次は赤字のこの部分です。

joints =cmds.ls(selection=True,dag=True,type="joint")
cmds.select(joints)
ピヨちゃん
ピヨちゃん

joints?これもmayaのコマンドなのかな?

ハムちゃん
ハムちゃん

違うんだよ。これは「変数」と言って、ユーザが任意に命名・使用できるものなんだ

ピヨちゃん
ピヨちゃん

ヘンスー?????

変数とは

変数とは、「箱のようなもの」としてよく例えられています。
上記の例では、lsコマンドで取得された複数のジョイントを「joints」という箱にまとめて入れたと考えればよいでしょう。

変数くん
変数くん

変数だよ!よろしくね。

ぼくの中に入った複数のものは、ひとまとめにして扱えるよ♪

箱の名前はユーザが任意に決められるので、中身がわかりやすいように
「bones」でも「honehone」でもなんでも構いません。

変数は、左辺に変数名、右辺にその中身の書式で定義されます。

変数くん
変数くん

左辺 = 右辺

の、=(イコール)は、「右辺の中身を左辺に入れてね」という意味なんだよ。

変数の中に何が入っているのかは、スクリプトの変数部分のみをハイライトして実行すると
わかります。もしくは、printコマンドを使ってprint(変数名)と記述します。

scriptEditor

ジョイントを選択する

最後は赤字のこの部分です。

joints =cmds.ls(selection=True,dag=True,type="joint")
cmds.select(joints)

mayaコマンドはselectです。

selectコマンド

selectコマンドをヘルプで調べてみましょう。

このコマンドを使用して、オブジェクトをアクティブ リストに追加、
またはリストからオブジェクトを削除します。
5 つのフラグ [-add, -af, -r, -d, -tgl] を指定していない場合、
既定ではアクティブ リストのオブジェクトが指定したリストのオブジェクトに置き換えられます。

ちょっとわかりにくい(汗)ですが、内容は普通の選択コマンドです。
select() の()の中に選択するノード名や変数を記入します。

cmds.select(joints)で、jointsの変数内に入っているものcmds.ls(selection=True,dag=True,type=”joint”) を選択します。

ハムちゃん
ハムちゃん

スクリプトを書いたら、その部分をハイライトして右クリック→そのままシェルフにドラッグ&ドロップすれば、立派なツールになるよ!

ピヨちゃん
ピヨちゃん

シェルフに登録しておけば、毎度スクリプトを書かなくても繰り返し使えるね!

まとめ

今回学習した内容のポイントをまとめます。

学習のポイント
  • lsコマンドで、ノード名を取得する
  • フラグでフィルタをかけて欲しいノードタイプだけを取得する
  • 取得したものを変数として定義する
  • 変数に対してselectコマンドを実行する

この回では、ノード名の取得、変数について学びました。
次回は、複数オブジェクトに対してリネームを行う処理を通して学習を進めたいと思います。

はじめてpython学習するなら!

はじめてプログラミングを勉強するとき、エラーはつきものですよね。
何時間もスクリプトが動かないこともしばしば。。
そんな時、くわしい人に教えてもらいたい、と思うことはありませんか?

侍テラコヤは、はじめてpythonを学習する方にピッタリのサービスです。
サブスク型オンラインスクールで、月¥2980~の良心的なお値段!

現役エンジニアのサポートが充実しており、
オンラインのマンツーマンレッスンとQ&A掲示板で即座に悩みを解決することができます

maya python基礎

本サイトの【まとめ】 maya python 基礎 入門!では、
10回シリーズでmaya pythonの基礎が習得できるコンテンツを発信しています。

  • ちまたのスクリプトを読んで、内容を理解したい
  • mayaのスクリプトリファレンスの読み方を習得したい
  • 自分で簡単なツールを書きたい
  • 基礎的なmayaコマンドをpythonで使えるようになりたい

など、mayaでpython基礎を身に着けたい方は、ぜひご活用ください♪

オススメの本。pythonが楽しく学べます☆

コメント

タイトルとURLをコピーしました