2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【ArtistでもMELが書きたい】Maya MEL入門(9)【便利なコマンドとフラグ】

Last updated at Posted at 2023-02-23

はじめに

この記事は、3DCG業界で働くArtist向けのMEL入門記事です。
普段の業務を効率化したいけど、MELの書き方が分からない、調べたけどイマイチ分からなかった、そんな方向けに書きました。
本記事は「便利なコマンドとフラグを知る」をゴールとします。

環境

Autodesk Maya 2022.2

前回のあらすじと今回へのつなぎ

前回lsコマンドを使用しました。大変便利で強力なコマンドですが、MELには他にもたくさんの強力なコマンドがあります。今回は新要素の習得というよりはコマンドやフラグの紹介と、使用例の解説をしていきます。なおフラグにはショートネームを使用している箇所があります。

その前に

出鼻をくじく形にはなってしまいますが、コマンドやフラグを理解するためにはある程度Mayaの仕組みの知識を必要とします。
まずは今回紹介するコマンドの理解に必要な知識を簡単に見ていきます。

メッシュとトランスフォーム

突然ですが、メッシュの構成要素は何だと思いますか?
メッシュなのだからメッシュ1つで構成されていると思うかもしれません。
アウトライナで見ても1つにしか見えません。
MEL_learning17.png
ですが、実はメッシュはメッシュとトランスフォームで構成されています。
これは、アウトライナのディスプレイメニューの「シェイプ」にチェックを入れると確認することができます。
MEL_learning18.png
MEL_learning19.png
なにやら親子階層ができましたね。
これは「シェイプ」がオンになったことによって親子階層ができたのではなく、シェイプがオフのときは表示が省略されていただけです。
早速どういう構造になっているのか見てみましょう。
MEL_learning20.png
さっきまでメッシュだと思っていた「pCube1」がトランスフォームとして存在しており、その子供には「pCubeShape1」というメッシュが存在しています。
これが、メッシュはトランスフォームと一緒に構成されている所以になります。

試しに「pCube1(トランスフォーム)」を選択して、チャネルボックスを見てみましょう。
MEL_learning21.png
なんの変哲もないですが、これはメッシュではありません。ただのトランスフォームです。移動や回転・スケール等を司るもので、メッシュとは一切関係がありません。

次に「pCubeShape1(メッシュ)」を選択して、チャネルボックスを見てみましょう。
MEL_learning22.png
あれ、いつも見ているチャネルボックスとは少し違いますね。
これはトランスフォームのGUI部分が丸ごと存在しないからです。
メッシュは本当にメッシュの情報しか持っておらす、移動や回転といった情報は持っていないのです。
つまり、メッシュはトランスフォームの子供になることによって移動や回転を擬似的に表現しているということになります。

でもモデリングする際に、それを意識するのはめんどくさいですよね?
なので普段は省略されているのです。

ノード

ノード。たまに聞きますが、実態はなんなのでしょうか?
少し抽象的な概念になってしまうので、実物を見て確認しましょう。
ウィンドウメニューからノードエディタを開いてください。
MEL_learning23.png
なんらかのオブジェクト(今回はpCube1)を選択した状態で下図のアイコンを押すと、ノードを見ることができます。
MEL_learning24.png
MEL_learning25.png
この横長のものがノードです。
ノード上をマウスオーバーするとノード名とノードのタイプが表示されます。
MEL_learning26.png
pCube1はトランスフォームノードのようですね。
MEL_learning27.png
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なのかというとそういうわけではありません。スキンクラスターノードは親子関係なんて持てませんよね。

使用例としては、選択したオブジェクトの階層下のオブジェクトも全て取得したい場合です。
試しに選択階層下の骨をすべて取得してみましょう。
MEL_learning01.png
一番上の階層の骨だけを選び、dagObjectsフラグを使用すれば、

string $selDagObjs[] = `ls -sl -dagObjects`;
print($selDagObjs);

MEL_learning02.png
階層下の骨をすべて取得できます。

ls -flatten

コンポーネントを一つ一つ取得できるフラグです。

そもそもとしてですが、頂点等のコンポーネントを選択して、
MEL_learning03.png
ls -slコマンドを使うと、
MEL_learning04.png
このように頂点番号が連番でまとめられてしまいます。一つずつ取得したい場合には不便ですよね。
そこでflattenフラグを使用すれば、

string $selvertices[] = `ls -sl -flatten`;
print($selvertices);

MEL_learning05.png
一つずつ取得できます。

ls -long

オブジェクトの単品名ではなく、親階層を含めた名前を取得するフラグです。

例えばjoint5の名前を取得する場合、
MEL_learning06.png
longフラグなしだと、
MEL_learning07.png
オブジェクト名のみしか取得できません。
longフラグありだと、

string $selObjs[] = `ls -sl -long`;
print($selObjs);

MEL_learning08.png
一番上の親からの階層を含めたフルパスを取得することができます。

ls -type

オブジェクトのタイプでソートするフラグです。

そもそも、lsコマンドはフラグを指定しない場合は、下図のようにシーン上にある全てのものを取得します。
MEL_learning11.png
slフラグはこの一覧の中から、選択しているものだけに絞るわけです。
typeフラグはこの一覧の中から、オブジェクトのタイプで絞ることができます。
冒頭でも確認しましたが、オブジェクトのタイプはノードエディタで確認ができます。
例えば、ジョイントのノードをマウスオーバーすると、
MEL_learning14.png
ジョイントのタイプはjointだとわかります。

このようなシーン上で、
MEL_learning12.png
MEL_learning13.png
ジョイントのみを取得したい場合は、typeフラグで"joint"を指定すると、

string $allJoints[] = `ls -type "joint"`;
print($allJoints);

MEL_learning15.png
タイプがjointのオブジェクトのみを取得できます。

ls -noIntermediate

中間オブジェクトを無視することができるフラグです。

まずIntermediateとはなにかですが、中間オブジェクトのことです。
デフォームを使用している際に確認することができます。代表的なものだとスキンのバインドですね。
MEL_learning09.png
ノードエディタで確認ができます。
MEL_learning10.png
Origというsuffixがついているノードが中間オブジェクトです。

typeフラグを使って"mesh"のみを取得しようとすると、

string $allMeshes[] = `ls -type "mesh"`;
print($allMeshes);

MEL_learning16.png
純粋な"mesh"のほかにも中間オブジェクトがついてきてしまいます。これは中間オブジェクトも"mesh"であるからです。
noIntermediateフラグを使用すると、

string $allMeshes[] = `ls -type "mesh" -noIntermediate`;
print($allMeshes);

MEL_learning17.png
中間オブジェクトが含まれなくなります。

listHistory

ヒストリをリストで取得するコマンドです。

使用例としては、「スキンのバインド」を行った際に生成されるskinClusterノードを取得する場合があります。

string $selections[] = `ls -sl`;
string $histories[] = `listHistory $selections[0]`;
print($histories);

バインド済みのモデルを選択した状態で、上記を実行してみると、
MEL_learning28.png

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);

MEL_learning29.png
うまくいきましたね。

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)

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?