Houdini Crowd System – 001

最近Houdini のCrowd Systemを勉強し始めた。

bandicam 2016-05-15 23-44-25-734

手頃なテストデータがなかったので、今回はUnityちゃんのfbxデータをUnity経由で引っこ抜いて使用してみる。
今日はとりあえず、モーションを読み込むところで終了。

群衆と関係なく、Fetch CHOPでFBXモーションを適用する方法がわかった。

Fetch CHOPで

1 モーションデータの取得先と取得チャンネルを指定。

bandicam 2016-05-15 23-49-57-755

2 モーションデータの適用先を指定。

bandicam 2016-05-15 23-50-01-954

3 これでFetchを有効化

これで、指定したモーションfbxがまとめられたsubnet内のモーションが再生される。

MYAM_genericSelector(仮名)を作り始めました

昔とある仕事場で作成した MYAM_quickSelector2 の後継ツールをQtで作り始めました。

前述のツールの機能に加え、足したい機能は大体以下の様な感じです

・オブジェクトアイコンに任意の画像が使用できる
・オブジェクトアイコンのサイズや形状を自由に変更できる
・Maya/MotionBuilder/Houdiniあたりで共通して使えるようにする
・選択オブジェクトのグループ登録/簡単選択

まだほとんど仮組みの状態ですが、完成したらCreative Crashあたりで公開すると思います。

MYAM_genericSelector_SS001

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を表示することで確認できる

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ループなども、同様に使用できるようだ。

Houdini – Networkノードの使い方考察

Network系ノードの取り扱い

各種チュートリアルを見ていると、objツリーにいきなりPOP NetworkノードなどのNetworkノードを作成して作業を進める例が多いことに気づいた。
しかし、それではノード管理が難しくなりそうに思えた。

そこで、各種コンテキスト内に適したNetworkノードを作成し、必要に応じて別のコンテキストから呼び出すような作り方を試してみることにする。

Network系ノードを使うのはどんな時か?

パーティクルの挙動を一つのノード内で管理する場合などはPOP Networkノードを作成する。

同様に、画像のコンポジットを行うときはImage Networkノードを使用する。

このように、各種コンテキストに特化した処理をパックするために使用する。

共通ルール

各種Network系ノードは、能動的にNetworkノード内からデータを受け取りに行く方法と、受動的に外からデータを受け取る方法があるようだ。

※ただし、Networkのタイプによってはどちらかしか出来ない場合もある。

・能動的にデータを受け取りに行くケース

Network内にデータの入口となるノードを作成し、入力したいノードのパスを指定するパラメータを使用して直接データを受け取る方法

例:SOP Networkの Object Mergeノード

・受動的にデータを受け取るケース

データを受け取りたいNetworkノード外でデータ出力用ノードを作成し、出力先のノードパスを、受け取りたいNetworkノードのものに指定する。

例:POP Networkへの出力 POP Mergeノードと、POP Network内のSourceノード

SOP Network

オブジェクトの変形や参照など、Geometryに対する様々な処理をパックするのに使う。

外部からオブジェクトを受け取る場合は、Object Mergeノードを作成して、Objectパラメータにより受け取りたいオブジェクトのパスを指定する。

受け取ったあとは、通常通り各種ノードによる処理が行える。

POP Network

パーティクルの挙動をパックする。

1 事前にPOP Networkノードをpartコンテキスト内に作成する。

2 POP Mergeノードを作成し、POP PathパラメータでそのPOP Mergeノードから参照したいPOP Networkノードを指定すると、POP Mergeノードは、指定したパスのPOP Networkノードそのもののように動作するようになる。

3 POP Mergeに、いつもPOP Networkノードに接続していたようにオブジェクトなどをコネクトする。

4 指定されたPOP Networkノード内にSourceノードを作成し、Geometry Sourceパラメータを任意のものに指定すると、POP Mergeノードが受け取ったとおりのデータを使用して、POP Networkを使用できる。

CHOP Network

各種チャンネル処理をパックする。

1 CHOP Networkノードを作成する。

2 Channnelノードを作成し、CHOPパラメータに、使用したいCHOP Networkノードのパスを入れる。

3 CHOP Networkノードの中に、GeometryやFetchなどのノードを作成し、各ノードパスを指定するパラメータを使用して任意のノードを入力する。

上記のようなパターンで、実際に処理を行う各種ネットワークノードを孤立させ、任意の場所・タイミングで呼び出すことができるようだ。
VOP Network
VOP Networkは、入力されたデータから、内部に用意されたGlobal Variablesノードのタイプに応じた入力値を使用して処理を行う。
外部から呼び出す際は、VOP SOPノードからVOP Networkのパスを指定する。
例外のネットワーク
SHOP Networkは、マテリアルの作成のみを受け持つので、直接外部からオブジェクトを読み込んで何かするためのノードが用意されていないようだ。