文系デザイナーのためのmaya MEL/Python基礎の基礎⑫

では、前回の続きで「if」をMayaでやってみましょう。

前回のコメントアウトしたMaya命令をALT+4で元に戻して、最後のifの処理内に
「#m プレーンを表示する」というコメントを入れます。

MayaでPlaneプリミティブを出す命令をMELで探します。


例によってコンバータでPython化します。

pm.polyPlane(cuv=2, sy=10, sx=10, h=1, ch=1, w=1, ax=(0, 1, 0))
pm.cmds.scale(5, 1, 5, r=1)
pm.cmds.move(9, 0, 0, r=1, ls=1, wd=1)

これをPython IDLEへペーストします。move命令のYをtyに変更します。
では、それをMayaへコピペして実行してみましょう!

あれ?・・・・なんか大変なことになってます!でも各階のフロアはできてますね。
実はこれはダメなんです。ちょっとイジワルしました。ごめんなさい・・・
下の箇所を見てください。

「コピーする」という命令を書きましたね。この場合のコピー元は、上にあるCubeです。しかし、今回はその下のif命令でPlaneを作ってしまったので、コピーする対象が変わってしまった、なのでこういう結果が出るのです。
でも、ちゃんと螺旋状にPlaneが並ぶのも美しいじゃありませんか・・・

では。ちゃんと直しましょう。

どこが変わったかよく見てください。コピーをやめて毎回Cubeを作成しているように改造しました。
「#m コピーする」を削除し、上にあったCubeを作成して移動、グループ化に入れ替えただけです。

では実行してみましょう。

できました!

これで完成でもいいのですが、上にCubeが2個中途半端に作られています。
階段なのですから、段数をしていするより、階数の方が人間側としてはやりやすいですね。このように使いやすさも追求すべきです。

★階段は30度づつ回転している→360/30=12で12回の繰り返しで1階分

であれば、下のように書き換えます。

kaiとdanという変数を作り、kaiを12倍した値をdanに入れます。
1足しているのは0から始まるからです。復習ですが、プログラムでは数学でやったように、右の計算結果を左に入れる、という方式なので注意です。

では、実行すると・・・

いい感じですが、3階なのに4階めの床が出てしまっています。
またもバグ(エラー)・・・落ち着いて考えてみましょう。

プログラムは上から下に処理しますね?
その前までの処理は、
 1.ブロックを作って、Y移動、Y回転する
 2.tyを0.5倍する
 3.ryを30倍する
 4.もしryが360の倍数なら、床を作る
 5.繰り返す
どうですか?何かおかしいですよね?
ryを30倍してから、床を作る確認をしています。ということは、
30倍増えた値でifが判断するので間違った結果になるのは当然です!

 1.もしryが360の倍数なら、床を作る
 2.ブロックを作って、Y移動、Y回転する
 3.tyを0.5倍する
 4.ryを30倍する
 5.繰り返す

が正しいですね。では書き換えてみます。

実行すると・・・

今度は正しい結果になりました!おめでとうございます!

このようにプログラムはエラーとの戦いです。コンピュータに正しく指示しないと、思った通りに動いてくれないのです。
焦らず冷静に流れを読み返して修正していけば、必ずできるようになります。

では今日はここまでです。

 

文系デザイナーのためのmaya MEL/Python基礎の基礎⑪

さて、前回の9回目の続きです。
だいぶ難しくなったと思いますが、実はプログラムの基本動作としては4つのことしかないのです。

1.プログラムは1行ごとに書き、それは上から下に順に処理される
2.数値や文字を入れる変数に値を入れたり出したりして記憶する
3.回数を決めて、同じ処理を繰り返す
4.数字や文字を見て判断して、処理の流れを変える

どうですか?そんなに大変ではないことが解ったと思います。前回までで既に1~3までやっているのです。
で、今日は4の「判断して」をやります。

例えば「螺旋階段の各階ごとにフロアのキューブを追加する」というのを作るとします。
繰り返しますが、プログラムの勉強をしてはダメです。あくまで3DCG制作であることを前提に考えてください。

まずは、Python IDLEです。⑨の最後のプログラムをOpenで開きます。



これはMayaの命令を入れたので、もうIDLEでは動きません。
そこで、Maya命令がある行で「ALT+3」を押します。

すると、コメントアウト(実行しない行)にしてくれるのです。元に戻すには「ALT+4」です。
試しにF5で実行すると正しく動きます。

では一番下に以下のコメント入れます。

これをPythonプログラムにします。ここで大切なのはいきなり本題に入るのではなく、できるところから実験していくことです。階段は一段づつ上がればいいのです。頑張ってハイジャンプすると危険ですよね?それと同じです。

まず、以下の青い箇所を入力してみます。同時に繰り返し命令のforを15にします。
こうしないと1階分もできないからです・・・

新命令「if」の登場です。ifはその後に判断する条件を入れます。「==」は「左右の値が等しい時」という意味です。
この場合、回転角度ryが360度に一致したら、という意味です。
ifが確認したら、その下の行のインデントされたものを実行します。これは何行あっても構いません。print “?階”は、単に「?階」と表示するだけです。

ifが角度ryが360度に一致しない場合は何もしません。この場合はforの中にあるので、繰り返しをするだけです。
では実行してみましょう!


ちゃんと「if」が仕事してますね!?でもこれでは720度、1080度とか増えた場合、対応してくれません。「360の倍数」という条件を作らないといけません。

そこで、こう書き換えます。

「ry%360」はryを360で割った余りを計算する式です。一般の数学では出て来ない演算の記号です。
余りがゼロなら360の倍数であることが判断できますね?

0/360=0・・・余り0
30/360=0・・・30


330/360=0・・・余り330
0/360=0・・・余り0
390/360=1・・・余り30

720/360=2・・・余り0

さらにprintを書き換えてtyはコメントアウトし、trだけifのインデントの下にカット&ペーストしています。

print ry/360+1,”階” とは、「ryを360で割って1プラスしたものを計算して表示」、という意味です。
その後に「階」を連続して表示します。forは40階にしています。
実行すると・・・


このようになります。
ちゃんと螺旋階段の角度をコンピュータが判断して階を理解していますね。

今日はここまでです。次回、これをMayaで動かしましょう。

文系デザイナーのためのmaya MEL/Python基礎の基礎⑩

この連載も10回になりました。
まだまだ面白くなってないかもしれませんので、ちょっとづづ便利なMELやPythonの機能でMayaを便利にする小話も挟んでいきます。

Mayaを使っての作業で必ず出るのが、「ヒストリ削除」と「トランスフォームのフリーズ」ですね。それぞれをシェフルに登録して「編集」でMELコマンドが判りますね。


「ヒストリ削除」=DeleteHistory
「トランスフォームのフリーズ」=FreezeTransformations
になります。
さらに中央にピボット移動は「CenterPivot」


シーンを別名保存は「SaveSceneAs」(まんま、ですね)

このように命令を調べるのは簡単です。普段はこの4つを順にやっていると思います。それを1ボタンにすれば楽ですね。では、これら全てスクリプトエディタにコピペします。
(コピペは賛否両論ありますが、タイプミスは初心者の挫折になるので良しとします)
DeleteHistory;
FreezeTransformations;
CenterPivot;
SaveSceneAs;

シェルフに登録します。

これで、このボタン1つで、「ヒストリ削除・フリーズ・ピボット中心をして、別名保存する」を1手でやってくれるのです。

「面倒だなあ」と思うことあれば、すぐにやってみることができるのがMELの便利な所です。デザイナーらしく、仕事を効率よくするツールをデザインするアイディアを出すというのも面白いことだと思いませんか?