Media & Entertainment Collection and Arnold キャンペーンMedia & Entertainment Collection and Arnold キャンペーン

チュートリアル / DML~CG制作 いろはにほへと~
第9回:Maya Scriptのいろはにほへと~スクリプトであそぼう!~

2016.05.16

  • Maya
  • スクリプト・API
  • チュートリアル
  • 中級者
  • 学生・初心者
  • 映画・TV

エフェクトの小話はただいま絶賛執筆中とのことで一度休憩して、今回はスクリプトの小ネタを紹介していこうと思います。
とはいえMayaで一般的なスクリプト言語PythonやMELなどの書き方は、ヘルプやウェブ上に情報が転がっていますので 少し捻ってPythonとMELの書き方比較、言語の組み合わせなど紹介します。

if文やfor文など基礎の解説は省略してしまうので、この記事を読んで下さる方は、ほんのちょっとでもスクリプトを書いたり調べてきた経験がある方と仮定して、きっと気になっているあの言葉についてのネタを1つ。

「hogehoge」

結構な頻度で見かけて多少気になりつつもスルーしていませんか?
hogeやhogehoge、他にもありますが、これらは「メタ構文変数」と呼ばれるものです。
「これといって特別意味のない変数」のことを指しますが、どんな変数でも良いときに雑に命名すると使い勝手も見た人もわかりにくいですよね。
そこで、なんとなーく皆が「あぁ、ここに変数いれるのね」と察することが出来る案外便利なものです。

スクリプトネタだと絵が寂しいので、スクリプトであそぼう!イメージキャラクター「アソボウズ」を用意してみました。
タイトルキャラは懐かしの(?)Softimageで作られています。

スクリプトで遊ぼうキャラ アソボウズ

さて本題。先ずは基本となるif文とfor文をMEL/Pythonで比較して見てみましょう。

その1 条件分岐

mel


//結果:3が1より大きければprint実行
if(3 > 1)
{
print ("3は1より大きいです。あたりまえだよ");
}

python


#結果:3が1より大きければprint実行
if 3 > 1:
    print "3は1より大きいです。あたりまえだよ"

スクリプトで遊ぼうキャラ アソボウズ

その2 複数の条件分岐

mel


//結果:1でも2でもない
switch(3)
{
  case 1 :
    print "1です";
    break;
  case 2 :
    print "2です";
    break;
  default :
    print "1でも2でもない";
}


python

#結果:1でも2でもない
if 1 == 3:
    print "1です"
elif 2 == 3:
    print "2です"
else:
    print "1でも2でもない"

スクリプトで遊ぼうキャラ アソボウズ

その3 繰り返し(要素の数を指定して処理)

mel


//結果:a  b  c
string $str[3] = { "a", "b", "c" };
for($i = 0; $i < size($str); $i++)
{
  print ($str[$i]);
}


python

#結果:a  b  c
str = ["a", "b", "c"]
for i in range(len(str)):
    print str[i]


スクリプトで遊ぼうキャラ アソボウズ

その4 繰り返し(要素ごとに処理)

mel


//結果:a  b  c
string $str[3] = { "a", "b", "c" };
for( $val in $str)
{
  print($val);
}

python


#結果:a  b  c
str = ["a", "b", "c"]
for val in str:
    print val


スクリプトで遊ぼうキャラ アソボウズ

次にMELとPythonで会話してみましょう。MELにしかコマンドがない場合などで有用です。

その5 MEL上でMELの変数をPythonに渡す / Python上でPythonの変数をMELに渡す

mel


//結果:ほげほげ
string  $hoge = "ほげほげ";
python("hogePy = \"" + $hoge + "\"");
python("print hogePy ");



python


#結果:げほげほ
import maya.mel as mel
hogePy = 'げほげほ'
mel.eval('string $hoge = \"' + hogePy + '\";')
mel.eval('print ($hoge);')


その6 Python上でMELの変数をPythonに渡す

python


#結果:スクリプトを実行したMayaバージョン
import maya.mel as mel
mel.eval("string $mayaVer = `about -v`;")
mayaVer  = mel.eval('string $mayaVerStr = "maya"+$mayaVer;')
print mayaVer


なぜこんなネタを紹介するかというと、スクリプトを書き始める入口は「Maya上で操作したログ」だからです。
最初はログをコピペしそこから処理したい内容を作っていきますよね。
ただMayaの場合はログがMELで出ます。最近はPythonが主流のようですが、MELにしかないコマンドもあったりで紹介したPythonでMELを使うなどといった小技が必要になってきます。
またウェブ上でMELの情報しかなくても、違いが分かっていればMELを元にPythonに翻訳していくことも可能になります。
今回の小技も駆使し、スクリプトが書ける人口が増えたり、作業効率が上がれば幸いです。

DMLでは社内でスクリプトセミナーを行ったり、TAを育てる環境もありますが、まだまだ日本にTA・TDと呼ばれる人材が多くない気がします。これを機に興味を持って頂けたら嬉しいです。
みんなで技術やスクリプトをこねくりまわして遊び倒していきましょう!

最後にDMLのツールを一部紹介。
DMLではクリエイティブ以外の作業は自動化しています。
下図のツールで、アニメーション終えたら必要ファイルを出力しレンダリングシーンを自動生成します。
シミュレーション系、fbx、ジオメトリキャッシュ系、AfterEffects用の出力など、必要そうなものはすべて一括で出し、Maya⇔3dsMaxなどのコンバート作業も不要な状態に構築し出力、レンダリングシーンを構築してくれます。
本業はデザイナーの人がスクリプトを学び、今ではこういったものも半日で作れます。
プログラマーに頼らず、デザイナーでも出来るなんてPythonは学ぶ価値ありですね!

著者

山田 賢一

山田 賢一

株式会社デジタル・メディア・ラボ
TAグループ チーフ