2015年の会社創立以来、3DCGをコアにした技術力を武器に日本のコンテンツ業界を支えてきたGUNCY’S。2023年のUnreal Festでは、Unreal Engine 5Houdiniによるプロシージャルワークフローを用いたオリジナル映像作品のR&Dプロジェクトを発表し、大きな話題を呼んだ。本連載では、日本語でまだ情報の少ない先端技術を積極的に用い、そのプロジェクトを通して得た検証結果を広く公開していく。

記事の目次

    長田晃輝/Kouki Osada

    株式会社GUNCY’S所属CGIアーティストとして従事。モデリング、テクスチャリングやアセット管理を行うことが主。本プロジェクトでは上記に加えUEのアートワークを担当。

    株式会社GUNCY’S(グンシーズ)は、3DCGをはじめとする最先端テクノロジーを熟知したメンバーと独自の戦略・ユニークな提案などで、人々が思い描くあらゆるアイデアやイメージを実現・成功へと導く、現代版”軍師”集団。プロジェクトコンサルティングやデジタルコンテンツ制作・開発、教育・執筆・講演など様々な事業を執り行う。
    guncys.com

    はじめに

    皆様こんにちは、株式会社GUNCY’S CGIアーティストの長田です。今回はHoudiniでのモデリングと、そのデータをUE5のHoudini Engineで再構築するフローについてお話します。

    説明の中でスライドの画像が出てきますが、それらは主に「CGWORLDクリエイティブカンファレンス 2023」にて作成したものです。その中から抜粋して使用しているため、通し番号が飛んでいる場合がございますが、ご了承ください。

    館の作成

    本プロジェクトで主にHoudiniを活用したのは、物語の舞台である洋館のモデリングです。柱や窓、ドアなどの館のパーツを作成する上で、パラメータで差分をつくれたり、間取りに合わせた形状変化や配置変更を行えたりする点でプロシージャルと相性が良いため、Houdiniを採用しました。

    レイアウト

    今回は脚本段階ですでに間取り図を作成していたため、こちらをベースに館のレイアウトをつくります。しかし、これはあくまで脚本用の間取り図であり、寸法的に適しているかはわからないため、3D的にもふさわしい間取りになるようHoudini上で調整していきます。

    今回はレイアウト用のHDAを作成し、各部屋や廊下の広さをパラメータとして動的に調整できるようにしました。

    HDAとは、「Houdini Digital Asset」の略です。Houdiniで作成したノードネットワーク(一連の処理)をパッケージ化し、アセットとして切り出したもので、処理内の値をパラメータとしてもたせた1つのノードとして扱うことができます。シーン上にはカメラを配置し、実際の画角を確認しながら最終的なレイアウトを決定していきました。

    こうして決定したレイアウトを基にして、壁や窓などの館のパーツを本制作していきます。本プロジェクトでは、これらのパーツを配置する前にモジュール化を行います。次のセクションでは、このモジュール化について詳しく解説します。

    モジュール化

    モジュール化の背景

    まず、モジュール化とは、例えば壁一面ごとを別々のモデル(=モジュール)として作成し、それらを組み合わせて1つの大きな建物を構築する構造にすることを指します。

    本プロジェクトでモジュール化を採用した理由のひとつは、UE5の仕様によるものです。

    Lumen(UE5のリアルタイムライティングシステム)では、複雑な形状のモデルは光の計算には適していません。これは、Lumenの処理過程で計算されるSurface Cacheが、複雑な形状だと正しく生成されないからです。

    そのため、モジュール化によってひとつひとつのモデルを計算しやすい形状にし、Lumenへの最適化を行う必要がありました。

    HDAでモジュール化

    さて、実際にモジュールを制作していきますが、各モジュールは先述の通り間取りに合わせて形状を変化させる必要があります。壁の場合は窓やドア用の穴の位置や形状、窓の場合は階によるデザインのちがいなどです。

    これらの要素をパラメータとして扱うために、壁、窓などをモジュール単位で個別のHDAにします。このときのパラメータは後にUE上でHoudini Engineを使って館の再構築をした際にも調整できるようにするため、この段階で最適化しています。

    ラインからモジュールを生成、配置

    各モジュールのHDAが完成したら、それらを先述のレイアウト通りに配置していきます。

    まずはレイアウトにしたがって壁のラインを定義します。

    このラインには、位置情報や隣接しているラインセグメントとの角度などの情報が格納されていて、これらの情報から壁モジュールを生成します。

    窓や柱などもライン上のポイントから生成します。 

    このようにして、各モジュールを生成、配置した結果が以下の画像です。

    HDAモジュール以外の構造物

    壁や窓などは場所によって様々なバリエーションがありましたが、中には階段や天井など、一点ずつしか存在しないユニークな形状のモジュールも存在します。

    今回はこれらのパーツについてもHoudiniで制作をしました。階段の長さに合わせた手すりのモデリングなど、構造がプロシージャルに適していたためです。

    HDAモジュールとユニークな形状のモジュールを合わせることで、館のモデルが完成しました。

    次の項目では、このモデルをUSDファイルとしてUE5にエクスポートします。

    USDワークフロー

    HoudiniでUSDを出力

    Houdiniで洋館を構築し終えたので、次はこれをUSDとして出力します。

    後にUEで再構築することを考え、USDには以下の情報を格納する必要があります。
    ・各モジュールのHDAのパラメータの値
    ・各アセットの配置情報(レイアウト)

    まずHDAのパラメータ情報について、ParamSerializerノードを用いて文字列としてAttributeに格納する処理を行います。

    次に、レイアウト情報についても、レイアウトをPoint Instancerが認識できる位置情報(orient(quaternion)、scale(vector3)など)に変換し、その情報をPoint Instancerにもたせることで情報を格納しています。

    そうすることで、モデルの情報を全てポイント群に落とし込み、メタデータとして扱います。これをデフォルトのUSD ROPを使ってUSDファイルとして出力します。

    UE5でUSDを読み込む

    HoudiniからUSDを出力できたので、次はこれをUEで読み込めるようにします。作業のながれとしては、以下のようになります。

    ①USDをインポート
    ②USDに格納された情報を取り出す
    ③取り出した情報を基に、Houdini Engineでモジュールを再構築する
    ④モジュールをStatic Meshにベイク

    このながれを実現するために、UEでUSDを読み込むためのWidgetを作成します。

    このWidgetにHoudiniで格納した情報を取り出す処理を記述することで、ボタン押下時にPythonスクリプトが実行され、各パラメータや位置情報をHoudini Engineに渡すことができるようになります。

    Houdini Engineで洋館を再構築

    読み込まれたUSDは、Houdini Engineによって再構築されます。

    シーン上には各モジュールがHoudini Engineのオブジェクトとして配置され、そのとつひとつはUSDに格納されていたパラメータや位置情報が適用された状態になっています。また、先述の通り、UE上で改めてパラメータの調整を行うことも可能です。

    最終的には、Lumenでのライティング作業等Houdini Engineがない環境での作業も考えて、Static MeshにBakeを行い完了となります。

    まとめ

    本記事では、Houdiniでの洋館の構築とそのデータをUEへ出力するワークフローについて解説しました。次回はさらにミクロな視点で、Houdiniでモデルのディティールを詰める手法について解説します。

    Houdiniでのモデリングは、非破壊で応用が利く一方、求められる知識や手間が多く、アーティストには敷居の高い手法です。そのためか、Houdiniモデラーの人口はかなり少ない印象があります。しかしそれは裏を返せば、身につければ強力な武器になるということだと思います。ぜひ皆さんもHoudiniでのモデリングに挑戦してみてください。

    ここまでお読みいただきありがとうございます。今回紹介したレイアウト用のHDAは、以下のリンクからダウンロードいただけます。

    ダウンロードこちら

    また次回もよろしくお願いします。

    TEXT_長田晃輝/ Kouki Osada(GUNCY'S)
    EDIT_藤井紀明 / Noriaki Fujii(CGWORLD)、山田桃子 / Momoko Yamada