Share
Embed
【CEDEC2024】USDのゲームアセットへの応用について
jsonなどが使われることが多いゲームアセットについて、USDを使用する手法を解説します。
また、ゲームアセットにUSDを採用したときのメリットやデメリットも解説します。
Bandai Namco Studios Inc. PRO
January 30, 2025
Transcript
54 slides
-
自己紹介 主に関わったタイトル ・ACE COMBAT6 ・ACE COMBAT ASSAULT HORIZON ・テイルズ オブ
カードエボルブ ・アイドルマスター ミリオンライブ! ・ポッ拳 ・New ポケモンスナップ 過去の講演 ・CEDEC2011 ACE COMBAT ASSAULT HORIZONにおける継続的インテグレーション ・CEDEC2011 「エースコンバット アサルト・ホライゾン」インゲームカメラ制作事例 ・CEDEC2015 ポッ拳におけるゲームエディタの設計と実装 ・CEDEC2019 家庭用ゲーム開発におけるゲームエディタの基礎設計と、安定かつ高速なアセット管理について ・CEDEC2019 DirectX Raytracingを用いたライトベイカーの実装について ・CEDEC2021 『New ポケモンスナップ』におけるライティング ・CEDEC2022 MaterialXとStandard Surfaceのゲームグラフィックスへの応用について ・CEDEC2023 DCCツールを用いた広色域テクスチャワークフロー など 多田 航 Wataru Tada -
USD(Universal Scene Description) • USDはPixarによって開発されたシーングラフ記述用のファイ ルフォーマットと制御ライブラリ • USDはグラフィックス用途に強いが、汎用的なフォーマットと して設計されており、グラフィックス用途に限定されるもので はない
• 今回の講演は、jsonなどが使われることが多いゲームアセット について、USDを応用する例を解説する https://openusd.org -
jsonを使ったゲームアセットフロー ゲームランタイム 開発環境 (ゲームエディタなど) { "Mission": [ { "name":"Mission1", “Comment”:“テストミッション",
"ID":1 } ] } バイナリファイル json バイナリファイル -
USDを使ったゲームアセットフロー 開発環境 (ゲームエディタなど) #usda 1.0 def "Mission" { def "Mission_1"
{ custom string Comment = "テストミッション" custom int ID = 1 } } バイナリファイル USD ゲームランタイム バイナリファイル -
コンポジションを使う • ゲームアセットがコンポジションアークに従ってファイル分割 されている必要がある • subLayers (レイヤー) • inherits (継承)
• variantSets (バリエーション) • references (参照) • payloads (ペイロード) • specializes (特殊化) キャラクター共通パラメータ.USD 個別キャラクターパラメータ.USD 参照 コンポジション例 -
USD Toolsetが使用可能になる • USDは公式ツールとしてUSD Toolsetを提供している • ゲームアセットがUSDで作られていると、ゲームアセットに USD Toolsetを適用できる usdview
usdcat https://github.com/PixarAnimationStudios/OpenUSD/tree/release/pxr/usd/bin -
USDライブラリ • USDはファイルフォーマットとしてのUSD(.usdなど)を扱うた めにライブラリが提供されている • 本講演ではUSD 24.05 Windows版をMonolithic Libraryとして ビルドしたものを使用している
(コンソール移植を行っていない) →ゲームランタイムではなくツールでのみUSDを扱っている https://github.com/PixarAnimationStudios/OpenUSD USD Windows開発環境 ゲームランタイム バイナリ -
C#からのUSDアクセス • USDライブラリはC++とPythonがサポートされているが、今回は C#からUSDにアクセスする事とした →USDライブラリのマーシャリング用C++DLLと、USDの各クラス をオブジェクトとして扱えるようにしたC#ライブラリを作成した (C#でのUSDアクセスについては、usd-unity-sdkの様にUSDライブ ラリの解析機構を作っている例もある) USDアクセスライブラリ C#
(DLL) C++ (DLL) usd_ms.dll C#ツール マーシャリング用のライブラリ インターフェース -
USDシリアライザ/デシリアライザ • C#オブジェクトをUSD出力する時はアセットの種類ごとに USDスキーマ設計を考える必要がある • アセットの種類が増えたときに、USDスキーマ設計を簡略化す るため、シリアライザを作成する事にした →リフレクションを使い、C#オブジェクトを自動でUSDにシリ アライズする C#オブジェクト
USD シリアライザ USDスキーマ設計 C#オブジェクト UsdGeomXform? UsdGeomScope? UsdPrim? -
基本型 • 基本型はUSDで用意されているので、C#の型を変換できる C# USD bool bool char uchar int,sbyte,short
int uint,byte,ushort uint long,decimal,nint int64 ulong,nuint uint64 float float double double string string C# USD bool[] pxr::VtArray<bool> char[] pxr::VtArray<uchar> int[],sbyte[],short[] pxr::VtArray<int> uint[],byte[],ushort[] pxr::VtArray<uint> long[],decimal[],nint[] pxr::VtArray<int64> ulong[],nuint[] pxr::VtArray<uint64> float[] pxr::VtArray<float> double[] pxr::VtArray<double> string[] pxr::VtArray<string> 基本型 配列 -
USDに用意されていない型 • USDにはPrim配列は用意されていないので、C#のオブジェクト配列はPrimのSdfPathに連番を付 けて表現する (Relationshipを使っても配列を表現することは出来る) • その他USDに用意されていない型は独自のPrimを作成する List、ObservableCollection、Dictionary、HashSet... 配列型 C#
USD SdfPathはValue_番号 C# Dictionary型 Key Value USD SdfPathの予約語(.や/)を避けて定義する -
Houdiniでのライティングプリセット使用例 • Asset ReferenceノードからライティングプリセットUSDを指定すると、ライ ティングが反映される • Houdiniではライティングアーティストが設定したExcelを変更できないので、 意図していないライティング変更を防ぐ事が出来る HDRI (UsdLuxDomeLight)
太陽光(UsdLuxDistantLight) USD ライティングプリセットExcel HDRI (UsdLuxDomeLight) 太陽光(UsdLuxDistantLight) Houdini -
モデルコンバーター • HoudiniからUSDを出力し、モデルコンバーターでバイナリファイルにす ることで、USDをHoudiniのエキスポーターとして使用出来る →モデルコンバーターはUSDを読み込み、UsdGeomMeshをバイナリファ イルに入れる Houdini USD モデルコンバーター ゲーム
divideノードなどを使用して faceVertexCountsは3に設定 バイナリ ファイル -
Custom Dataの使用 • ゲーム固有のパラメータなど、USDスキーマに含まれていないパラ メータをUSDに埋め込むにはCustom Dataを設定する →モデルコンバーターでCustom Dataをバイナリに埋め込むことで、 ゲーム側からHoudiniで設定したパラメータを利用することが出来る ConfigurePrimitiveノードでCustom
Dataに RenderPass(描画パス)の文字列を設定 ゲーム側ではHoudiniで設定された モデルの描画パスに従って描画 USD -
コリジョンコンバーター • コリジョンアセットをUSDで扱うことで、ゲームエディタでの 編集の他、DCCツールでも編集可能なアセットとなる コリジョンアセットUSD Houdini ゲームエディタ Maya バイナリ ファイル
コリジョンモデルはUsdGeomMeshを使用 ゲーム中で必要な追加パラメータはCustom Dataに設定 (草や地面といったコリジョン種別など) ポリゴン判定用にfaceVertexCountsは3に設定 -
レベルアセットUSD • レベル構造はサブレベルとEntityのツリー構造なので、USDのツ リー構造を利用する ルートレベル サブレベル サブレベル Entity Entity レベルツリー
Entity Entity USD Layer Layer Layer Prim Prim Prim Prim レベルファイルUSD -
USD Toolset • USDはUSD Toolset(USD公式ツール)を提供しており、データ デバッグなどに活用できる 名前 概要 usdedit テキストエディタでのデータ編集
usdcat .usdaの文法チェック usddiff diff表示 usdview 階層構造のプレビュー usdrecord usdresolve usdtree 階層構造のテキスト表示 名前 概要 usdzip .usdzの作成 usdchecker usdstitch 複数USDのマージ usdstitchclips usddumpcrate sdfdump SdfPathやTfTokenの調査用 sdffilter -
ゲームアセットにUSDを採用するデメリット • pythonなどの環境整備が必要になる • アセットがUSDの仕様の制限を受ける • USDはLinux版を基準に開発されているので、Windows版かつ MSVCを使ったビルドでは問題が出やすい → 都度githubにて報告する
https://github.com/PixarAnimationStudios/OpenUSD -
アセットがUSDの仕様の制限を受ける • Primはユニークなパス(文字列)を設定しなければならないので、数字(ID) ベースでアセットを管理しているとパスの生成処理が必要になる • USDスキーマに存在しないものを表現しにくい →線を表現したいが、UsdGeomLinesが無いので、UsdGeomBasisCurves を使うなど カスタムスキーマはアセットの前方互換性やDCCツールの相互運用性が下 がるので使用しにくい
• 何かを切り替えるという機能にはVariantが使えるが、 Variantで選択して いないPrimの情報を取得しにくい(Variantの切り替えが必要になる) -
まとめ • USDライブラリを使用したツールを作ることでゲームアセットをUSDと して扱うことが出来る • ゲームアセットをUSDで扱うと、コンポジションが使えたり、DCCツー ルとの相互運用性が上がるなどのメリットもあるが、アセットがUSDの 仕様の制限を受けるなどのデメリットもある • USDに適しているゲームアセットとしては、コンポジションを行うア
セットや、DCCツールとの連携を行うアセットが挙げられる • 単純な文字列リストファイルなど、USDを使用するメリットが少ないア セットはjsonやxmlなど、従来のファイルフォーマットが適している -
References • https://openusd.org • https://github.com/PixarAnimationStudios/OpenUSD • Academy Software Foundation Slack
• [CEDEC 2017] Pixar USD 入門:新たなコンテンツパイプラインを構築する • [CEDEC 2022]『グランツーリスモ7』開発におけるUSD活用事例