KINGSGLAIVEセミナーおさらい プロテス – サンプルhiplcファイルあり

先週と同様、Indyzone主催のHoudiniセミナー「KINGSGLAIVE FINAL FANTASY XV メイキングストーリー」のおさらいをしていました。

というわけで、今日はプロテスのエフェクトです。

今回もサンプルファイルを付けてみました。
興味のある方はぜひ覗いてみてください。

■ダウンロード(One Drive)
MYAM_imitation_FF_KINGSGLAIVE_Protes.zip

zipファイル解凍後に出てくるHoudiniProjectフォルダにSetProjectしてからシーンを開いてください。


■シーンファイルに関して

うろ覚えではあるのですが、セミナーの説明では、@Cdアトリビュートを利用してプロテスエフェクトの「生成、再生、破壊」の振る舞いを決める部分で、ベースになるプロテス障壁の形状を分流してそれぞれを個別のグループに入れながらPaintSOPなどで@Cdの設定を行い、最後にMergeSOPで各データフローを統合してから、最終的に使用しないグループに含まれる成分を削除するという解説だったように思います。

今回は、この部分を極力簡略化し、カラーを独自アトリビュートに変換したあとでAttributeTransferSOPでレンダーモデルに転送する方法を試してみました。
空間転写は処理負荷が高いので、もう少し上手に軽い方法を使えばよかったと思っていたりします。


何か間違いなどあればご遠慮無くツッコミください。
とても喜びます。

KINGSGLAIVEセミナーおさらい ワープエフェクト – サンプルhiplcファイルあり



三連休でやっと時間が取れたこともあり、少し前に行われたIndyzone主催のHoudiniセミナー「KINGSGLAIVE FINAL FANTASY XV メイキングストーリー」のおさらいをしています。

というわけで、とりあえず手始めに今日はワープエフェクトに関してです。

今回もサンプルファイルを付けてみました。
完全な再現とまでは行かなくとも、ボリュームと移流の扱い方に関しては、だいたい再現できていると思います。
興味のある方はぜひ覗いてみてください。

■ダウンロード(One Drive)
MYAM_imitation_FF_KINGSGLAIVE_WarpFX

※ノード名がセミナー中の説明と合ってなかったので、修正しました

zipファイル解凍後に出てくるHoudiniProjectフォルダにSetProjectしてからシーンを開いてください。


概要

ワープエフェクトは、5つの単純な要素を組み合わせて作ります。

  • Spark:火花
    荒いボリュームからパーティクルへ力を渡し、移流して動かします
    その後、TrailSOPなどを使用して火花っぽい見た目を作ります。
  • Ash:灰
    Spark同様に移流してパーティクルを動かします。
    その後、灰オブジェクトをパーティクル上にコピーします。
  • Fire:小さな火の玉
    Spark同様に移流してパーティクルを動かします。
    その後、あらかじめ作成しておいた火の玉シミュレーションのキャッシュをパーティクル上にコピーします。
    その際、キャッシュのスタート時間をランダム化して見た目にばらつきをもたせます。
  • Steam:体から立ち上る蒸気
    Sparkなどで使用する荒いボリュームを複製後に編集し、高解像度化したボリュームを蒸気として使用しました。
  • Crystal:体から飛び散るクリスタル片
    初速と重力によって動く単純なパーティクルにクリスタル片オブジェクトをコピーして作ります。

一見複雑なワープエフェクトは、実は単純な要素を組み合わせて作られています。


シーンファイルについて

スケール調整の手間を省いたので、現実スケールに対しシーンスケールが大きめになっているため、ダイナミクスオブジェクトの動きが若干遅く感じられると思います。


何か間違いなどあればご遠慮無くツッコミください。
とても喜びます。

Houdini – 基本的なデータの取り回し方(サンプルファイルあり)

Houdiniを触り始めた頃、アトリビュートや変数のデータの取り回し方がわかりにくいと感じていました。
中でも特にローカル変数の挙動がよく理解できずに、正しく値を操作できても何だか狐につままれたような気持ちになっていました。

最近はそのようなこともなくなり、意図したとおりに値を操作できるようになってきたので、実践している値の取り回し方を備忘録的な意味で書いてみます。

今回もまたちょっとしたサンプルファイルをつけてみます。

■ダウンロード(One Drive)
MYAM_attributeAccess_exsample


Houdiniで扱うデータのスコープ

Houdiniの中で主にユーザーが直接扱うデータには、以下のようにいくつかの種類とスコープがあります。

  • グローバル変数
  • ローカル変数
  • パラメータ
  • アトリビュート

Houdiniに触り始めた頃、わかりにくいと感じていた部分が、ローカル変数とパラメータとアトリビュートの相互の関係性です。

※グローバル変数は、環境に依存しすぎる気がするので、最近でも極力手を付けないようにしています。(パス文字列の簡略化などに使えばとても便利ですが)
よって、今回の記事では扱いません。


なにがわかりにくかったのか?

さまざまなチュートリアルを見ると、Attribute Create SOPを使い、アトリビュートを作成すると同時にローカル変数も定義して、下流のパラメータエクスプレッションの中でローカル変数を参照して処理をするやり方が散見されます。

これは勝手な印象ですが、特に古いバージョンのチュートリアルで顕著だったように思います。

チュートリアルの後、自分なりに実践してみてうまく値を扱えない時に感じたのが

  • データフローの上流で作ったはずのローカル変数が下流で参照できない・・・
  • と思ったらなぜか使える場合があったりする・・・
  • オペレータの性質から想像するに、マニュアルを引くまでもなく明らかに使えそうに思えるローカル変数が使えない・・・
  • オペレータのリファレンスマニュアルに記載されてるローカル変数が使えない・・・
  • アトリビュートを直接操作したい・・・ローカル変数を参照できない理由がわからない・・・まるで異次元に迷い込んだようだ・・・地獄だ・・・

といったあたりです。
平たく言うと

「ローカル変数が値の操作を混乱させる諸悪の根源」

のように感じていたわけです。


デジタルアセットとローカル変数の罠

また、このローカル変数というやつは、デジタルアセット上で使用できないという、恐るべき制約も手伝って、更に話をややこしくしています。
※ColorSOPのマニュアルに記載あり。
もしかしたら、全デジタルアセットの性質ということではなく、ColorSOPに限った話かもしれません

例えば、Color SOPはデジタルアセットで、Colorパラメータ内ではローカル変数を使用できません。上流で独自アトリビュートを作成し独自のローカル変数を作っても参照できません。

紛らわしいことに、そもそもColorSOP自体、上流で@Cdアトリビュート操作があることを想定していません。あくまでも@Cd操作の開始点として使用する前提です。

このような場合、Color SOPではなくPoint SOPを使用し、その中でローカル変数を参照することで問題なく@Cdアトリビュートを直接操作できます。

このような紛らわしさもまた、一つの地雷と言えそうです。


ローカル変数よ、さようなら

ではどうすればいいのか。

結論を言うと、Attribute Wrangle SOPを介してアトリビュートを直接管理や操作をするのがベストだと考えています。

最近のバージョンでは、VEX周りがかなり進化しています。
Attribute Wrangle SOP内だけでなく、各オペレータのパラメータエクスプレッションでも、VEXのように@記法で直接アトリビュートを参照したり、それができない場合でもpoint関数などを使ってアトリビュートを直接参照する事ができます。

値の管理と操作を、一貫したVEXの世界で行えるのは、この上なくシンプルで理想的です。
今のところこの方法で困ったことは一度もありません。

よって、もう、ローカル変数の出番は無いとすら思います。


まとめ

というわけで、今考えているわかりやすくデータを取り回すための方策は以下の通りです

  • アトリビュートの作成にはAttribute Wrangle SOPを使う
  • アトリビュートの操作にはAttribute Wrangle SOPやAttribute VOP SOPを使う
  • アトリビュートの参照は@記法を使って直接参照する
    またはpoint関数などのアトリビュート値を直接取得する関数を使う
  • ローカル変数は使わない
    $CEXなど便利なローカル変数はあるが、同様のVEX関数もあるのでそちらを使うようにする。

これが同じ悩みを持つ方の一助となれば幸いです。

何か間違いなどあれば遠慮なくツッコミをください。

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

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