Fabric Engine 1.15.3 プラグインをMayaへ導入する

Fabric Engine 1.15.3 を Maya 2014 64bit(EN) に導入するまでの手順を解説します。


インストール


 ・Fabric Engine公式サイトでファイルをダウンロード

 まずは、Fabric Engineのダウンロードです。
Fabric Engine公式サイトへ行きダウンロードします。

【Fabric Engine】http://fabricengine.com/

 今回は個人的に評価/研究のために使用するので、Evaluation ライセンスでダウンロードしました。


REQUEST LICENSEを押します。
すると、ユーザー情報の登録フォームページが開きます。


・ユーザー情報登録フォームに必要事項を入力

各項目を入力します。

First Name : 姓
Last Name : 名
E-Mail : メールアドレス
JOB Title : 役職
Company : 会社名
WebSite : 会社のWebサイトURL(個人であれば個人サイト)

Please tell us a little about what you
do and how you plan to use Fabric Engine.

Fabric Engineを使用する目的を簡単に記入します。

入力が終わったらSUBMITを押します。
すると、ダウンロードページが開きます。


・ダウンロードページ

使用するOSのブロックにあるDOWNLOADボタンを押し、ダウンロードを開始します。

※当方はWindows版を使用するので、Windows環境での解説をします。


・ファイルの解凍と配置

 ダウンロードした「FabricEngine-1.15.3-Windows-x86_64.zip」を解凍します。
解凍して出来たフォルダ「FabricEngine-1.15.3-Windows-x86_64」を任意の場所へ移動します。
今回は、分かりやすい C:\Program Files 直下に移動する事にしました。


・Maya.envを編集しモジュールパスを通す

Maya.envファイルはMaya2014の場合、以下のパスにあります。

C:\Users\USER_NAME\Documents\maya\2014-x64\Maya.env

上記.envファイルをテキストエディタで開き、以下の行を追加します

MAYA_MODULE_PATH=C:\Program Files\FabricEngine-1.15.3-Windows-x86_64\SpliceIntegrations\FabricSpliceMaya2014SP3;

※各パスは各々の環境に合わせて適宜書き換えてください。
※当方の環境はMaya2014ですので、FabricSpliceMaya2014SP3にします
※良いエディタがない場合、ワードパッドは使わずメモ帳を使用すると安心です。


・MayaにFabric Engine(FabricSpliceMaya.mll)をロードする

 Mayaを起動し、Plugin Managerを開きます。
前の手順でMaya.envに追記された「MAYA_MODULE_PATH」で示されるパスの中にFabricSpliceMaya.mll があることを確認し、Loadedにチェックを入れます。問題なくチェックできればロード完了です。
必要に応じてAuto Loadをチェックしておくと、次回以降のMaya起動時に自動ロードされるようになり便利です。

 緑色の i ボタンを押し、プラグインにより追加されたノードやコマンドを確認してみます。

 以上でMayaへのFabric Engineの導入は完了です。


・ノードを作ってみる

 試しに、Mayaで以下のPythonコードを実行してみます。

import maya.cmds as cmds
cmds.createNode("spliceMayaNode")

 Maya起動後の初回ノード作成時は、Fabric Engineのシステムをロードするためか、実際にノードが作成されるまで結構時間がかかります。

 先ほど作成したspliceMayaNodeノードをアトリビュートエディターで表示してみました。

 実際にコードを編集する際は、Open Splice Editor ボタンで開くSplice Editorを使用することになります。

 具体的な使い方やTIPSは追々勉強しながら書いていこうと思います。

Maya – リソースイメージを抽出

import maya.cmds as cmds
resources = cmds.resourceManager()
for resource in resources:
  saveDirPath  = "D:/MYAM_temp"
  saveFilePath = "%s/%s" % ( saveDirPath , resource )
  cmds.resourceManager( saveAs=(resource , saveFilePath ) )

ツールのGUIを作ってる時、Mayaのリソースイメージをそのまま流用したいことがある。
わざわざキャプチャしたりするのは面倒なので、上記のコマンドでごっそりイメージファイルを抜き取って、必要なアイコンを使ってしまおう。


こんな感じで簡単にアイコンを抽出出来た。

Python SOPでデフォーマーを作ってみる

リクエストがあったのでVOP SOPのような処理をPython SOPで行う方法を書いてみる。
とりあえず、ノード構成はこんな感じでやってみる。

■Python SOP

myDeformerはPython SOP
Python SOPはデフォルトの状態だと以下のようにコードが記述されている。

###########################################
node = hou.pwd()
geo = node.geometry()

# Add code to modify contents of geo.
# Use drop down menu to select examples.
###########################################

 

hou.pwd()はPython SOP自身のノードオブジェクトを返す。
Node.geometry()は自身に入力されたhou.Geometry型のジオメトリオブジェクトを返す。

geometryの中にはPointやEdgeやPrimitive型のオブジェクトが含まれており、実際に形状や色を変更する際は、これらのコンポーネントオブジェクトを取得して操作する。

■コンポーネントの取得

■Pointリストの取得
points = geo.points()

■Primitiveリストの取得
prims = geo.prims()

それぞれのコンポーネントに一律の処理を行うには?

 

・単純にforループで回す
for point in points:
  position = point.position()

for prim in prims:
  verts = prim.vertices()

・iterPointsを使う(generatorの使用、こっちのほうがメモリ効率良さそう)
for point in geo.iterPoints():
  position = point.position()

 

■pointを移動してみるサンプル

###########################################
import math

node = hou.pwd()
geo = node.geometry()

# Add code to modify contents of geo.
# Use drop down menu to select examples.
for point in geo.points():
  initPosition = point.position()
  pointIndex = point.number()
  radian = math.radians( pointIndex )
  displacement = hou.Vector3( [ 0 , math.sin( radian * 10 ) , 0 ] )
  newPosition = initPosition + displacement
  point.setPosition( newPosition )
###########################################

 

 

・Gridを変形

・Sphereを変形

■各オブジェクトのリファレンスマニュアル

各オブジェクトの使い方は以下のマニュアルを参照すべし

・hou.Geometry
http://sidefx.jp/doc/hom/hou/Geometry.html

・hou.Point
http://sidefx.jp/doc/hom/hou/Point.html

・hou.Prim
http://sidefx.jp/doc/hom/hou/Prim.html

Pyro Effects

基本的な作成方法

シェルフのPyro FXタブでFlamesなどを選択。
Fluid化したいオブジェクトを選び、Enter

AutoDopNetwork

Pyroに限らず、DOPをシェルフから自動で作成すると、AutoDopNetworkノードが作成される。
中を開くと大量のノードネットワークが作成されていることがわかる。
各種ノードに対する理解が浅いうちは表層のノードのみを使うようにしたい。

Flames作成直後のAutoDopNetwork

20140712_01_0

pyro(Smoke)

個々のPyroオブジェクトの動作を決定するノード
Guidesタブで見た目の調整用表示切り替えなどを行う。

resize_container(Gas Resize Fluid Container)

Fluidの状態に合わせてサイズが可変のFluidコンテナ

source_fuel_from_sphere_object1(Source Volume)

Fluidボリュームの発生源となるオブジェクト形状を入力するノード

pyrosolver(Pylo Solver)

煙と炎のソルバ。
smoke solverノードもあるようだが、pyroは上位版と言えるノードらしい。(Smoke Solver+燃焼モデルの複合ノードとのこと)
Pyroに関わる計算の精度など、大域的な調整を行う。

Pyro Effectの基本プロセス

20140712_01_1

20140712_01_2

20140712_01_3

Fuel[Fuel]:燃料

燃料の特性、材質

Burn:燃焼

燃料を炎と煙に変換するためのフィールド

Flames[Heat]:炎

Smoke[Density]:煙

煙。炎を正しくレンダリングする際に必要。

Temperature[Temperature]:温度

燃料の発火点や炎や煙の立ち昇るスピードなど。

Buoyancy:浮力

Expansion[Divergence]:拡大/発散

炎と煙の拡散の度合い

燃焼のプロセス

発火は、燃料の温度(Temparature)が燃料の発火点を超えた時に発生する。

発火点/燃焼
Fuel * BurnRate

煙の発生度合い
burn * soot rate


Maximam of heat , burn

燃焼による拡散の度合い
burn * gas_release * burn_influence

燃焼による温度変化
burn * heat output * temp_burn_influence

燃焼による燃料の減少
burn * ( 1 – fuel inefficiency )

各パラメータの関連(制御に使うパラメータ)

Smoke(Density)
Fuel/Burn Rate/Smoke Amount

Flames(Heat)
Fuel/Burn Rate

Temperature
Fuel/Burn Rate/Flame Contribution/Burn Contribution

Expantion(Divergence)
Fuel/Burn Rate/Gas Released

Pyro Solverノード 主なSimulationパラメータ

Buoyancy Lift
炎や煙の上昇の度合い

Burn Rate
燃えやすさ

Temperature Output
燃焼することで発生する熱、この数値が高いと炎や煙がより早く上昇する。

gas_released
年常時に発生するガスのスケール係数。
燃料が気化する速度?
この数値が高いとより炎が広がって燃える。
このパラメータの影響は、Divergenceを表示することで確認できる

Matchmover 2014 – マッチムーブ覚書

・Load Sequence

自分はEOS KISS X4を使用している。
他のデジタル一眼レフでも同様の設定でいいはず。
古いカメラだとフルHDが24fpsでしか撮影できなかったりするので、適宜フレームレートを合わす。

interace : None
Framerate : 29.97

20140622_01_0

・一発目のテストトラッキング

まずは、ザックリとした設定でトラッキングを行う。
足りないトラッカーは後に手動で追加する。

20140622_01_1

・Delete Soft Tracks : On
・Automatic 2D Tracking : On
・Solve for Camera : Off

■Automatic 2D Trackingの設定

Track Using

  • Color

Min Track Length

  • 長めに75フレームくらい。これで、かなりはっきり検出できたトラックのみが生き残る。
    とにかくたくさんトラッキングして、後にClean Assistantを使用して生存時間が短いトラックを削除することもできるけど、意外と時間がかかるので、最初から長い生存時間のトラックのみを活かすようにするほうが楽だと思う。
Features
  • Sensitivity:空など、微弱なノイズがある部分にトラックが検出されない程度がベター
  • Density:最大

ここで重要なのは、有効になりうるたくさんのトラックを検出し、生存時間の長いトラックのみを残すこと

Displacement Range

  • Short 1%(カメラ遅)〜 3%(カメラ速)
  • Long 5%(カメラ遅)〜 10%(カメラ速)

ステディカムなどでとる映像は割とカメラがゆっくり動くので、上記設定の最低値を使うのが良さそう。

ここまで出来たら、まずはオートトラッキングを実行。
結果が出たら、トラックの整理を行っていく。

トラックの整理

・ノイズが乗りすぎたトラックの検出と削除

20140622_01_2

とりあえず、いくつかのブロックに分けて各トラックを選んでみると、明らかにノイズを含むトラックがわかる

20140622_01_3

こういったトラックは迷わず削除する

後に原点を置きたいような、重要なトラックがノイズを含んでいる場合、トラック選択後に修正を行うフレームを挟むように時間を変更し、それぞれでF6キーを押してIntermediateキーを打っておく。こうすることで、範囲内の時間でトラッカーをマニュアルで設定しても、範囲外のトラックが削除されないので便利。

あとは、ひたすらcommand+←→で時間を移動しつつ、正しい位置にトラックを置いていく。

小技として、末端側のフレームから一フレームずつ時間を遡ってマニュアルでトラッキングしていく方法もある。

ある程度整理できたら、何度か再生して各トラッカーの動きが破綻していないことを確認。

トラックの追加

座標軸の指定や距離計測のためのトラックが欲しい場合などは、任意の点を追加でトラッキングする。

20140622_01_4

この例では、以下のような設定をするために追加トラッキングする。
Track01>Track02:X軸+距離の指定
Track02>Track03:Z軸

カメラの設定

20140622_01_5

20140622_01_6

カメラのプロパティ

  • Filmback
    使用しているカメラの仕様書などを見て、CMOSセンサーのサイズを指定
    その後、AdvancedタブでPixel Aspectを1.0にし、Fixedモードにする。
    こうすることで、CMOSセンサーの上下余白を切り取ったFilmBackの高さが自動入力される。
  • Focal Length
    デジタル一眼レフなどを使用している場合は、レンズに記載されている焦点距離の値を入れる。
    ちょっとこの辺りの35mmフィルム換算の焦点距離を計算していれる方がいいかもしれない。
    ステディカムを使用する場合は、焦点距離を変化させながら撮影することは不可能なので、焦点距離を固定することになる。中央付近の青いラインの書いてあるボタンを何度か押して、RangeをFixedに。FとInitにカメラで設定した画角を入力。

Solve For Cameraを実行

待つだけ。
終わったら、ビュー左上の3Dボタンをおし2D表示に変更、タイムコントローラ左のカメラボタンを押すと、ビューがカメラから見たものに変わり、ダミートラッカーが表示できる。

20140622_01_8

20140622_01_9

20140622_01_7

ショートカット「3キー」でトラッカーの表示状態を変更。
後に座標系を指定するときなどはコーンを非表示にしとくと楽。

座標系と基準距離の設定

20140622_01_10

Coordinate Systemsフォルダ右クリックからNew Coordinate Systemを選択し、新たな座標系を作成する。

Coords01などを選択すると、以下の様なマニピュレータが表示される。

20140622_01_11

それぞれの球をドラッグして、原点にしたいトラックや原点と各軸を結ぶトラックの上に持って行くと、面倒なく設定ができる。

ある程度配置できたらCoordsのプロパティにある以下のボタンを押して変更を適用する。

20140622_01_12

Coordsの設定

20140622_01_13

  • Origin
    原点になるトラッカー名
  • Distance
    直下のFromで指定する2トラック間の距離。
    正確に入れると後々楽できる。
  • Axis1/2
    任意トラッカー間でどの軸を表すか決定する。
    このへんは手動で変更するのは面倒臭いので、前述のマニュピレータを使う方法で処理するのがいい。
  • Apply Coordinate System
    行った変更を確定する。

確認

ここまでで、ある程度マッチムーブが完了している。
3D Sceneを右クリックし、任意のオブジェクトを追加するなどしてマッチムーブが成功しているか確認する。

20140622_01_14

この時点で、全くずれていなければOK
でもまずそんなに一発でうまくいくことはないので、主に、背景と座標軸のズレ修正など、微調整が必要になる。

ただし、Matchmover内で精密な微調整は出来ないので、他のDCCツールにカメラデータをエクスポートして、各DCCツール内で微調整を行う。

このやり方は後日書くかも。

Houdini – Group

オペレータのGroupパラメータ(ターゲットを直接指定)

Houdiniでは、何かしらの処理を行う際、処理を行うノードの中で処理対象を明示的に指定する事ができる。これにより、後から処理対象を変更することが容易になっている。

例えば、Polygonオブジェクトのいくつかの面を選んでからPoly Extrudeなどの処理を実行すると、Poly ExtrudeのGroupパラメータに、処理対象となるPrimitive番号がリストアップされ、そこで挙げられた番号のPrimitiveに処理が行われていることがわかる。

20140518_01_2

20140518_01_0

20140518_01_1

3つのPrimitive選択後に、シェルフからPolyExtrudeを実行した後のPoly Extrudeノード。
Groupパラメータに3つのPrimitive IDが記入されていることがわかる。ここに、新しい番号を記入すると、そのアイテムにも同様の処理が行われる。

ビューポート内でTABキーを押し、直接オペレータを作成した場合も同様に、ターゲットのIDがGroupパラメータへ自動的に記入される。

Network View内でTABキーからオペレータを作成する場合は、Groupパラメータへは自動的に記入されない。

IDを直接指定する場合、上流にトポロジを変更するノードが追加されて各IDが変化した時、予想外のターゲットに処理が行われることになるので注意。

IDの直接指定は極力使うべきではない。

最後のノードで別のターゲットに対し続けざまに処理を行う

例えばPoly Extrudeを行ったあと、別のPrimitiveを選択し、Enterキーを押すと、選択したPrimitiveに対し、Poly Extrudeノードが追加で作成される。

Primitive選択後に Qキーを押しても同様

処理対象の再選択

選択状態を間違えて新しいオペレータを作ってしまった場合は、まず、オペレータを選択後に画面左の選択ボタン右クリックし、Reselect For Current Toolを選択。

20140518_01_3

20140518_01_4

こうすると、一時的にオペレータが無効になり、処理ターゲットを選択するモードに移る。

その後、任意の対象を選び直し、Enterキーを押すことで選び直した対象がGroupパラメータに改めて指定される。

Group SOP

Groupノードは、これまで見てきたような、何らかの処理の対象となるIDリストに対し、任意の名前をつけて、管理を助けるために使う。

それ以外にも、任意のバウンディングボックス内に含まれるIDリストや、任意軸に対して一定角度内の法線を持つPrimitiveリストを自動的に検出してグループに取り込むなど、多様な自動グループ作成が行えるので、非常に便利。

Group SOPに格納されたアイテムに処理をするには、以降のオペレータでGroupパラメータに使用したいグループ名を入力する。

Houdini – PBRの基本

Phisically Based Renderingの準備

・Mantraノードを作成

Properties -> Renderタブ -> Redering Engine パラメータを PBR系のものに指定。

ただのPBRはレイトレースを使用するPBR。
Samplingの値など、Micro PolygonのPBRとは、値の扱い方が変わるので注意。

・カメラを作成

レンダリングのため、カメラを作成する。

・ライトを作成

PBRシェーダ

見たところ、Material Paletteに標準で登録されているマテリアルは、ほとんどがMaterial Shader Builderにより作られている。
また、マテリアル内部ではSurface Modelを使用していることが多いので、だいたいPBRにそのまま使用できるようだ。

試しにGlassなどを球体にアサインしてレンダリングすると、それだけでもそこそこにリアルだったりする。

20140518_02_0

部分レンダー

Render Viewで、部分的にレンダリングしたい範囲をShift+ドラッグ

Inspect individual pixel values

Render View内でIキーを押すと、ピクセル解析ツールの有効をオン・オフできる。

20140518_02_1

ValPixel values in 0-1 form.

Raw

Raw pixel values, as they are stored (0-255 for 8 bit values, 0-65535 for 16 bit values, and so on).

HSL

Hue, saturation, and luminance of the pixel.

Pix

Pixel coordinates of the mouse pointer.

uv

UV (0-1) coordinates of the mouse pointer.

LUT

Only displayed if the Inspect LUT option on the Correction tab of the display options window is on. Shows a reverse mapping of the value through the LUT. This is useful for Cineon LUTs, to see the original Cineon numbers.

SpecularとRefrection

見たところ、Houdiniの物理ベースシェーダのパラメータは、ゲーム業界で読んでいるパラメータとは違う名前を使用している場合があるようだ。

・RefrectionとSpeculer

Refrectは反射全般をくくる言葉。この中に、表面の滑らかさや反射率などを決めるSpecularパラメータを含んでいる。

・Specular Intensity

素材そのものの反射の強さ。
メタル系の素材は非常に高く、それ以外は非常に低い値。

・Specular Angle

材質表面の粗さ。
表面が滑らかであるほど低く、ザラザラしているほど高い。

・Specular Anisotropy

異方性反射の方向。
Specular Angleによってぼやける反射光が跳ね返りやすい方向を決める。

PBRでは、これらの質感の特性を現実世界の物体に合わせ、正確な特性値(反射の強さやもともとオブジェクトが持っている色(アルベドカラー、表面の目に見えないレベルの細かな凹凸など)を使用し、現実世界のものの見え方をシミュレートする。

そのためには、シェーダーだけでなく、ライト(カラーや強さを表すルーメン)やカメラの絞り、露光など、レンダリングに関わる全ての要素をPBR向けに最適な設定で使用する必要がある。

明るすぎるピクセルの補正

レンダリングすると集光現象などの結果、非常に高い輝度値を持つピクセルが生成されることがある。

20140518_02_3

これを補正するためには、Color Limitパラメータを使用して各ピクセル内の値の上限値を決める。

20140518_02_2

※やり方が悪いのか、効果が出ない・・・バージョン違いによる差が本当に厄介。チュートリアルで示されたオプションが無かったり、手動で追加しなければいけないはずなのにすでに追加されていたりする。

ノード名もかなり変わっているし、結構辛い。

Houdini – Particle Smoke

Particle制御

・Velocity、Accelerationノードなど

sourceノードの下流にVelocityやAccelerationノードを接続すると、その値が有効になる。
これは、上流でPointノードなどを使用して指定した速度などを上書きする。

・Propertyノード

上記ノードと同じように、Particleのスケール変更や質量を変更するには、Propertyノードを使用する。

Houdini – VEX フロー制御

比較演算子

Compareノードを使用する
input1とinput2をどう比較するか内部で指定。結果はbool値で出力される。

if

If Then Blockノード

内部に、Subnet Inputノードがあり、このノードにIf Then Blockのconditionパラメータに入力された値が渡される。

計算の結果は、Subnet Outputノードの _condition または、任意の値をnextに任意の数の値をコネクトし条件ごとの出力を行うことができる。

20140518_03_0

上図の例では、If Then Blockに入力された値が6より小さい場合は Color(0,0,0) を出力。6以上の場合はColor(1,1,1)を出力する。

Whileループなども、同様に使用できるようだ。