Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HDAを駆使したプロシージャルワークフローのスケーリングについて

Avatar for Trs Trs
February 28, 2024
1.2k

 HDAを駆使したプロシージャルワークフローのスケーリングについて

Avatar for Trs

Trs

February 28, 2024
Tweet

Transcript

  1. HDAについて 01 HDAとは? Houdini Digital Assetsの略 Houdiniで作成されたパラメータ化されたノードやネッ トワークをパッケージ化し、再利用可能なアセットと して保存する機能。これにより、複雑な操作やエフェ クトを簡単な操作で再現できる「ブラックボックス」

    として機能する。 HDAを製作チームや他のプロジェクトで共有・再利用 することで作業効率や品質の向上をさせることができ る。 Houdiniでの作業 ノード/ネットワーク作成 パッケージ 化 再利用可能なアセット 複雑な操作の再現 ブラックボックスとしての利用 HDAとして保存 HDAとして保存 簡単な操作で 5
  2. HDAについて 01 HDA機能: Scripts Scriptsは、HDA内で利用されるスクリプト群。これらのスクリプトは、HDAの振る舞いをカ スタマイズし、よりダイナミックでインタラクティブなアセットを作成するために使用され る 例 イベント駆動 •

    特定のイベント(例えば、パラメータの変更やボタンをクリックした際に)に自動的に 実行される ユーザー定義の操作 • HDA使用者が特定の操作を行った際にカスタムロジックを実行される 11
  3. 社寺建築 03 設計: 意匠ごとにHDAを作成する(意匠用HDA) 柱 (Columns) HDA 様々な高さ、太さ、スタイルの柱を生成 伝統的な日本建築に見られる柱のデザインをパラメータ化 屋根

    (Roofs) HDA 異なる傾斜、形状、屋根の種類をサポート 屋根の端や隅の細かい意匠もパラメータで調整可能 床 (Floors) HDA 広範囲にわたる床面のレイアウトと床下の柱の生成 22
  4. 社寺建築 03 設計: 意匠ごとにHDAを作成する(形状コントロール用HDA) ベーストポロジー生成 (Base Topology Generation) HDA プロジェクトのスタートポイントとして機能。

    トポロジーマージ (Topology Merge) HDA 複数のトポロジー要素を組み合わせ、一つの連続した構造体を作成。 異なる意匠要素(柱、屋根、床)の統合を可能にする トポロジーアライン (Topology Align) HDA 構造要素の位置合わせと整列を行う 23
  5. 社寺建築 03 設計: HDAのInputとOutputを決める Input Output ポリゴン 建築物の基本形状や構造を定義す る多角形データ。 前段階のHDAからの出力と新たに

    生成されたデータを組み合わせて 利用。 HDAによる処理後、前段階の形状に新たな 形状を加えた結果。 トポロジー 建築物の構造的な骨組みや配置を 示す情報。 HDAごとの処理結果に応じて更新 され、処理履歴を記録。 HDAの処理を反映した新しいトポロジー データ。以前の処理履歴も含む。 地形情報 柱の配置や高さの調整など、地形 に適応した設計のために利用。 Inputと同じものをそのまま返す。 24
  6. 街並み生成 04 設計: 汎用性 汎用性を実現するための設計は、プロジェクトの柔軟性と再利用性を最大化することを目的 とする。以下はHDAを設計する際に汎用性を確保するためにとったアプローチ。 1. モジュール化 目的: 再利用可能なコンポーネントの作成

    実装: 建築の主要構造(ドメイン)と細部(サブドメイン)を独立したモジュールとして設 計。各モジュールは、単独で機能するようにパラメータ化され、異なるプロジェクトやシナ リオに再利用可能に。 2. インタフェースの抽象化 目的: 疎結合を実現し、コンポーネント間の依存関係を最小限にする。 実装: 各HDA間でのデータやコントロールの流れを管理するために、抽象的なインタフェー スを定義。これにより、特定のドメインやサブドメインの変更が他のコンポーネントに影響 を及ぼすことなく、柔軟な再構成や拡張が可能に。 32
  7. 街並み生成 04 詳細: 汎用性(モジュール化) 建築要素を大分類から小分類へと細かく分けHDA化していく 家 真壁 壁 屋根 大壁

    ドア 窓 室外機 下見板張 簓子下見板張 ノーマル 引戸 押戸 雨戸 屋根 柵 雨樋 瓦 軒先 33
  8. 街並み生成 04 詳細: 汎用性(インタフェースの抽象化) 壁 ドア 引戸 押戸 インターフェースを抽象化するためにInputとOutputで、ポリゴン、 グループ、アトリビュートで何を入出力するのかを決める。

    以下はドアの例 Input Output ポリゴン 頂点が数4のポリゴン ドアの形状 グループ どこに処理を適用する か決めるためののグ ループ 処理済みであることを示すグ ループ、マテリアルアサイン用 のグループ アトリ ビュート uv 36 インター フェース
  9. 街並み生成 04 設計: 拡張性 拡張性は、将来的に新しい機能や要素を追加できる能力だと考えた。HDAを動的に編集され るようにし、拡張性を確保できるようにした。以下はHDAを設計する際に拡張性を確保する ためにとったアプローチ。 1. HDA Scriptの活用

    目的: 新しいHDAの統合を自動化し、開発プロセスを加速する 実装: HDA Scriptsを用いて、新しいコンポーネントの追加やシステムの拡張を容易にする。 自動化することにより、効率的な開発を実現している。 37
  10. 街並み生成 04 詳細: 拡張性(HDA Scriptの活用) HDA ScriptのEventHandlerを使い動的にHDAを拡張出来るようにする HDA作成時に以下の内容のPython Scriptを実行する 1.

    インターフェースHDAのAllow Edit of Contentsをする 2. 特定のPrefixを持つHDAをインターフェースHDA内に配置する 3. インターフェースHDAに配置したHDAのパラメータをコピーし、expressionを設定する 4. インターフェースHDA内部にある適用範囲を絞るためのSplit Sopなどにexpressionを 設定する 39 インターフェースHDA HDA作成 インターフェースHDA ALLOW EDIT 2.配置で きるHDA を検索、 HDAを配 置 3.パラ メータイ ンタ フェース を編集 4.イン ター フェース HDAの内 部的な設 定をする
  11. 街並み生成 04 詳細: 拡張性(HDA Scriptの活用) 1. インターフェースHDAのAllow Edit of Contentsをする

    Allow Edit of Contentsをしない場合、 HDA内にノードを配置したりパラメー ターインタフェースを編集できないた め、この方法を取っている。 Allow Edit of Contentsをすることのデメ リットは、本質的な変更をしたのかが判 断しずらい。 40 node = kwargs['node'] node.allowEditingOfContents()
  12. 街並み生成 04 詳細: 拡張性(HDA Scriptの活用) 2. 特定のPrefixを持つHDAをインターフェースHDA内に配置する nodeTypeCategories APIを使うことによ り、使用可能なノード一覧を取得するこ

    とができる。 取得したノードの名前から、prefixで配置 するノードを絞り込み配置する。 41 def getNodeTypes(): # Get the list of available node categories node_categories = hou.nodeTypeCategories() # Loop through each category and get the node types all_node_types = [] for category in node_categories.values(): node_types = category.nodeTypes().values() all_node_types.extend(node_types) return all_node_types def getDoorPreprocessorNodeTypeNames(): shape_nodes_type_names = [] for node_type in getNodeTypes(): name = node_type.name().lower() if "jph_wall_detail_door_preprocessor" in name: shape_nodes_type_names.append(node_type.name()) return shape_nodes_type_names
  13. 街並み生成 04 詳細: 拡張性(HDA Scriptの活用) 3. インターフェースHDAに配置したHDAのパラメータをコピーし、expressionを設 定する 配置したHDAのパラメータテンプレートグループからパラメータを取得する。 パラメータをそのままコピーしインターフェースHDAにパラメーターを追加した場合、

    パラメータ名が衝突する可能性があるので、Prefixにノード名を追加しコピーする。 最後に配置したHDAとインターフェースHDAのパラメータ間に参照もしくはexpression を設定する。for_each内に配置したHDAはexpressionで設定。それ以外は参照で値を取 得するようにしている。 ※ コードが長く張り付けられないので、ブログの部分を参照してください (https://blog.trsnium.net/dynamic%E3%81%AAhda%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%9 9%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-682b37 625a62) 42
  14. 街並み生成 04 詳細: 拡張性(HDA Scriptの活用) 4. インターフェースHDA内部にある適用範囲を絞るためのSplit Sopなどに expressionを設定する 43

    どこのメッシュグループに対して、処理 をするかを決めるためにパラメーターを 作り、エクスプレッションを設定する。 wall_base_split = hou.node(node.path()+"/WALL_BASE_SPLIT") wall_base_split.parm("group").set('`chs("../wall_base_group")`',langua ge=hou.exprLanguage.Hscript)
  15. 街並み生成 04 設計: メンテナンス性 メンテナンス性は、システムが時間の経過とともに効率的に更新、改善、拡張できることだ と考えた。メンテナンス性を高くすることで長期的な開発を効率よくできる。以下はメンテ ナンス性を向上させるためにとったアプローチ。 1. ドキュメンテーション 目的:

    構造と機能を容易に理解できるようにする。 実装: 各HDAの出力するグループとアトリビュートなどを明確にしたドキュメントを整備。 2. 疎結合のアーキテクチャ 目的: システムの各部分が独立していることで、個別の更新や改善を容易にする。 実装: インターフェースと抽象化を利用し、コンポーネント間の依存性を最小化。 44
  16. 街並み生成 04 今後の展望 1. PDGを用いたワークフローの並列化 現状For EachブロックにFeed Back Loopを使っているため、Compileブロックを使った並列 化ができない。1つの家を生成するのに最大3,4分程度かかるため、大量の家を生成するため

    の並列化のフローを整えたい。 2. マテリアルのベイクフロー 一個一個のGroupにマテリアルをアサインし、ベイクするのに時間がかかってしまう。マテ リアルをアサインするためのHDAの整備をしたい。また、Mantraでのベイクはできている が、GPUでのベイクフローが整っていないので、GPUベースでのベイクをできるようにした い。 46
  17. 49