ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

MELを配布する時のプロシージャについて

MELを自分以外の人に配る時に行っておくと良いことの備忘録。

ウインドウを作成して各ボタンに色々と機能を割り当てたMELを作ったとします。
その際にプロシージャとウインドウ作成の構成を以下のようにしました。

グローバルプロシージャAを定義
 命令を色々記述

グローバルプロシージャBを定義
 命令を色々記述

グローバルプロシージャCを定義
 命令を色々記述

グローバルプロシージャD(MEL名と同じもの)を定義
 すでに同じウインドウ名 のウインドウがある場合に削除する
 ウインドウをウインドウ名付きで作成する
 カラム(columnLayout)を作成する
  ボタン1で命令”A”を実行
  ボタン2で命令”B”を実行
  ボタン3で命令"C"を実行
 ウインドウを表示

Dを実行


そしてウインドウ作成のグローバルプロシージャ名とMELの名前を同じにします。
columnLayoutを利用してるのは単に手始めに触るのに気に入ったタイプだからです。
具体的にどんな記述かはこちらの記事に書いています。

MELを配布したら、マイドキュメントのMayaのスクリプトフォルダに放り込んでもらいます。
そしてMayaを起動したらスクリプトエディタにMEL名(=グローバルプロシージャ名)をコピペしてもらい、そのままシェルフに登録してもらったらOKです。

MELスクリプトのある場所を参照する

MELスクリプトと同じ場所にあるファイルを参照したい場合の備忘録。
ちょっと手こずったので記事にしておきます。

例えばMELスクリプトと同じ場所にあるテクスチャをマテリアルで指定したい時に、テクスチャ名だけで指定するとプロジェクト/sourceimage直下を参照してしまいます。

しかしスクリプトフォルダはマイドキュメント以下にあるのでユーザーによってパスが変わってしまいます(Users/Document/ユーザー名/maya‥という感じ)。

そんな時には「MAYA_SCRIPT_PATH」を使うと良いようです。

下記の例は前回の記事「MELでシェーダーを作成 2」の一部になります。

//スクリプトフォルダのパスを取得して変数「vfxTexPath」に代入
$vfxTexPass= `getenv MAYA_SCRIPT_PATH`;

//スクリプトフォルダ直下のテクスチャ「sampleTex.png」を設定
setAttr -type "string" VFXfile.fileTextureName ($vfxTexPath + "/sampleTex.png");


これでうまくいきました。

他にもっと良い方法があればコメント頂けると嬉しいですっ。

MELでシェーダー作成 2

前回の続き。

MayaのMELで汎用マテリアルを1クリックで作成したい時の備忘録。
まずはLambertシェーダーを作成して、予め用意してあるテクスチャを適用する内容。

//ネームスペース"VFX"がすでにある場合はメッセージのみ表示
if(true == `namespace -exists "VFX"`)
{
print "ネームスペースVFXはすでにあります";
}
else
{
//サンプルテクスチャシェーダを作成して"sampleTex.png"を割り当てる
shadingNode -asShader lambert -name VFXlambert;
sets -renderable true -noSurfaceShader true -empty -name VFXlambertSG;
connectAttr -f VFXlambert.outColor VFXlambertSG.surfaceShader;

//スクリプトフォルダ内の「sampleTex.png」をテクスチャとして適用
shadingNode -asTexture file -name VFXfile;
$vfxTexPath= `getenv MAYA_SCRIPT_PATH`;
setAttr -type "string" VFXfile.fileTextureName ($vfxTexPath + "/sampleTex.png");

//テクスチャフィルタリングを「オフ」にする
setAttr "VFXfile.filterType" 0;

//必要なノードを繋げる
shadingNode -asUtility place2dTexture -name VFXplace2dTexture;
connectAttr -f VFXplace2dTexture.coverage VFXfile.coverage;
connectAttr -f VFXplace2dTexture.translateFrame VFXfile.translateFrame;
connectAttr -f VFXplace2dTexture.rotateFrame VFXfile.rotateFrame;
connectAttr -f VFXplace2dTexture.mirrorU VFXfile.mirrorU;
connectAttr -f VFXplace2dTexture.mirrorV VFXfile.mirrorV;
connectAttr -f VFXplace2dTexture.stagger VFXfile.stagger;
connectAttr -f VFXplace2dTexture.wrapU VFXfile.wrapU;
connectAttr -f VFXplace2dTexture.wrapV VFXfile.wrapV;
connectAttr -f VFXplace2dTexture.repeatUV VFXfile.repeatUV;
connectAttr -f VFXplace2dTexture.offset VFXfile.offset;
connectAttr -f VFXplace2dTexture.rotateUV VFXfile.rotateUV;
connectAttr -f VFXplace2dTexture.noiseUV VFXfile.noiseUV;
connectAttr -f VFXplace2dTexture.vertexUvOne VFXfile.vertexUvOne;
connectAttr -f VFXplace2dTexture.vertexUvTwo VFXfile.vertexUvTwo;
connectAttr -f VFXplace2dTexture.vertexUvThree VFXfile.vertexUvThree;
connectAttr -f VFXplace2dTexture.vertexCameraOne VFXfile.vertexCameraOne;
connectAttr VFXplace2dTexture.outUV VFXfile.uv;
connectAttr VFXplace2dTexture.outUvFilterSize VFXfile.uvFilterSize;
defaultNavigation -force true -connectToExisting -source VFXfile -destination VFXlambert.color; window -e -vis false 
createRenderNodeWindow;
connectAttr -force VFXfile.outColor VFXlambert.color;
}


 次に選択中のモデルに上記マテリアルを割り当てる内容。

//サンプルテクスチャシェーダーを割り当てる
sets -e -forceElement VFXlambertSG;
//ディスプレイをテクスチャシェーディングに変更
DisplayShadedAndTextured;


この2つの記述それぞれにプロシージャ名を定義してボタンに割り当てればOKです。
ウインドウ作成とプロシージャの構成をどんな風にしているかはこちらの記事に書いています。
一応Maya2014と2016で動作を確認しました。

ただ‥テクスチャフィルタリングを「オフ」にする部分が自分の環境では動作しましたが、他人の環境では「オフ」に設定されるのにテクスチャがボケたままという状況になりました。
なぜなのかご存じの方いらっしゃいましたら教えてください。。

ちなみにこのMELで使用しているテクスチャはMELと同じ場所に放り込んでおきます。
そしてMELと同じフォルダ内のテクスチャを参照する記述についてはこちらで補足しています。

当方、MEL歴は累計5日ほどなので間違いも多数あるかと思いますが、ツッコミ所がありましたらコメントなどで教えて頂けると嬉しいです。

ヘッドホン買い替え

長年愛用していたSONYのヘッドホン「MDR-Z300」がぼろぼろになってきていたのでようやく買い替えました。4000円ほどだったか‥記憶があやふやですが、低価格な割に音も悪くなく、軽さとフィット感も申し分無かったので大変お世話になってました。

今回購入したのも軽くてフィット感が良いものをと思って探していたのですが、装着した時に丁度良かったのでこちらに決めました。audio-technicaの「EARSUIT ATH-ES500」です。

ブルートゥースのワイヤレスヘッドホンばかりが並んでましたが、ボタンが色々付いていてごちゃごちゃして感じたので旧来のものにしました。おっさん思考になってしまってるのかしら。

ZBrushのワークショップに参加してきました

この土日はZBrushの初心者向けワークショップに参加してきました。

講師はPuniNUKO先生。

《内容》
1.球体からこねこねして顔の作成(ダイナメッシュ)
2.Zsphereでベースメッシュ(素体ポリゴンモデル)の作成
3.サブディビジョンの意味
4.ポーズ
5.体のスカルプト
6.その他、最低限の基本機能
おまけで若干インターフェースのカスタマイズとリファレンス画像の貼り付け方とカメラの使い方など

《スケジュール》
1日目 12:00~17:00
2日目 10:00~17:00

‥という感じでした。
教材用にプリントアウトされたテキストも頂きました。

モチーフは実在の人物が良いということだったので、彫が深くて作り易そうな外人さんでプロポーションが良い人にしようと思いMiranda Kerrに。
形状を認識しづらくて難しい。テクスチャを貼りたくなってくる。

f:id:moko_03_25:20151220203313j:plain

胴体は気持ち良くスカルプトしたくてややがっしりタイプの人を参考に作っていたのでMirandaご本人とは似ても似つかない感じになりました。。
↓ Shift + S でスクリンショットをZBrush上でそのまま背景にすることができるの便利!

f:id:moko_03_25:20151220203314j:plain

楽しくて時間泥棒ですね‥。
一応ラフにポーズも付けてみましたがこちらはとりあえずやったという感じです。

Mayaとの連携や手の作り方、ポリペイントなど広く説明が及んでおり、2日間の中でかなり盛り沢山の内容となっていました。また、榊馨さんのブログ「SAKAKI Workshop」からdownload可能なブラシと榊さんのスカルプトのタイムラプス動画の紹介や、実際におすすめのブラシを使っての説明もありました。

また来年に中級編の開催も考えているとのことなので、次回も参加しますっ。
(初級編もさらに何度かやるそうですよ)

PuniNUKO先生とHiROさん、参加されたみなさま、おつかれさまでした!

帰宅後に評価版入れてちょっといじってみました。

f:id:moko_03_25:20151220234429j:plain

Spotlights機能を使ってポリペイントすれば写真を貼り付けて確認しながら形状を修正できますね!

f:id:moko_03_25:20151222021757j:plain

Billowy Smokeを使った煙のチュートリアル(後半)

■Introduction to Houdini - PyroFX for FumeFX Artists

前半に引き続いて後半。

 

手順についてのメモ(後半)


23:50
pyrosolver1ノード上で中ボタンを押して情報を表示
Containsの項目は40個のオペレーターを内包していることを表している
※Houdini15では表示は密度と温度の2つのみ

ボクセルサイズがpyroノードの設定と違うのはresize_containerでリサイズしているから
※Houdini15ではresize_containerノードが繋がっているままでも内容に違いが出ず

25:55
pyrosolver1ノードのTimescaleの項目
※値を大きくするとシミュレーション結果の再生速度が速くなり、小さくすると遅くなる
Temperature Diffusion(テンパーチャー ディフュージョン/温度の拡散)の項目
Cooling Rate(冷却速度)の項目 温度がどれくらいで冷めるか
Viscosityビスコーシティ/粘度)の項目
Buoyancy Lift(ボーヤンシー/浮力)の項目
Buoyancy Dir(浮力が作用する方向)の項目
※+と-両方向へ作用させることは可能?

28:00
Combustion(コンバッション/燃焼)タブ
Enable Combusionで燃焼を有効にする

Shape(形状)タブ
Dissipation(霧散?)
※低い値(0.1)を入れて他の項目をOFFにすると拡散せず先端がダマになったまま立ち昇り、高い値(0.75)を入れると早めに拡散して尖った形状になる
Disturbance(ディスターバンス/妨害/騒乱)
大きな塊の中でさらに小さく乱流させて形を崩してくれる
Turbulence(乱流)

Windows標準の「Snipping Tool」を使ってスナップショットを撮って比較
Turbulenceのみ有効の時とさらにDisturbance(0.5)を有効にした時
「見た目で分からないかも知れないが僕を信じろ」

32:55
Disturbanceタブ>Block Size
外のシェイプを崩してくれる

Disturbanceタブ>Field to Disturb
Velocityでは加速度に対して、Temperatureでは温度に対して乱流させる

小さいディティールはDisturbanceで加えられる

34:50
Sharpening
形状がシャープになりふんわりしたところは消える
タバコの煙はシャープにしないとそれっぽくならない
爆発の時もシャープにするために使う

Shredding(シュレッディング/破砕)
炎の時に使うので今は説明しない

Confinement(コンファインメント/閉じ込める)
回転をブーストする 巻き具合の計算を強くする
あまり強くすると計算が遅くなるので気をつける
マイナスの値を入れると計算が速くなる

36:20
エディタ左下の本のアイコンを右クリック、Flipbook with New Settings...を選択
Render Flipbookダイアログが表示される
エクスプレッションでスタートフレームとエンドフレームを指定するよう入力されている

タイムスライダ右端のアイコンをクリック、Global Animation Optionsが表示される
Endフレームを100に短く変更してApplyを押して閉じる
Render FlipbookダイアログでAcceptを押すとシミュレーション開始と同時に録画され、MPlay Flipbookウインドウが開いて確認ができる

ガンマを調整
※色調整の項目はプレビュー画面上で右クリック>Color CorrectionをONで表示される
※File>Export>Video for Windows 64bitでAviを選択して動画を出力可能
 背景が透過された状態で出力できる

38:45
pyrosolver1ノードのパラメータのAdvancedタブでUse OpenCLにチェック

sidefx.jp | Houdini 15 システム環境

以下、上記サイトより引用。

グラフィックカード
OpenGL ハードウエアアクセラレーションは、最適なパフォーマンスを得るのに必須です。
Houdiniでは Direct3D のサポートは不要です (ビューポートとインターフェイスは全て OpenGL を使用)。

 

GPU による高速化と OpenCL
Houdini は、いくつかのグラフィックカード上で GPU を使用して Pyro FX および流体シミュレーションの劇的なパフオーマンスとスピード向上を図ることができます。
この性能を利用する為には、OpenCL に対応した GPU が必要です。Nvidiaでは、Tesla や Quadro x000 シリーズ (FX シリーズではなく Quadro; 600, 2000, 4000, 5000, 6000) や GeForce 400 又は 500 シリーズ。
AMD では、FirePro カード (FireGLではない) や Radeon 5000, 6000 及び 7000 シリーズの GPU 搭載型が必要です。Intel のグラフィックスは、現在 OpenCL に対応していませんが 、CPU ベースの CL ライブラリを所有しており、将来 Houdini と動作するようになるかもしれません。


オブジェクトレベルに戻ってpyro_simノードでReset Simulationをクリック

AMD Radeon R9 200 がおすすめ
マシン環境は速いものにした方が良い
全部のノードでOpenCLを使ってる訳ではなく使うべきところで使っている

42:00
レンダリングするためにはカメラを作る必要がある
ライトを作成した時と同様にCtrlを押しながらシェルフのCameraを選択
今のビューポートの視点に合わせてカメラを作成する
※そのままCam1の視点の状態でカメラの設定を調整すると良い

パラメータエディタのViewタブ>Focal Length焦点距離)とAperture(焦点から枠までの距離)を設定
※Apertureの項目にカーソルを載せてF1を押すとヘルプが表示され、Focal LengthとApertureの関係図が確認できます

Near Clippingを0にしてニアクリップを無くす
Enable Background Imageのチェックを外して背景を無くす
Resolutionで出力解像度を決める

ライトと同様にRockしてカメラを動かしてアングルを決める
レンダービューでカメラを指定

43:00
各ウインドウのタブ上で右クリックするとタブの内容を他のものに切り替えられる
シーンビュー上部のタブからRender Viewを表示
カメラはcam1を選択
レンダラーの設定がまだ無いのでレンダラーを選ぶ項目はグレーアウトされている
※Renderボタンでレンダリングすると標準のレンダラーであるMantraのノードが自動的に作成される

ネットワークエディタ上部のパス上を左クリックしてchに切り替え
Channel Operatorはアニメーション関連のグループでAnimation Editorで編集が可能

imgのネットワークではレンダリングしたものを表示する

ネットワークをoutに切り替えてTabメニューでMantraを作成
outのネットワーク上でレンダラーを作る
Mantraノードを選択してパラメータエディタのCameraでcam1が選択されているのを確認
obj表示に戻してcam1の名前を変えるとMantraでの指定にもちゃんと反映されている

45:15
Render Viewを表示すると先程グレーアウトされていた項目にMantraノードのパスが指定されている
Renderボタンでレンダリングを実行
Previewにチェックを入れているとレンダリング経過が粗い状態から表示される

MantraノードのRenderingタブ>SamplingPixel Samplesでサンプル数を上げると再度レンダリングされて先程より精細になる

Render View下部のカメラアイコンでスナップショットを撮ってレンダリング結果を見比べられる

ローレゾでハイレゾっぽく作る方法もあるけどそれも上級者向けになる


以上で終了です。

Billowy Smokeを使った煙のチュートリアル(前半)

■Introduction to Houdini - PyroFX for FumeFX Artists

こちらのチュートリアルをやってみました。
同じ動画をvimeoでもアップされています。

煙や炎を学びたい人には最初にやるのに良いかも知れません。

 

はじめに


手順をメモっています。
和訳は大事そうな部分をバイリンガルな友人に聞きつつ行いました。
あとは想像なので間違っている部分もあるかと思いますが、その際にはそっとコメントなどで教えて頂ければ嬉しいです!

手元での使用バージョンはHoudini15
動画内のバージョンと食い違いがある部分は、Houdini15での表記に差し替えて書いています。

やたらカチカチと大きなクリック音がするのと、途中で犬の悲鳴に似た鳴き声が聞こえるのが気になって仕方ありませんが‥

 

手順についてのメモ(前半)


0:45
ビューポートの説明
ネットワークエディター上でのTabメニューで Geometry ⇒ 立方体を作成(XYZの文字入り)
スペースキーとマウスでカメラ操作が可能な点について解説
Sキーで選択ツールON

Geometryノードをダブルクリックして中に入る
1つだけ存在するノードを消し、代わりにSphereノードを作成
※デフォルト設定だとシェルフで作成したプリミティブは最上層のオブジェクトレベル/Sceneに作成されますが、Tabメニューから選べば直接現在の階層内に作成できます

2:05
ノード上で中ボタンを押すと情報が表示される
sphereノードはプリミティブ数が1つであることが確認できる

パラメータエディターでPrimitive TypeをPolygonに変える
Frequency(周波数/頻度/回数)を6にして分割数を増やす
ワイヤーフレームが表示されていないならShift + Wで表示できます

2:41
Edit>Preference>Hip File Options
Houdiniでの単位をここで変えることが可能
※デフォルトで長さの単位はメートル / 重さはキログラム

3:30
TabメニューでTransformを作成
左クリックでノード同士を繋げられる
ノード左右のフラグの解説
TabメニューでBox ⇒ 立方体を作成
sphereノードのテンプレート表示を解説後、Boxは消去

4:43
TransformノードのUniform ScaleXYZ均一にスケール調整
Iキー(IN?)でノード内の階層に入る
Uキー(UP?)でひとつ上の階層に上がる
オブジェクトレベルに戻ってノードの名前をemitterに変更

5:30
球体モデルを選択した状態で、シェルフのPyro Fx>Billowy Smoke(大波の煙)を選択
すると球体から煙を発生させるための膨大なネットワークが自動的に構築される
※選択していない場合は発生源となるオブジェクトを選択してEnterを押すよう促されます

ネットワークエディタ上でLキーを押すとノード整理
シーンビュー上でSpace + Fで選択中のオブジェクトにビューがフォーカスする
Space + Gでも同様 ※違いは何‥?
右クリックメニューで選択関係のショートカットを確認できる

7:28
アニメーションを再生すると煙が発生する
フラットな見た目になってしまっているのでライトを足す

7:40
シェルフLight and Cameras>Area LightをCtrl押しながらクリック
※Ctrlを押しながらだとシーンビューの視点の位置&角度でライトが作成されます

8:05
もう1つエリアライトを設置
色を水色に変える
Intensity(ライトの強さ)を弱くする

8:25
ビューポート右上の「no cam」からLook Through Light>arealight2を選択
ライト視点モードになる
しかしビューの視点を動かすとライト視点モードが解除されてしまう
ビューポート右端のバーのカギアイコン(Lock Camera)をクリックしてビューをロックする
するとライト視点モードでライトの位置を自由に調整できる
最後にロックを外せばOK
ライトの強さを微調整

9:28
再度アニメーションを再生してみる
※タイムラインで青くなった部分は計算済み
バウンディングボックスは煙の発生に応じて自動的に大きくなり指定サイズで止まる

9:50
emitterノード内(ジオメトリレベル)に入る
Smooth Shadedに変えるとバウンディングボックスが消え‥ません!(Houdini15)
グリッド表示をOFFにする
表示をHide Other Objectに切り替えると選択しているノード以外のオブジェクトの表示が消える
transform1ノードを選択して再生すると煙が広がらないのが確認できる
transform1の表示フラグをONにすると球体を確認できる
transform1より下のノード群はBillowy Smokeを追加した際に生成されたもの
create_density_volumeを選択すると球状に煙が発生しているのが確認できる
ノード上で中ボタンで情報を見て密度の値など確認

11:22
最上層(オブジェクトレベル/Scene)に戻る
emitterノードは名前を変えたが、ノードを選択してパラメータエディタの左上に本来の名前(Geometry)が表示される
arealight1ノードの正体は"Light"でpyro_simは"DOP Network"であることが分かる
DOP(ドップ)はDynamicsOperatorの略で、パーティクル、リジッドボディー、クロス、ファー、流体などを扱う

11:55
pyro_simノード内に入る(DOP/Dynamicsレベル)
pyroという名前のノードを選択すると正体は"Smoke Object"であることが分かる
そこでTabメニューからSmoke Objectを作成して、同じものであることを確認、消去

12:35
resize_containerの中に入る ※グレーアウトして触れなくなっている
今度はpyroの中に入る
"Empty Object"であるemptyobject7ノードを確認
pyroノードは標準機能として用意されたデジタルアセットであることの説明
※デジタルアセットとは調整用のパラメータを表に出して機能化したノード群のこと

13:08
pyrosolver1ノードは巨大なデジタルアセットである
見易くするためにネットワークエディタ右上の最大化ボタンを押して最大化して確認
"advect_fuel_modulate_heat"のノード群は燃料の移流や熱の制御を行う
"shape_operators_and_forces"のノード群は形状と力の制御を行う
"sharpening_dissipation"のノード群は尖らせながら細かく千切れさせる(?)
"combustion"はノード群は燃焼の制御を行うが、今回は炎を発生させないので説明しない

最大化を一旦戻す
パラメータエディタのタブ上で右クリックするとタブを切り替えられるリストが開く
もう一度ネットワークを最大化
最大化している時でもパラメータを変えたい時はB?(V?)キーでパラメータエディタを右上に表示できる(Houdini15では常に表示される仕様?)

15:18
TabメニューからPyro Solverノードを作成、こちらもデジタルアセット
フラグについて解説

ノードの入力ポートは左から右へ順に計算され、ノードの繋がりは上から下に順に計算される
※Houdiniでは計算のことをCookと言うようです
入力ポート上で中ボタンを押し情報を見ると何を入力するポートなのかが分かる
1つめ「Object」は発生させるオブジェクトを入力する(?)
何かオブジェクトを繋げる必要がある
2つめ「Pre-solve」はsolvingする前の計算
3つめ「Velocity Update」は加速度の更新
4つめ「Advection」(移流)はボリュームに対して乱流の追加効果を加える
ボリュームじゃないとダメ
5つめ「Sourcing(post-solve)」は発生するボリュームを入力する

最上層のemitterノード内の最後に繋いでいるNullノードに「OUT_density」と入力されている
※こちらを変数として扱いPyro Solverのソースとして参照している様子

19:00
resize_containerノードの説明
Reference Fieldの説明
Paddingでパーティクル同士の距離やボリュームの量を調整
Field Cutoffの説明

21:04
pyroノードのTwo Dimensionalにチェックを入れると二次元の流体になる
Division MethodをBy SizeにしてDivision Sizeを変えるとコンテナの分割数が変わる
Non SquareにするとDivisionsの値通りにXYZそれぞれ分割される
X Axis、Max Axisの解説
Max Axisは最も値の大きい軸をUniform Divisionの数で分割し、他の軸はそれに合わせる(XとZは5なので50分割される)
※確認する際は現在のフレームを先頭にしないと反映されないかも

23:10
中ボタンで情報を表示
デジタルアセットにバージョンがありOperator typeの項目でバージョンが確認できる
また、参照しているスクリプトのパスが確認できる


後半へ続く!

MELでシェーダー作成 1

ディフューズカラーに指定のテクスチャを貼っただけの基本的なLambert ShaderをMELで作成する際の記述をメモっておきます(当時ググってもピンポイントでは出てこなかったので)。

実際の中身はこちら。
vfx_tex.png」というテクスチャをあらかじめ用意しておいて、それを使用するようにしています。

shadingNode -asShader lambert -name VFXlambert;
sets -renderable true -noSurfaceShader true -empty -name VFXlambertSG;
connectAttr -f VFXlambert.outColor VFXlambertSG.surfaceShader;

shadingNode -asTexture file -name VFXfile;
setAttr -type "string" VFXfile.fileTextureName "vfx_tex.png";

shadingNode -asUtility place2dTexture -name VFXplace2dTexture;
connectAttr -f VFXplace2dTexture.coverage VFXfile.coverage;
connectAttr -f VFXplace2dTexture.translateFrame VFXfile.translateFrame;
connectAttr -f VFXplace2dTexture.rotateFrame VFXfile.rotateFrame;
connectAttr -f VFXplace2dTexture.mirrorU VFXfile.mirrorU;
connectAttr -f VFXplace2dTexture.mirrorV VFXfile.mirrorV;
connectAttr -f VFXplace2dTexture.stagger VFXfile.stagger;
connectAttr -f VFXplace2dTexture.wrapU VFXfile.wrapU;
connectAttr -f VFXplace2dTexture.wrapV VFXfile.wrapV;
connectAttr -f VFXplace2dTexture.repeatUV VFXfile.repeatUV;
connectAttr -f VFXplace2dTexture.offset VFXfile.offset;
connectAttr -f VFXplace2dTexture.rotateUV VFXfile.rotateUV;
connectAttr -f VFXplace2dTexture.noiseUV VFXfile.noiseUV;
connectAttr -f VFXplace2dTexture.vertexUvOne VFXfile.vertexUvOne;
connectAttr -f VFXplace2dTexture.vertexUvTwo VFXfile.vertexUvTwo;
connectAttr -f VFXplace2dTexture.vertexUvThree VFXfile.vertexUvThree;
connectAttr -f VFXplace2dTexture.vertexCameraOne VFXfile.vertexCameraOne;
connectAttr VFXplace2dTexture.outUV VFXfile.uv;
connectAttr VFXplace2dTexture.outUvFilterSize VFXfile.uvFilterSize;
defaultNavigation -force true -connectToExisting -source VFXfile -destination VFXlambert.color; window -e -vis false
createRenderNodeWindow;
connectAttr -force VFXfile.outColor VFXlambert.color;


ノードの何の出力を何の入力に繋げたらいいのかは、まずハイパーシェードで実際にマテリアルを作ってみてシェーディングネットワークを開けば確認することができます。
それを参考に記述したらいけました。。

こちらの記事でもうちょっと補完しています。

MELの最初のステップ

Mayaでスクリプトがやりたいと思った場合に、MELPython(maya.cmnd か pymel)・その他‥と色々種類がある訳ですが、とりあえずやってみたいと思った時にはまずMELを触ってみてすんなり入れたので、ハードルの低さからまずMELをやってみるのが良いのかなと思いました。

そしてスクリプト言語に慣れてきたところで、Pythonに手を出すのが良いように思います。
Pythonなら様々なアプリケーションで利用できたり記述がシンプルだったりします。
(そういう自分はPythonを始めて少し経ったあたりで今は止まってしまっていますが)

で、完全に記憶が喪失してしまわないうちにMELについて書いておきたいと思います。


◆何から手をつければいいのか?

こちらですが、Mayaのシェルフによく使う機能を登録したりしますよね。
それをシェルフではなくMELでパネルを自作してボタンを並べて、ボタンを押せば機能が実行されるショートカット集を作るところから始めるのをおすすめします。

f:id:moko_03_25:20151115094934p:plain

上図のような感じでウインドウを作成してボタンを並べて、各ボタンに好きな機能を割り当ててオリジナルのツールを作るというのが、すぐに役に立つ上に見た目が立派なことからもモチベーションが上がるので、手始めにやってみるのに良いと思いました。

そして作ってるうちに色々と欲が出てきます。ボタンにアイコン画像を貼り付けてみたいとか、数値入力させたいとか、その数値をスライドバーで変えるUIにしたいとか。その方法を調べながら拡張していくことで楽しく覚えていくことができます。


◆実行したい機能のMELの記述を確認するには?

スクリプトエディタを開いておいて、何か機能を実行するとログでMELが確認できるので、それをコピペすればOKというのがMEL初心者の定番なのかなとは思いますが、それだと色々と余計なログが沢山流れて「どこを切り取って使えばいいんだ?」と混乱したりします。

そこで、まずはMaya上部のメニューから好きな機能をシェルフに登録して、登録したシェルフの編集画面を開いてMELの内容を確認することをおすすめします。

メニューから機能を選択する際にCtrl + Shiftを押しながら選択するとシェルフに登録できます。
そのシェルフを右クリックで開くとMELでの最もシンプルな命令文が確認できます。
これをスクリプトエディタにコピペすればOKという訳です。

それでうまくログを取得できない時は、MELに欲しい機能を一旦実行してからUndoすると、今取り消しした命令のシンプルな記述がログとして流れたりするのでそれを利用することもできます。


◆ウインドウはどうやって作るの?

「MEL ウインドウ」「MEL ボタン」「MEL レイアウト」といったあたりの単語で検索すると丁寧に解説されている記事が色々と出てきます。ここでもいくつかご紹介。

ウインドウの記述についてはこちら。
How to make a window ( MEL I - 08AD )

ボタンの記述についてはこちら。
Layout 1 ( MEL I - 08AD )

ウインドウのレイアウトについて。
Digital Matrix Maya - MEL Quick Reference


◆オススメのチュートリアル

まずこちらのMEL入門動画をやってみることをオススメします。
日本語での解説付きで敷居も低く、初めて実戦するのにとても良い動画だと思います。

www.youtube.com


◆MELとpythonの違い

こちらの記事が分かりやすく説明されています。オブジェクト志向も非常にくだいて説明されていて、こういう説明ができる人になりたいなあなどと思いました。

こちらもメモとしてペタリ。

BISHAMONの最初のステップ

BISHAMONの体験版をインストールしてみたは良いけど、エフェクトを作るのは全く初めてで「手始めに何を作ればいいのか?」と思った人には、まずは3Dモデルは用意せずに2Dの絵素材だけを用意してアニメーションを作ってみることをオススメします。

絵素材は、BMPPNG・TGAで保存できればどんなペイントソフトで用意してもOK。
PNGなら透過させたまま作成できますし、TGAならアルファチャンネルを持てます)


例えばPhotoshopで背景レイヤーを削除して、白い玉と白いリングの2つの画像を作成したものが下図になります。こちらをPNGで保存します。

f:id:moko_03_25:20151114015214j:plainf:id:moko_03_25:20151114015215j:plain

それからBISHAMONで読み込んで、白い玉が拡大して消えると同時に今度は白いリングが現れて消える‥というアニメーションを付けてみたのがこちら。

f:id:moko_03_25:20151114015216g:plain

Rootノードにクアッドエミッターを2つ追加したシンプルな構成になっています。

f:id:moko_03_25:20151114015217j:plain

さらに、ヌルエミッターを追加して親にして2つのエミッターを1セットにした上で、周辺に散らばるように沢山出してみます。
色のアニメーションも加えてみたものがこちら。

f:id:moko_03_25:20151114015218g:plain

ノード構成では、ヌルエミッターが親になっています。

f:id:moko_03_25:20151114015219j:plain

さて、これでは面白味が無いのでハートの画像を追加で作成してみました。
テキストツールで「はーと」と入力して記号に変換すると簡単に作成できます。

f:id:moko_03_25:20151114023609j:plain

2Dの絵素材でも、ビルボードさせずに3D空間上で回転させることもできます。
そうするとハートがくるくると回転するアニメが加わって豪華になりました。

f:id:moko_03_25:20151114023610g:plain

1つクアッドエミッターを追加して構成はこのような感じになりました。

f:id:moko_03_25:20151114023611j:plain

BISHAMONゲームエフェクトデザイン入門に収録しているこちらのデータも、中央に1つお椀型のモデルを置いてる以外は全て2Dの絵素材です。

f:id:moko_03_25:20151114112103g:plain

‥というように、2Dの絵素材だけでも立派な3Dエフェクトは作れます。
まずはそこからスタートしてみてはいかがでしょうか!

具体的なBISHAMONの操作方法やエミッターの設定手順については公式のチュートリアルビデオをご覧頂ければと思います。