はじめに
この記事は、3DCG業界で働くArtist向けのMEL入門記事です。
普段の業務を効率化したいけど、MELの書き方が分からない、調べたけどイマイチ分からなかった、そんな方向けに書きました。
本記事は「便利なコマンドとフラグを知る」をゴールとします。
環境
Autodesk Maya 2022.2
前回のあらすじと今回へのつなぎ
前回はls
コマンドを使用しました。大変便利で強力なコマンドですが、MELには他にもたくさんの強力なコマンドがあります。今回は新要素の習得というよりはコマンドやフラグの紹介と、使用例の解説をしていきます。なおフラグにはショートネームを使用している箇所があります。
その前に
出鼻をくじく形にはなってしまいますが、コマンドやフラグを理解するためにはある程度Mayaの仕組みの知識を必要とします。
まずは今回紹介するコマンドの理解に必要な知識を簡単に見ていきます。
メッシュとトランスフォーム
突然ですが、メッシュの構成要素は何だと思いますか?
メッシュなのだからメッシュ1つで構成されていると思うかもしれません。
アウトライナで見ても1つにしか見えません。
ですが、実はメッシュはメッシュとトランスフォームで構成されています。
これは、アウトライナのディスプレイメニューの「シェイプ」にチェックを入れると確認することができます。
なにやら親子階層ができましたね。
これは「シェイプ」がオンになったことによって親子階層ができたのではなく、シェイプがオフのときは表示が省略されていただけです。
早速どういう構造になっているのか見てみましょう。
さっきまでメッシュだと思っていた「pCube1」がトランスフォームとして存在しており、その子供には「pCubeShape1」というメッシュが存在しています。
これが、メッシュはトランスフォームと一緒に構成されている所以になります。
試しに「pCube1(トランスフォーム)」を選択して、チャネルボックスを見てみましょう。
なんの変哲もないですが、これはメッシュではありません。ただのトランスフォームです。移動や回転・スケール等を司るもので、メッシュとは一切関係がありません。
次に「pCubeShape1(メッシュ)」を選択して、チャネルボックスを見てみましょう。
あれ、いつも見ているチャネルボックスとは少し違いますね。
これはトランスフォームのGUI部分が丸ごと存在しないからです。
メッシュは本当にメッシュの情報しか持っておらす、移動や回転といった情報は持っていないのです。
つまり、メッシュはトランスフォームの子供になることによって移動や回転を擬似的に表現しているということになります。
でもモデリングする際に、それを意識するのはめんどくさいですよね?
なので普段は省略されているのです。
ノード
ノード。たまに聞きますが、実態はなんなのでしょうか?
少し抽象的な概念になってしまうので、実物を見て確認しましょう。
ウィンドウメニューからノードエディタを開いてください。
なんらかのオブジェクト(今回はpCube1)を選択した状態で下図のアイコンを押すと、ノードを見ることができます。
この横長のものがノードです。
ノード上をマウスオーバーするとノード名とノードのタイプが表示されます。
pCube1はトランスフォームノードのようですね。
pCubeShape1はメッシュノードのようです。
ここでは深く言及しませんが、ヒストリも一つ一つがノードです。
例えばスキンのバインドをした際にできる「skinCluster」はスキンクラスターノードです。
Mayaはノードでできているという表現もあるくらいです。
さて少し小難しい話をしたところで、次からはコマンドとフラグの紹介に入っていきます。
objectType
オブジェクトのタイプを取得するコマンドです。
string $selections[] = `ls -sl`;
string $objectType = `objectType $selections[0]`;
print($objectType);
pCube1を選択した状態で上記を実行すると、
transform
がログにprintされます。
当然ですが、pCubeShape1を選択した状態で実行すれば、
mesh
とprintされます。
ls -dagObjects
DAGオブジェクトをすべて選択するフラグです。
まずDAGとはなにかですが、簡単に言うと親子階層を持てるノードのことです。
たとえばpCube1はトランスフォームノードとメッシュノードから構成されますが、両方ともDAGです。ジョイントもDAGです。
全てのノードがDAGなのかというとそういうわけではありません。スキンクラスターノードは親子関係なんて持てませんよね。
使用例としては、選択したオブジェクトの階層下のオブジェクトも全て取得したい場合です。
試しに選択階層下の骨をすべて取得してみましょう。
一番上の階層の骨だけを選び、dagObjects
フラグを使用すれば、
string $selDagObjs[] = `ls -sl -dagObjects`;
print($selDagObjs);
ls -flatten
コンポーネントを一つ一つ取得できるフラグです。
そもそもとしてですが、頂点等のコンポーネントを選択して、
ls -sl
コマンドを使うと、
このように頂点番号が連番でまとめられてしまいます。一つずつ取得したい場合には不便ですよね。
そこでflatten
フラグを使用すれば、
string $selvertices[] = `ls -sl -flatten`;
print($selvertices);
ls -long
オブジェクトの単品名ではなく、親階層を含めた名前を取得するフラグです。
例えばjoint5の名前を取得する場合、
long
フラグなしだと、
オブジェクト名のみしか取得できません。
long
フラグありだと、
string $selObjs[] = `ls -sl -long`;
print($selObjs);
一番上の親からの階層を含めたフルパスを取得することができます。
ls -type
オブジェクトのタイプでソートするフラグです。
そもそも、ls
コマンドはフラグを指定しない場合は、下図のようにシーン上にある全てのものを取得します。
sl
フラグはこの一覧の中から、選択しているものだけに絞るわけです。
type
フラグはこの一覧の中から、オブジェクトのタイプで絞ることができます。
冒頭でも確認しましたが、オブジェクトのタイプはノードエディタで確認ができます。
例えば、ジョイントのノードをマウスオーバーすると、
ジョイントのタイプはjoint
だとわかります。
このようなシーン上で、
ジョイントのみを取得したい場合は、type
フラグで"joint"
を指定すると、
string $allJoints[] = `ls -type "joint"`;
print($allJoints);
ls -noIntermediate
中間オブジェクトを無視することができるフラグです。
まずIntermediateとはなにかですが、中間オブジェクトのことです。
デフォームを使用している際に確認することができます。代表的なものだとスキンのバインドですね。
ノードエディタで確認ができます。
Origというsuffixがついているノードが中間オブジェクトです。
type
フラグを使って"mesh"
のみを取得しようとすると、
string $allMeshes[] = `ls -type "mesh"`;
print($allMeshes);
純粋な"mesh"
のほかにも中間オブジェクトがついてきてしまいます。これは中間オブジェクトも"mesh"
であるからです。
noIntermediate
フラグを使用すると、
string $allMeshes[] = `ls -type "mesh" -noIntermediate`;
print($allMeshes);
listHistory
ヒストリをリストで取得するコマンドです。
使用例としては、「スキンのバインド」を行った際に生成されるskinCluster
ノードを取得する場合があります。
string $selections[] = `ls -sl`;
string $histories[] = `listHistory $selections[0]`;
print($histories);
バインド済みのモデルを選択した状態で、上記を実行してみると、
pCubeShape1
skinCluster1
pCubeShape1Orig
joint1
joint2
joint3
なにやらたくさん出てきましたが、これらがヒストリです。
skinCluster
のみが欲しい場合はここから更に絞り込みます。
実は絞り込みはls
コマンドで行うことが可能です。
string $sortedHistories[] = `ls -type "skinCluster" $histories`;
この書き方で絞り込みができます。タイプをskinCluster
で絞るということですね。
絞り込み処理を追加して、再度実行してみると、
string $selections[] = `ls -sl`;
string $histories[] = `listHistory $selections[0]`;
string $sortedHistories[] = `ls -type "skinCluster" $histories`;
print($sortedHistories);
listRelatives
親子関係を取得するコマンドです。
使用例としては、メッシュのトランスフォームから、メッシュ本体を取得する場合があります。
冒頭でも説明した通り、メッシュはトランスフォームの子になっています。
なおかつ、ビューポートでメッシュを選択すると、トランスフォームを選択することになります。
メッシュに対してなにかを行いたいときは、「アウトライナのシェイプをオンにしてから、メッシュ本体を選択して実行する」、なんていうのは少々めんどくさいですよね。
なのでトランスフォームを選択した状態から、子供であるメッシュ本体を取得したいわけです。
string $selections[] = `ls -sl`;
string $children[] = `listRelatives $selections[0]`;
print($children);
メッシュを選択した状態で上記を実行すると、メッシュ本体を取得できます。
listRelatives
コマンドには、他にも親を取得するフラグ等があり、大変便利です。
気になった場合はコマンドリファレンスを参照してみてください。
select
選択を操作するコマンドです。
使用例としては至極単純で、オブジェクトを選択する場合等があります。
select pCube1;
シーン上にpCube1がある状態で、上記を実行すると、pCube1を選択できます。
逆に選択解除したい場合は、
select -clear;
上記を実行すると、選択を解除できます。
おわりに
いかがでしたか?
今回紹介したコマンドは他にもたくさんのフラグを持っています。
適切なフラグを使えば更に凝ったことや便利なことが行えるようになります。
適切に扱うにはMayaへの理解も必要なので最初はちょっととっつきにくいかもしれませんが、少しずつ確実に理解して、コマンドやフラグを使いこなしてもらえると嬉しいです。
次回はこちら→【ArtistでもMELが書きたい】Maya MEL入門(10)
参考