チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第40回:ポリゴン数をリストアップしよう!(4/4)もっとGUIを使いやすくしよう

2013.03.26

  • Maya
  • ゲーム
  • チュートリアル
  • モデリング
  • 中級者
  • 学生・初心者
  • 教育
  • 映画・TV

当初の目的通りポリゴン数の多い順にモデルをリストアップするツールが出来ました。下図のようなツールです。



便利といえば便利ですが、まだまだ改善点がありそうですね

モデル名がリスト表示されていますが、モデル名から実際にモデルを選択するのはとても大変です。Outlinerから見つけ出すのも大変です。リスト項目を元にモデルが選択されるようにしたらどうでしょうか?ツールがより直感的になり、作業しやすくなりそうです。やりたいことが思ったように出来る、それが良いツールの条件です。

というわけで今回はツールに磨きをかけて、リスト項目を選択したらモデルが選択されるようにしてみましょう。

リストからモデルを選択

ふむ、どうしたらこれが達成できるかちょっと考えてみましょう。今はウインドウにモデルのリストが表示されています。

選択されているリスト項目に書かれている文字がわかれば「モデル名+ポリゴン数」が分かります。ポリゴン数の文字を削除することで対象のモデル名がわかります。それを「select」コマンドで選択すれば良さそうじゃないですか?

まず選択されているリスト項目の文字列の取り方です。「textScrollList」のヘルプをみてみる事にしましょう。



なにかそれっぽいものがあります。
「-selectItem」
「指定したテキストを含む項目を選択します。」

MELコマンドでは「作成時(-cまたは指定なし)」「編集時(-e)」「照会時(-q)」のフラグを最初に指定することで、同じ「-selectItem」でも意味が変わります。ヘルプの説明に通常書かれているのは「作成時」の結果です。なので「照会時」に、つまり値を取ろうとする時には意味を反対に考えなければいけません。…ややこしいですね。

この「-selectItem」の場合は、
「指定したテキストを含む項目を選択します。」(textScrollList -selectItem “item”)

「選択した項目に含まれるテキストを返します」(textScrollList -q -selectItem)
という意味に逆転します。

MELを学び始めた時にどれだけこれに惑わされたことか…。この、空気を読め、感がなかなか厄介ですが、慣れてくると意外と分かり合えるようになってきます。
まあ何はともあれこれで選択している項目の文字列が得られます。あとは得られた文字列の中からどうにかしてモデル名を抽出出来ればOKです。

モデル名の抽出

リスト項目から得られる文字列は「pCylinderShape1-80」などになっています。「-」ハイフン区切りで左側がモデル名、右側がポリゴン数です。どうやってモデル名をゲットしましょうか?

よくあるパターンでtokenizeを使う方法があります。こんな感じで実行して見て下さい。

string $buffer[];
tokenize "pCylinderShape1-80" "-" $buffer;
print $buffer[0]; // pCylinderShape1


「tokenize」は最初の文字列を、二番目の文字で区切ってバラします。ばらしたものを三番目の配列に入れます。

上の例では「-」で文字列がバラされて、
「$buffer[0]」 に 「pCylinderShape1」
「$buffer[1]」 に 「80」
が入ります。しめしめ、簡単にモデル名がゲット出来ました!

リストを選択した時にスクリプトを実行

リスト項目から対象のモデル名を得るところまで出来ました。ではこの一連のプログラムをいつ実行しましょうか?

例えば「選択」というボタンを用意し、リスト項目を選択してからボタンを押したらモデルが選択される、というのが手っ取り早そうです。でも毎度ボタンを押すのはちょっと面倒ですね。リストを選択した時に自動的にスクリプトが実行されて、モデルが選択される方が便利そうです。

リストを選択した時にスクリプトを実行…。
MayaのGUIでは何かをした時にスクリプト、つまり「コマンド」を実行することができます。ボタンを押したらコマンドを実行出来ますよね。それと同じ感覚で、チェックボックスにチェックを入れるとコマンドを実行することも出来ますし、テキストフィールドに何か書いたらコマンドを実行することもできます。なので「textScrollList」でリストの要素を選択したらコマンドを実行することも出来そうな感じがします。

「textScrollList」のヘルプページで「command」という文字を検索します。すると…



いっぱいあります。コマンドを指定するためのフラグは普通「~Command」という名前になっていますので、気になったらまずこれで検索すると良いです。

今回はリストを選択した時にコマンドを実行するので「-selectCommand(-sc)」にコマンドを指定します。



こんな感じで指定してみましょう。

textScrollList -sc "selectItem()" lnp_slist;


何かリストの中身を選択すると「selectItem()」が実行されるという寸法です。ちなみに「lnp_slist」というGUI名をつけています。その心は、
「List Number of Polygons, text Scroll LIST」の「lnp_slist」です。なんでもいいんです。他のスクリプトとぶつからなくて、だいたい分かる名前なら。

では、全てを合わせたコードはこんな感じになります。

proc string[] getMeshList(){
string $meshes[] = `ls -type mesh`;
int $nums[];
string $data[];
for ( $mesh in $meshes ){
int $numTris[] = `polyEvaluate -t $mesh`;
$nums[ size($nums) ] = $numTris[0];
$data[ size($data) ] = $mesh + "-" + $numTris[0];
}
$nums = sort($nums);

string $results[];
for ( $i = size($nums)-1; $i >= 0; $i-- ){
string $num = $nums[$i];
for ( $j = 0; $j < size($data); $j++ ){
if ( `gmatch $data[$j] ( "*-" + $num )` ){
$results[size($results)] = $data[$j];
$data[$j] = "";
}
}
}
return $results;
}

proc selectItem(){
string $items[] = `textScrollList -q -si lnp_slist`;
// e.g. "pSphere-403"

select -cl;
for ( $item in $items ){
string $buffer[];
tokenize $item "-" $buffer;
select -add $buffer[0];
}
}

proc gui(){
string $win = "listNumberOfPolygonWin";
if ( `window -q -ex $win` ){
deleteUI $win;
}
window -t "List Num of Polygon" $win;
frameLayout -l "List of mesh";
textScrollList -ams true -sc "selectItem()" lnp_slist;

string $data[] = getMeshList();

for ( $item in $data ){
textScrollList -e -a $item lnp_slist;
}
showWindow $win;
}
gui();


スクリプトエディタで実行すると、下図のようにウインドウが表示されましたでしょうか?



リストの項目を選択すると、該当のモデルが選択されますか?選択されればついに完成です!

なんか、みなさんと共にスクリプトを書いてツールを作っていくというよりは「三分経ったものがコチラに用意してあります」と、電子レンジの中から出来たものが出てきているだけの雰囲気がありますが、内容が微妙にややこしくなってきたのでご了承を…。

とりあえず当初の目的は達成できたのではないでしょうか?これで効果的にポリゴンリダクションの作業が出来そうです。

とはいえ改善出来そうな点はまだまだあります。例えば、
・ リストの文字列が見難いので、ポリゴン数の表示をもっとわかりやすくする。
・ トータルのポリゴン数を出す。
・ ハイドされているモデルはリストに出さない。
・ モデル名が「~Shape」という名前になっているので、トランスフォーム名にする。
・ オブジェクトのバウンディングボックスサイズとポリゴン数を加味して「小さいのにポリゴン数が多い」ものをリストの上に持ってくるようにする。
・ 指定したポリゴン数以上のものだけリストに出す。
などなど、いろいろ出来そうですねー。

まとめ

ようやく、ついに、四回目にしてツールが完成しました!段々とツールが出来るまで時間がかかるようになってきているのが気がかりですが、なかなか便利そうなツールが出来ましたね!

これで計画的にポリゴンリダクションが出来そうでしょうか?効果的に、効率的に作業をする、ツールがアレばこそ出来ることです。こういうカスタマイズを簡単に出来るのがMayaの強みですので、このツールをベースに色々と派生系を考えて作ってもらえると幸いです。

ところで、今回作ったツールを他のアーティストにも使ってもらいたいですよね。

他のマシンで使えるようにするには、.melファイルに保存して配布しなければいけません。ところが単純に.melファイルに保存しても意図したように動かないことがしばしば。

「プロシージャが見つかりません」だの何だの表示されてうまくツールが起動できないとか、毎度.melの中身を開いてスクリプトエディタにコピペして実行しているとか、毎回sourceコマンドで.melを読み込んでいるとか、そういうことに心あたりがある方、結構いらっしゃると思います。

次回はそういう方必見!なぜ自分のMayaでは動くのに他人のMayaで動かないか、その原因となっている「global proc」「proc」「melファイル名」の関係を見て行きたいと思います。

Maya Learning Channel
製品購入に関するお問い合わせ
オートデスク メディア&エンターテインメント 製品のご購入に関してご連絡を希望される場合は、こちらからお問い合わせください。