メインコンテンツへスキップ
見出し画像

SolarisとUSDを用いたワークフロー導入について (Part3)

    本記事は、複数回に分けて公開されています。
    Part1とPart2をまだ読まれていない方は、以前の記事と合わせてご覧ください。
    全体の流れや前提知識を把握することで、今回の内容もよりスムーズに理解いただけるかと思います。
    今回はシーケンスとしての扱い方を掘り下げて考えてみようと思います。


    4.3 USDシーケンス読み込みの考察

    4.3.1 警告表示について

    単一としてのファイルだけではなく
    USD(Universal Scene Description)ファイルは、アニメーションや大規模な3Dシーンを扱う際に非常に有用なデータフォーマットであり、1フレームごとにファイルを分けた「シーケンスファイル」として出力することも可能です。しかしながら、これらのシーケンスファイルをHoudiniで取り扱う際には注意が必要です。

    例えば、SubLayer LOPノードを使用して直接シーケンスファイルを読み込んだ場合、Node Infoには画像のような警告が表示されることがあります。


    画像
    SubLayer LOPからのUSDシーケンス読み込み
    画像
    Node Info上で表示される警告

    Node Info上で、「時間的に変化するファイルパスは、通常、Geometry Sequence LOPで読み込む必要があります。」と記載がされます。

    このメッセージが意味するところは、ファイル名にフレーム番号が含まれ、時間経過に従って異なるファイルを参照するような場合(いわゆる時間的に変化するパス)においては、単なるSubLayerではなく、時間依存型の専用ノードを使用する必要があるという点です。

    今一つ私は理解ができないのでUSDの仕組みにをおさらいしてみたところ、
    要点として時間軸の持たせ方は、
    1つのファイル内にTime Sample(時間サンプル)としてアニメーションを記録する形式と、1フレームごとに独立したファイルに分けて保存するシーケンス形式があり、シーケンス形式では、一つ一つのファイルアクセスのたびに別のファイルを開く必要があるため、ディスクI/Oが増加し、再生パフォーマンスが低下するリスクがあるという事になります。

    そこで時間情報を最適化する手段として、HOUDINIには
    Value Clipという仕組みが用意されています。
    この機能に対応したノードが Geometry Sequence LOP や Geometry Clip Sequence LOP になります。
    対応したノードを使用することで、シーケンスファイルを適切かつ効率的に読み込むことが可能になります。


    4.3.2 Value Clipの仕組み

    USDにおける**Value Clip(バリュークリップ)**は、
    アニメーションを構成する複数のUSDファイルを時系列に沿って参照し、シーンの中で時間的に変化する情報を効率的に管理するための機構です。
    アニメーションを一つのUSDファイルにまとめて記録することも可能です。ですがが、その場合単一としてのファイルサイズが大きくなります。
    容量が問題の場合Value Clipを用いれば、1フレームごとに分割したUSDファイルを必要に応じて動的に読み込むことができるため、パフォーマンスに優れたワークフローが構築できます
    例えば、次のようにフレームごとのUSDファイルを用意するとします:

    • animation_001.usd(フレーム1のデータ)

    • animation_002.usd(フレーム2のデータ)

    • animation_003.usd(フレーム3のデータ)

    • ...

    これらをValue Clipの設定ファイルで統合すると、
    再生時に適切なフレームのUSDファイルが自動的に読み込まれる仕組みなるという事です。

    Value Clipの構成要素はValue Clipは、以下の3つの要素で構成されています

    • テンプレートファイル(Template File)
      clipsという属性を持ち、各USDファイルを時間に応じて切り替えるためのルールを記述します。たとえば、animation_template.usdのようなファイルに、"1フレーム目はこのファイル、2フレーム目はこれ" といった具合にマッピング情報が記載されます。

    • トポロジーファイル(Topology File)
      各USDファイルに共通するシーン構造(プリミティブの階層や属性定義など)を記述したファイルです。これにより、個別ファイルの差分のみで時間的変化を表現できるようになります。
      この差分を読み込むというのがポイントで読み込む容量を抑えてスムーズな再生を可能にしていきます。

    • 各フレームのUSDファイル(Frame Data)
      実際に各フレームのジオメトリやアニメーションデータを格納したファイル群です。
      例:animation_001.usd, animation_002.usd, animation_003.usd など。
      一般的な画像連番と同じ扱いと考えていただいて大丈夫ですが、
      まだUSDファイルを連番として扱うことが難しいDCCもある事も覚えておいてください。

    ここまででValue Clipを使用すると、
    時間軸に応じた適切なファイル切り替えを可能にし、
    制作環境全下でスムーズなプレビューやレンダリングを実現できるという事が分かってきました。

    4.3.3 USDシーケンスファイルを読み込む方法

    先述した通りUSDシーケンスファイルをHoudiniで読み込むには、専用ノードを用いるのが推奨されています。
    2つのノードを紹介いたします。

    Geometry Sequence LOPの場合
    このノードは、名前の通りジオメトリのシーケンスを扱うためのノードですが、内部的には File SOP を用いて指定されたパスのシーケンスを読み込んでいます。USDファイルを直接扱う場合、SOPレベルでUSDジオメトリをポリゴンとしてアンパックする処理が必要になります。
    この作業は自動では行われないため、Unpack USD SOP などのノードを手動で追加して、表示・編集可能なポリゴンジオメトリに変換する必要があります。

    画像
    Unpack USD SOPの追加場所を示した例

    Geometry Clip Sequence LOPの導入(Houdini 20.0以降)
    さらにHoudini 20.0からは、より簡易にUSDシーケンスを扱えるノードとして Geometry Clip Sequence LOP が追加されました。このノードを使うと、Value Clipの設定や再生の管理がより直感的になります。

    使用時のポイントは以下の通りです:

    既存のシーケンスファイルを使用する場合
    「Get Geometry From Second Input」のチェックを外し、「Load Clip File Path」から対象のシーケンスファイルを指定します。

    Clip Primitive Pathの設定
    Value Clipを適用する対象のプリミティブパスを指定します。シーン内のすべてのプリミティブを対象にしたい場合は、ルート(例:/)を指定してください。

    画像

    読み込み速度の比較
    ここまで解説してきた内容を踏まえ、実際にHoudini上でSubLayer LOPノードとGeometry Clip Sequence LOPノードを用いて、同一のUSDシーケンスファイルを読み込んだ際の再生速度の違いを比較検証しました。

    USDシーケンスの読み込み比較

    ▼シーケンス情報
    シーケンス長:24フレーム(1フレーム1ファイル)
    ファイルサイズ:4.72 GB (1フレームあたり201 MB)
    データ内容:中ポリゴンキャラクター150体(デフォーマー設定なし)
    再生範囲:全フレームを1回再生

    ▼テスト環境
    Software:Houdini FX Version 20.5.370 py3.11
    Operating System:Microsoft Windows 11 Home x64
    Processor:13th Gen Intel(R) Core(TM) i7-1360P
    RAM:32GB
    Number of Cores:16
    キャッシュ配置場所:ローカルSSD上

    上記の条件でSubLayer LOPとGeometry Clip Sequence LOPを使用した場合の比較結果が以下になります。

    ▼SubLayer LOP

    画像
    SubLayerからシーケンスを読み込んだ場合
    (※15秒以上のGIFをアップロードできない制限があるため、16秒以降はカットしています。)

    プレビュー時間:約30秒 (24フレーム)
    読み込みの特徴:フレーム切替ごとにアクセスが発生するため、再生速度が低下する


    ▼Geometry Clip Sequence LOP

    画像
    Geometry Clip Sequenceからシーケンスを読み込んだ場合
    (※15秒以上のGIFをアップロードできない制限があるため、16秒以降はカットしています。)

    プレビュー時間:約20秒 (24フレーム)
    読み込みの特徴:Value Clipの事前キャッシュが効く


    考察結果
    Geometry Clip Sequence LOP ノードは、USDシーケンスの再生において非常に高いパフォーマンスを発揮することが確認でき、これに対してSubLayer LOP ノードは、特定の条件下では使用可能ですが、シーケンス再生を前提としたワークフローには適していないと言えるでしょう。

    まとめ

    • SubLayer LOP ノードの特性

      • 本質的には静的な USD ファイルの読み込みを目的として設計されている。

      • フレームごとに異なるファイルを読み込むような「時間的に変化するパス」には最適化されていない。

      • そのため、再生時に毎フレームごとにディスクへのランダムアクセスが発生し、Houdini 内部でのステージ更新にも余計な負荷がかかる。

    • Geometry Clip Sequence LOP ノードの特性

      • Value Clip 機能を用いた構造で、時間ごとのファイル参照を最適化している。

      • 事前に定義された参照情報を内部でキャッシュすることで、シーケンシャルなアクセスが可能。

      • 結果として、メモリ使用量の削減や再生のスムーズさにおいて明らかな優位性がある。

    すこしづつですがUSDの特性をお伝え出来てきたかと思います。
    次回は最初にお伝えした、同時並行作業を目指すにあたり
    USDが持つ、特製のレイヤーを掘り下げていこうと思います。


    あなたへのおすすめ