選択した物になにかしたい

「今、自分が何を選択しているのか知りたい」

こんな風に単体で書くと、青春の一コマのような感じですね。
でっかい声で遠い雲に聞いてみたりするもんです(・・・誰もわからないって・・オマケに近頃は捕まりま~す)

自分が何を選択しているのかをMelで知りたい場合は「ls」というコマンドに「-sl」というオプションをつけます。(たまに-lsと書いてしまうこともあります)
何かを選択している状態でcommandLineに「ls -sl」と打って実行してみましょう。
resultが返ってきていますね?

ちゃらららっちゃっちゃ~ん「○○はlsを習得した、選択したものがわかるようになりました」

「○○はlsを唱えた」
「こんぼう なべのフタ たびびとのふく」

う~ん、この呪文を使っても何も効果なし・・・と。

「選択しているものがわかってもどうしようもない」ということが判ります。
選択しているものが判って更に何かを行うことで「選択的に何かの処理を行える」と・・・。

で「何か」をするにはどうしたら良いんでしょう。

いつもオペレートしている内容をさせればいいのです。
たとえばscaleだとかmoveだとかrotateです。
でも、選択しているすべてのモデルを動かすだけなら手でも出来ます。
じゃ~一つずつ値を変えていくとかならどうでしょう?
10個とかなら手でもいいですが、100個、1000個、10000個はどうですか?
・・・これだけの量だと諦めが付きますね、さぁ!MelScriptでやりましょう!

さっき「ls -sl」を覚えたので、これも唱えてみましょう。
でもってMaya特有のループ命令を加えて一気に片付ける方法を作っちゃいましょう。
ただし、同じことをすべてのオブジェクトにしてしまっては意味が無いので、乱数を加えて見ます。

例1
for($work in `ls -sl`){
 scale 1 `rand 1 2` 1 $work;
}

選択されていたオブジェクトのYスケールがランダムになったかと思います。

では細かい説明です。

for($work in `ls -sl`){
この行は複数の命令が圧縮されています。
この命令は$workという変数に、選択されていたオブジェクトの名前を順番に代入して、終わりになったらループを終了させるという内容です。
めんどくさいので「選択されたものを順繰りに$workに入れてくれるのね」と覚えてしまいましょう~とりあえずわ。

scale 1 `rand 1 2` 1 $work;
乱数を加える命令がscaleと組み合わされていますが、それ以外はいつもやっている作業と同じですね。

これだけのことなのですが、これによってありとあらゆることができるようになります。
scale 1 `rand 1 2` 1 $work;
ここの部分の後にどんどん付け足していけば、自分のMelScriptが出来てゆきますし、「ls」の魔法の後に「"*Poly*"」と書けば「Poly」という文字列を持つオブジェクトだけ教えてくれたりします。
(オプションを書き換えるだけでいろいろなことが出来ますので色々やってみてください)

また、この魔法に組み合わせて使うと有効な「setAttr」という関数があります。
様々なアトリビュートを書き換える関数です。

たとえばさっきのscriptは一部をsetAttrで書き換えられます。

例2
for($work in `ls -sl`){
 setAttr ($work+".scaleY") `rand 1 2`;
}

同じ動きをしますね?、この魔法のいいところは一部を書き換えれば別のアトリビュートにも使えるということです、moveやらscaleやらrotate・・・たくさんの魔法はいらなくなってしまいます。

例3
for($work in `ls -sl`){
 setAttr ($work+".scaleX") `rand 1 2`;
}

yに変わってxのscaleが変わりましたね。

例4
for($work in `ls -sl`){
 setAttr ($work+".translateX") `rand 1 2`;
}

今度はx方向にmoveしました。

こうやって実験してみたら「ls」と「setAttr」を「for」で回すことで色々出来るような気になっちゃうじゃないですか。
え~実際のところいろいろ出来ます、楽しんでみてください、苦しまないでください。

苦しみそうな場合はコメントつけてくださいませ。

カテゴリー: ちょいテク系 パーマリンク

選択した物になにかしたい への1件のフィードバック

  1. 健太郎 より:

    選択した物になにかしたい勉強になりました。ここでの応用で指定した文字列からオブジェクトを選択ってのをつくってみました。もっともっと書いて本出しちゃってください。string $work1[] = `ls "*1*"`;select $work1;ちなみに作ったMELは↑1が名前についているオブジェクトを選択します。

健太郎 への返信 コメントをキャンセル