TOPsによる都市構築のタスクワークフローの作成


この記事では、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]キーを押してホームグリッドに移動してください。

 

以下が作成手順になります。

  1. ダウンロードしたZipファイルを展開してからHoudini17.5を起動し、
    File-> SetProject で展開したプロジェクトフォルダ「tops_lesson_start」をプロジェクトとして設定します。
    また、tops_lesson_startフォルダ直下にhipファイルを保存します。

  2. /objにてGeometryノードを作成し名前をStreet_gridとして、中に入ります。Traceノードを作成し、
    Input Image$HIP/tex/citygrid.jpgを選択します。
    また、Scale To Sizeにチェックを入れ、両方の値に500を入力します。

  3. Transformノードを接続します。RotateX90UniformScale100を入力します。
    更にReverseノードを接続します。

  4. Resampleノードを接続し、Length1を入力します。
    更にNullノードを作成し、名前を
    CITYBLOCKS_OUT
    に変更します。

  5. obj階層に戻り、Top Networkノードを作成し中に入ります。
    また、ネットワークペインの右上のアイコンからSplit Pane Left/Rightを選択することで、
    ネットワークペインを分割することができます。ここでは分割した状態で作業を進めます。

  6. Geometry Importノードを作成し、Geometry SourceSOP Nodeに変更します。SOP PathCITYBLOCKS_OUTを設定します。
    Store Geometry As
    External Fileになっていることを確認し、Source GeometryClassPrimitiveに設定します。
    設定が終わったらノードを選択した状態で[Shift+G]キーでノードをクックします。

  7. obj階層上にGeometryノードをもうひとつ作成し、名前をwork_item_viewerとします。中に入ってFileノードを作成し、
    Geometry File
    `@pdg_output`と入力します。
    また、Colorノードを接続することで、TOP上でワークアイテムドットをクリックしたときに
    `@pdg_output`が参照している区画を視覚的に確認することができます。
    この先処理が固まることがありますので、適宜hipを保存することをお勧めします。

  8. TOPネットワーク上のGeometry ImportAttribute Createノードを作成します。
    Float Attributes
    から以下のアトリビュートを作成します。
    Name:base_height
           Value:10
    Name:height_variation
     Value:rand(@pdg_index) * 20


  9. ROP Geometry Ouputノードを接続し、名前をcreate_ buildingsに変更します。
    Use External SOP
    のチェックを外し、ノードの中に入ります

  10. Poly Extrudeノードを作成し、名前をblock_offsetに変更して、incomingノードとoutput1ノードの間に挿入します。
    更にFuseノードを接続し、Snap Distance0.2に変更します。

  11. 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とします。

  12. 3つ目のPoly Extrudeノードを作成し、名前をwindow_framesに変更します。
    Group
    building_sideを指定し、Divide IntoIndividual Elementsに変更します。
    また、Inset0.05を入力し、ExtrusionタブからFront Groupにチェックを入れ、名前をwindow_outとします。

  13. 4つ目のPoly Extrudeノードを作成し、名前をwindowsに変更します。
    Group
    window_outを指定し、Distance0.04を入力します。

  14. 5つ目のPoly Extrudeノードを作成し、名前をroof_edgeに変更します。
    Group
    building_topを指定し、Inset0.3を入力します。
    Extrusion
    タブからFront Groupにチェックを入れ、名前をroof_outとします。

  15. 6つ目のPoly Extrudeノードを作成し、名前をroofに変更します。
    Group
    roof_outを指定し、Distance0.25を入力します。

  16. Colorノードを作成し、Groupwindows_outを指定します。
    色はグレーを指定し、最後にoutput1ノードをその下に接続し、ディスプレイフラグを立てます。

  17. 1階層上に上がり、create_buildingsノードのOutput Fileのパスの$Fの部分を`@pdg_index`に書き換えます。
    また、ROP FetchタブのCache ModeWrite Fliesに変更します。
    ここまで出来たら一度create_buildingsノードを[Shift+G]キーでクックします。

  18. create_buildingsノードの下にWait for All ノードを接続します。
    これで、プリミティブの数だけ存在したワークアイテムが1つに結合されます。

  19. Geometry Importノードを接続し、名前をbuilding_mergeに変更します。
    Work Item Generation
    Dynamicに変更し、Merge Input Geometryにチェックを入れます。
    ここでbuilding_mergeノードをクックすることで、7.で作成したwork_item_viewer内のFileノードに、
    ディスプレイフラグを立て、ノードを選択すると区画に合わせて都市が構築されています。

  20. プロジェクトフォルダ内のtexフォルダのサブフォルダの中にサンプルの区画の画像が何枚かあります。
    こちらをTraceノードの現在の入力から差し替えることで、building_mergeノードをクックするたびに
    入力に使用した画像をに従って都市が自動で構築されます。

以上が、TOPsによる都市構築のタスクワークフローの作成になります。
今回はLocal Schedulerを利用しているので、作業マシンで処理を行っていますが、
HQueue Schedulerなどのディスパッチャーを利用することで、これらの作業を分散することも可能となります。