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

Step2-4の最後に関数と「window」という命令のお話をしました。今回はそれを使ってみます。ユーザインタフェースを作成するのです。
早速Mayaを起動して、スクリプトエディタでWindowの意味を調べてみましょう。「Window」とキーで入力して右ドラッグからマニュアルを見ます。

やはり、これはウインドウを作成する命令のようです。「Mel例」というところをクリックしましょう。

これをPymelに変換します。

import pymel.core as pm
window=str(pm.window(widthHeight=(200, 55), iconName=”Short Name”, title=”Long Name”))
# Make a new window //
pm.columnLayout(adjustableColumn=True)
pm.button(label=”Do Nothing”)
pm.button(command=lambda *args: pm.mel.eval((“deleteUI -window ” + window)), label=”Close”)
pm.setParent(‘..’)
pm.showWindow(window)

実行すると、こんなウインドウが出ます。

ボタンをクリックはできますが、「Do Nothing」なので何も起こらないですね。「Close」でウインドウが閉じます。

さて、仕組みを見てみましょう。
window=str(pm.window(widthHeight=(200, 55), iconName=”Short Name”, title=”Long Name”))
いきなり長いですね。でも過去に
X=1
とかやりましたね。Windowという変数を作って、それに値を代入しているようです。
=str()は数値を文字に変換するPythonの命令です。以下など参考にしましょう。
https://www.pythonweb.jp/tutorial/string/index9.html

この行ではMayaのウインドウを生成(データみたいなもの)して、windowという名前の変数に入れているのです。ちょっと判り難いですが、ここでは「そういうもの」で構いません。これは別の機会に改めて説明します。

マニュアルには、pm.windowが「ウインドウを作成する」とあります。()の中はCubeとかでやりました「オプション」です。
widthHeightはウインドウの大きさ、title=はウインドウのタイトルで、iconName=はウインドウの左上のアイコンを決める、ようです。
こうやってマニュアルを見て流れを研究します。

でもマニュアル最初に「作成されたウィンドウは非表示のままになります。最も効率的なのは、ウィンドウの要素を追加してから showWindow コマンドを使用してウィンドウを可視化する」とあります。
一番最後の行でpm.showWindow(window)がありますから、これとセットで使うようです。
次のpm.columnLayout(adjustableColumn=True)はここのマニュアルにないので、再度調べます。

これは縦に並べる命令のようです。「子を」がpm.setParent(‘..’)です。
その下のpm.buttonはボタンを作成する命令で、上のcolumnLayoutがあるので、ボタンが縦に並ぶ、ということですね。(label=”Do Nothing”)はボタンの表示のようです。上のボタンは“Do Nothing”で何も起きないで、下は動作する、ということは、違いを見ると、
pm.button(command=lambda *args: ???)が怪しいですね。???はウインドウを閉じる機能と思われます。そう思ったら、すぐに実験です。
polyCylinder()で円柱が表示されるので、pm.button(command=”pm.polyCylinder()”, label=”Cylinder”)
ではないか?と考えます。“Do Nothing”の行と入れ替えて実行します。


ちゃんとボタンをクリックすると、円柱が出ました!正解だったようです。

このようにマニュアルを見ながらサンプルプログラムの意味を分析すると、学習効果が高いです。面倒とか思わずにすぐにチェックしましょう。
さて、でも円柱出すなら、普通にやったほうが早いですよね?しかし、command=”pm.polyCylinder()”みたいのコマンドは1つしかボタンに入れられません。そこで前回の「関数」が再登場なのです。
前回の
def TreeObject():
 pm.polyCylinder()
 pm.polySphere()
 pm.cmds.move(2, 0, 0)
 pm.polyCube()
 pm.cmds.move(-2, 0, 0)
を実行して関数を定義します。
ボタンを出す命令を以下に変更します。
pm.button(command=”TreeObject()”, label=”Tree”)

ボタンで関数を呼び出せば、長い処理をボタン1つで処理ができる訳です。

いかがですか?次回もUIをやって、オリジナルなMayaツールを作成します。

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

今回は、前回出てきました関数=「def」を命令を理解しましょう。
関数は、

def 関数の名前(引数):
 [タブかスペースを空ける]命令1
 [タブかスペースを空ける]命令2
 [タブかスペースを空ける]命令3
  :
  :
次の命令 [タブかスペースなしで]

というルールです。例えば

import pymel.core as pm
polyCylinder()
pm.polySphere()
pm.cmds.move(2, 0, 0)
pm.polyCube()
pm.cmds.move(-2, 0, 0)

というプログラムを実行すると、以下の結果になります。

当たり前ですが、プログラムは実行した命令の数だけ自動でやってくれます。
それを毎度入力するのは大変です。では関数にします。
import pymel.core as pm
def TreeObject():
 pm.polyCylinder()
 pm.polySphere()
 pm.cmds.move(2, 0, 0)
 pm.polyCube()
 pm.cmds.move(-2, 0, 0)


これを実行しても何も起きません。そこで、
TreeObject()
を実行します。どうですか?ちゃんと同じことを1命令でできましたね?

では少し改造します。
import pymel.core as pm
def TreeObject(x):
 pm.polyCylinder()
 pm.polySphere()
 pm.cmds.move(x, 0, 0)
 pm.polyCube()
 pm.cmds.move(-x, 0, 0)

関数の実行の際に
TreeObject(3)
とします。

どうですか?X=3なので、キューブとボールが±3の位置になりました。「引数」は関数の中に数値などのデータを送り届ける役割をするのです。
ではさらに改造します。
import pymel.core as pm
def TreeObject(x,z):
 pm.polyCylinder()
pm.cmds.move(0, 0, z)
 pm.polySphere()
 pm.cmds.move(x, 0, z)
 pm.polyCube()
 pm.cmds.move(-x, 0, z)
その後、
import pymel.core as pm
for n in range(10):
 print n
 TreeObject(2,n)
を実行します。

こんな感じになりました。for命令は過去にやったと思いますが、
for n in range(10): で下にある行を10回繰り返す、という意味です。
そこにprint nでカウントしているnを表示して、TreeObject(2,n)で関数を呼び出しているのです。
pm.cmds.move(0, 0, z)で、nの値がzに入って移動しながらコピーする、という仕組みです。
でも何かおかしいですね?Zに移動しているのにY方向の上に積み重ねてしまっています。

Display→ObjectDisplay→Local rotationAxisを表示すると、各パーツは横置きなので、Zは上なのですね。
このように関数は長い命令を1つまとめて、プログラムを作りやすく、読みやすくすることができます。

今回はここまでです。

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

まず、毎度おなじみの「便利なスクリプト」ですが、今回紹介するのは「FXFX Real Studio2」です。

 


https://www.highend3d.com/maya/script/fxfx-maya-real-studio-2-for-maya

この「Highend3d」は様々なツールや3D素材をかなり昔から公開(有料販売も)しているサイトです。ダウンロードには無料のアカウント作成が必要ですのでご注意ください。


ダウンロードすると、このようなMELファイルなので、Mayaを起動してMayaを起動して、スクリプトエディタのMEL画面にドラッグ&ドロップし、CTRL+Enterます。

こんなウインドウが開けばOKです。これは初心者がMentalRay(今はMayaに付属しなくなりましたが)とV-rayのレンダリング設定がなかなか勉強するのが難しい時、簡単に設定をしてくれるツールです。
まずこれを使って正しいライトとカメラ、レンダー設定を学んで、自分でアレンジする、という勉強法が近道です。

では、Vrayボタンを押しましょう。もちろん、事前にVrayのインストールは必要です。持ってない方はフリートライアルが30日使えますので、お試しください。

では、「FXFX Real Studio2」の「V-ray」ボタンを押します。
MentalRayがあるMayaの場合は、そちらでどうぞ。以下の手順は同じです。


使い方は簡単!上から順にボタンを押すだけです。
「1」をクリックすると何も起きてないようですが、まずレンダーをVrayに変更します。

「2」で撮影スタジオの背景をモデリングしてくれます。

「3」でライトを2つ設定します。この位置・大きさと明るさ設定が初心者は悩むところです。

「4」でカメラ設定です。

ここでちょっとこのプラグインは不満があります。V-ray専用カメラの設定がないのです。では手動で設定してしまいましょう。カメラのアトリビュートから、「V-ray」→「PhysicalCamera」です。


「5」でレンダー設定の詳細を決めます。タブと項目がたくさんあって初心者はパニックする部分です。

「6」でレンダリングする物体を作成します。Mayaを勉強している人はここに自分の作品をImportしてもいいでしょう。

このモデルにはノンリニアデフォーマのベンドが入っているので、「T」キーでドラッグすると、変形できます。

「7」でこれにV-rayのマテリアルを設定します。レイトレーシングらしくクロムメッキな感じです。ViewPortをV-ray専用に変更してみましょう(これは自動でやってくれません)


「8」でレンダリング開始です。

計算が始まり・・・完成です。

この作業に数分で終わります。このシーンを分析すれば、レンダリングする設定を理解しやすくなります。ぜひお試しください。

さて、この「FXFX Real Studio2」のスクリプトを分析してみましょう。
Visual Studio CodeでこのMELを開きます。

過去にもやりましたが、Visual Studio Codeは「拡張機能」が便利です。検索項目に「Maya」とやると、MEL用のツールがあるのでインストールしておくと便利です。

なんと693行!?ちょっとこれを理解するのは、文系には無理ですね・・・
でも良く見てください。

proc closeWindowMain()
{
deleteUI MainWindow;
}

という個所が見えますね?これをいつも使っている「Mel To Python」で変換してみます。
import pymel.core as pm
def _closeWindowMain():
  pm.deleteUI(‘MainWindow’)

1行目は説明不要のPythonを使う前に設定する命令ですね。
その次の「def」というのがいままでやっていない新しい命令「関数」です。
それと「Window…」とかの命令がありますね。
「FXFX Real Studio2」ではウインドウが開いてボタンをクリックすると処理が行われます。実はGUI(グラフィカルユーザーインターフェイス)を設定しているのです。
スクリプトエディタで以下のプログラムを実行してみてください。
import pymel.core as pm
pm.polyCube()

単にキューブを作る命令ですね。
これをちょっと1行加えて改造します。
import pymel.core as pm
def makeCube():
 pm.polyCube()


注意:defのある行の最後に「:」を忘れずに!実行しても何も置きません。
では、
makeCube()とコピー&ペーストして実行してください。

ちゃんとキューブができました。これが関数の基礎で「新しい命令」を作る機能です。この練習ではキューブ1つですが、defの下にある命令は何行でも実行するのです。
次回からこれを詳しく理解します。