Melのlsコマンドの可能性

クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチームの子供の頃と今では印象が変わった武将は豊臣秀頼、戦国大好き人間の中林です。

今回は珍しくアーティストさん発のキッカケは特にないです。僕がlsコマンドで初心者時代と今でどのように使い方が変わったかと、lsコマンドの可能性についてです。

初心者への魔法の呪文【ls -sl】

string $list[] = `ls -sl`;

こちらはMelの初心者にはお馴染みの記述だと思います。僕も長い間、お世話になりました。そして、Melに詳しくない人への説明は面倒なので魔法の呪文と言ってました。
お世話になりましたが最近はこのままでは使うことは無くなりました。それはlsコマンドの可能性について、これしか使わないのは失礼ですからです。
http://help.autodesk.com/cloudhelp/2019/JPN/Maya-Tech-Docs/Commands/ls.html

リンク先は2019時点でのMelのlsコマンドのリファレンスですがフラグだけでも50種類近くと沢山あります。
ちなみに魔法の呪文の-slフラグはショートネームでロングネームにすると-selectionで内容は「現在選択しているオブジェクトがリストされます」にです。
ロングネームを読むと分かる通り選択したオブジェクト選択してくれます。その為に僕も無駄にオブジェクト選択をしていたころがあります。

【ls -sl】の個人的な失敗例

1・selectコマンド選択していた

select -r pSphere1 ;
select -add pCube1 ;
select -add pCylinder1 ;
string $list[] = `ls -sl`;

このselectコマンドですが、Ctrlキーを押しながらオブジェクトを選択するとスクリプトエディタで表示されるので選択は簡単でした。
簡単な方法と簡単な方法が交わって意味のないことをしてました。
今なら、lsコマンドすら使わずに単純に1行で書きます。

string $list[] = {"pSphere1", "pCube1", "pCylinder1"};

2・処理が終わったら選択していたので利用していた

CreatePolygonSphere;
string $list[] = `ls -sl`;

これはスフィアを作った段階で自動的にスフィアが選択されていることを利用しています。この方法
自体は大きく間違っているわけではないのだけどCreatePolygonSphereコマンドを実行するとスクリプトエディタで以下の表示があれます。

CreatePolygonSphere;
polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1;
// 結果: pSphere1 polySphere1 //

実はこの結果という内容は変数で受け取ることができます。そして、スフィアを作っている本体は2行目になります。これをうまく利用すれば、1行で済むうえにテンプレート名とシェイプ名の両方を同時に取得できます。

string $list[] = `polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1`;

慣れればオブジェクトの名前のなどの取得に【ls -sl】すら使う必要がなってきます。

【ls -sl】の発展例

それでは、これで【ls -sl】は使わなくなったのか?
いや、僕は今でも普通に使っています。ただし、フラグを追加して!!
ここからは自分のMelをGrep検索して上位に来たlsコマンドでよく使うフラグを紹介します。
1・-Typeフラグ

string $list[] = `ls -sl -type "joint"`;

これは選択したオブジェクトから更に特定のタイプを抽出します。
僕もこれを知らない頃はジョイントのアトリビュートを確認するツールを提供したら、アーティストからメッシュモデルを選択して実行してエラーが出ると突っ込まれた経験がありました。
因みに対となるフラグで-showType(-st)があります。

ls -sl -st;
// 結果: lambert1 lambert // 

こちらは選択したオブジェクトのタイプを2番目の変数で分かるので謎のオブジェクトのタイプを知るときに便利です。
2・-dagObjects(-dag)フラグ

string $list[] = `ls -sl -dag`;

DAG 階層(オブジェクト階層とも呼ばれる)を細かく説明すると長くなるので、簡単に言うと選択オブジェクトの子階層を全てがリスト化の対象になります。
ちなみにフラグは組み合わせが可能なので

string $list[] = `ls -sl -dag -type "joint"`;

こうすればキャラの親オブジェクトを選択するだけで全てのジョイントを知ることができます。
また、右肩のジョイントを選択すればその先の右腕全体だけのジョイントを取得するとかもできます。
3・-flatten(-fl)フラグ

string $list[] = ls -sl;
// 結果: pCube1.vtx[0:7] //

フェースやエッジ、頂点などのコンポーネントを選択した時に実行すると連番を:マークでまとめられてしまいます。

ls -sl -fl;
// 結果: pCube1.vtx[0] pCube1.vtx[1] pCube1.vtx[2] pCube1.vtx[3] ……//

でも、このフラグがあればバラしてリスト化してくれます。僕はこのフラグをMaya2014まで知らなかったため、色々と苦労をしました。

ぶっちゃけ【ls -sl】を使わなくてよくない

1・-Typeフラグ
typeフラグを見た時からふと感じたことだけどジョイントを個別に選択する事より、全てのジョイントを選択して処理することが多くないですか?

string $list[] = `ls -type "joint"`;

他にもマテリアルは元から数が少ないし、毎回ハイパーシェードを開いて選択するのが大変とかもあります。
最近は処理によっては選択すら必要ないツールを作ることも増えてきました。

2・オブジェクト名(+*アスタリスク)
lsコマンドはオブジェクト前を指定することで取得できます。それなら初めから変数にオブジェクト名のリストを登録すれば良さそうですが

string $list[] = `ls "pSphere1" "pCube1" "aaa" "bbb" "pCylinder1"`;
// 結果: pSphere1 pCube1 pCylinder1 //

このように”aaa”や”bbb”のように存在してないオブジェクト名を自動で省いてくれるので便利です。
そして、もう一つのメリットは*アスタリスクを使うことで共通の名前を取得できることです。

string $list[] = `ls "pSphere*"`;
// 結果: pSphere1 pSphere2 pSphere3 pSphere4 pSphere5 //

こちらは命名規則がしっかりしていれば、色々と使える機会が多いです。
lsコマンドをうまく使えるようになれば、-slフラグは使う必要すらなくなります。それは、アーティストの選択させるというひと手間すら削ることができます。

良く考えたら変数すら要らなくない!?

これは本当に初心者の頃と今で、Melのソースの書き方が大きく大きく変わった部分です。
以前の書き方

string $list[] = `ls -sl`;
for($select in $list){
    各種処理
}

今の書き方

for($select in `ls -sl`){
    各種処理
}

微妙な差ですけど、初心者の頃はfor文やif文の度に余計な変数を作っていました。この変数の必要なくなっただけでもソースはかなりスッキリしました。

【ls -sl】の魔法の呪文からの卒業

僕の中でも長い期間は【ls -sl】を選択したオブジェクトを取得できる命令と扱ってきました。でも、ある日を境にlsコマンドの理解が進みMelでできる幅が広がりました。
今では【ls -sl】以外のlsコマンド苦も無く使えるようになったMelの初心者卒業だと思っています。まあ、その先には初級者、中級者、上級者、etc……と限りなく道は続いてますが……。
もし【ls -sl】で留まっている人がいたら、lsコマンドの1つ先の可能性を試してみてください。

Author: 中林 伸和

1 thought on “Melのlsコマンドの可能性

Comments are closed.