この記事では、SideFX社のTOPネットワークを利用して都市を構築するワークフローのサンプルを紹介します。【4/23追記あり】
今回は、事前に区画割りを画像として作成しておき、それを利用してHoudiniで都市を構築します。
区画割の画像はこちらよりダウンロードができます。(SideFX社のページになります)
こちらのファイルにはHDAが含まれておりますが、こちらのHDAは建物構築のサンプルアセットとなりますので、
今回のワークフローではこのHDAは利用しておりません。
また、弊社の方でこちらのhipファイルを作成しました。よろしければご確認ください。
今回のサンプルhipファイル:building_test.hip
4/23追記:サンプルのhipファイルが正常に動作しない場合は、以下の点をご確認ください。
- hipファイルがtops_lesson_startフォルダ直下にあることを確認してください。
(解凍手順によってはtops_lesson_startフォルダが2重に作成されている場合があります。) - hipファイルと同じ階層にtexフォルダが存在し、中にcitygrid.jpgがあることを確認してください。
- TOPノード一番下のbuilding_mergeノードがクックされて、ワークアイテムが作成されていることを確認してください。
- building_mergeノード内のワークアイテムが選択され、黄色になっていることを確認してください。
- OBJ階層のwork_item_viewer内のFileノードにディスプレイフラグが立っていることを確認してください。
- 同Fileノードにて、Reload Geometryボタンをクリックしてください。
- [スペース]+[H]キーを押してホームグリッドに移動してください。
以下が作成手順になります。
- ダウンロードしたZipファイルを展開してからHoudini17.5を起動し、
File-> SetProject で展開したプロジェクトフォルダ「tops_lesson_start」をプロジェクトとして設定します。
また、tops_lesson_startフォルダ直下にhipファイルを保存します。
- /objにてGeometryノードを作成し名前をStreet_gridとして、中に入ります。Traceノードを作成し、
Input Imageに$HIP/tex/citygrid.jpgを選択します。
また、Scale To Sizeにチェックを入れ、両方の値に500を入力します。
- Transformノードを接続します。RotateXに90、UniformScaleに100を入力します。
更にReverseノードを接続します。
- Resampleノードを接続し、Lengthに1を入力します。
更にNullノードを作成し、名前を
CITYBLOCKS_OUT に変更します。
- obj階層に戻り、Top Networkノードを作成し中に入ります。
また、ネットワークペインの右上の▽アイコンからSplit Pane Left/Rightを選択することで、
ネットワークペインを分割することができます。ここでは分割した状態で作業を進めます。
- Geometry Importノードを作成し、Geometry SourceをSOP Nodeに変更します。SOP PathにCITYBLOCKS_OUTを設定します。
Store Geometry AsがExternal Fileになっていることを確認し、Source GeometryのClassをPrimitiveに設定します。
設定が終わったらノードを選択した状態で[Shift+G]キーでノードをクックします。
- obj階層上にGeometryノードをもうひとつ作成し、名前をwork_item_viewerとします。中に入ってFileノードを作成し、
Geometry Fileに`@pdg_output`と入力します。
また、Colorノードを接続することで、TOP上でワークアイテムドットをクリックしたときに
`@pdg_output`が参照している区画を視覚的に確認することができます。
この先処理が固まることがありますので、適宜hipを保存することをお勧めします。
- TOPネットワーク上のGeometry ImportにAttribute Createノードを作成します。
Float Attributesから以下のアトリビュートを作成します。
Name:base_height Value:10
Name:height_variation Value:rand(@pdg_index) * 20
- ROP Geometry Ouputノードを接続し、名前をcreate_ buildingsに変更します。
Use External SOPのチェックを外し、ノードの中に入ります。
- Poly Extrudeノードを作成し、名前をblock_offsetに変更して、incomingノードとoutput1ノードの間に挿入します。
更にFuseノードを接続し、Snap Distanceを0.2に変更します。
- 2つ目のPoly Extrudeノードを作成し、名前をbuilding_heightに変更します。
Distanceを@base_height + @height_variation
とし、値をDivisionsにコピーパラメータした上で2で割ります。Divisionsの値は最終的に ch(“dist”)/2 となります。
ExtrusionタブよりFront Groupにチェックを入れ、名前をbuilding_topとします。
同様に、Side Groupにもチェックを入れ、名前をbuilding_sideとします。
- 3つ目のPoly Extrudeノードを作成し、名前をwindow_framesに変更します。
Groupにbuilding_sideを指定し、Divide IntoをIndividual Elementsに変更します。
また、Insetに0.05を入力し、ExtrusionタブからFront Groupにチェックを入れ、名前をwindow_outとします。
- 4つ目のPoly Extrudeノードを作成し、名前をwindowsに変更します。
Groupにwindow_outを指定し、Distanceに–0.04を入力します。
- 5つ目のPoly Extrudeノードを作成し、名前をroof_edgeに変更します。
Groupにbuilding_topを指定し、Insetに0.3を入力します。
ExtrusionタブからFront Groupにチェックを入れ、名前をroof_outとします。
- 6つ目のPoly Extrudeノードを作成し、名前をroofに変更します。
Groupにroof_outを指定し、Distanceに–0.25を入力します。
- Colorノードを作成し、Groupにwindows_outを指定します。
色はグレーを指定し、最後にoutput1ノードをその下に接続し、ディスプレイフラグを立てます。
- 1階層上に上がり、create_buildingsノードのOutput Fileのパスの$Fの部分を`@pdg_index`に書き換えます。
また、ROP FetchタブのCache ModeをWrite Fliesに変更します。
ここまで出来たら一度create_buildingsノードを[Shift+G]キーでクックします。
- create_buildingsノードの下にWait for All ノードを接続します。
これで、プリミティブの数だけ存在したワークアイテムが1つに結合されます。
- Geometry Importノードを接続し、名前をbuilding_mergeに変更します。
Work Item GenerationをDynamicに変更し、Merge Input Geometryにチェックを入れます。
ここでbuilding_mergeノードをクックすることで、7.で作成したwork_item_viewer内のFileノードに、
ディスプレイフラグを立て、ノードを選択すると区画に合わせて都市が構築されています。
- プロジェクトフォルダ内のtexフォルダのサブフォルダの中にサンプルの区画の画像が何枚かあります。
こちらをTraceノードの現在の入力から差し替えることで、building_mergeノードをクックするたびに
入力に使用した画像をに従って都市が自動で構築されます。
以上が、TOPsによる都市構築のタスクワークフローの作成になります。
今回はLocal Schedulerを利用しているので、作業マシンで処理を行っていますが、
HQueue Schedulerなどのディスパッチャーを利用することで、これらの作業を分散することも可能となります。