Skip to main content

SOLARISでLOD付きアセットをつくる

USD AdventCalendar2022 21 日目は、Houdini SOLARIS を使用して、お手軽に LOD 付きアセットを作る です。

SOLARIS には、デフォルトで Create LOD ノードが用意されていて
簡単に LOD 付きアセットを生成できます。

今回は、このノードを使用して LOD の設定をしつつ、 AutoSelect でカメラ距離で
切り替えながら、どんな構造になっているのかを
見ていきたいと思います。

Create LOD

まずは Create LOD で LOD を作ります。

Create LOD ノードを作り、LOD を作成したいアセットを接続します。
この時注意が必要なのは、
Input で読み込むノードは「Reference で読み込まれたもの」である必要があります。
(理由は後述)

接続したら、Number of LODs を、作成したい段数にして
あとは各段ごとの形状を維持する値(リダクション具合)をパーセントで入力します。
今回の場合は 4 段なので 100 75 50 25 と入れておきます。
レベルごとの VariantName は、特に指定がなければ LOD_1 2 3... のようになっていきます。

これで、 PrimitivePath で指定した Prim に対して model という名前の VariantSet が 作成され、

VariantSet を切り替えることで、自動でリダクションされた LOD が生成されます。

内部的には、 sopmodify ノードを使用して、SOP 内にジオメトリを持ち込み、 polyreduce ノードでリダクションをかけています。

注意点

地味にはまった(なかなか LOD ができなかった)ポイントが「input は Reference にしておく」
という部分でした。
これは LOD というより USD のコンポジションの順番に起因するもので
リファレンスを使用せず、Local のモデルを Input に渡してしまうと
Local は VariantSet より強いので
ベースモデルの主張のほうが強くなり、VariantSet に対して作成される
リダクションの GeomMesh よりも
Local のベースモデルのほうが強くなってしまうからです。

(ただ、USD の仕様だったり ComponentEditor のしくみを考えると問題はないと思う)

AutoSelectLOD

LOD ができたら、自動で切り替えられるように AutoSelectLOD を追加します。

まず、カメラを作り、その次に AutoSelectLOD を作ります。

AutoSelectLOD に、VariantSet を含む PrimitivePath と VariantSet 名(デフォルトだと model)、
対象カメラを指定し Number of LODs に対して作成済の LOD の段数をいれます。

そして、あとは ThresholdDistance を入れていきます。
最上段は 0 にします。
そこから、対象とカメラがどの程度離れたら切り替わるのかという閾値を入れていきます。
サンプルだと 5 刻みにしていますが、この場合はかなりカメラと対象が近い状態で 切り替わります。

無事追従できました。

まとめ

AutoSelectLOD は、CreateLOD で作成したモデルに限らず
USD の VariantSet に対して自動切り替えを作ってくれます。
CreateLOD だと、ある程度はいい感じにリダクションしてくれますが
実用に耐えうるものにしようとするとやはり自作したくなります。

ですが、そういった場合も
決められた名前の USD の VariantSet として LOD を作成しておけば
AutoSelectLOD を使用して、LOD の切り替えをつけることができます。

この場合は、Local には Mesh を置かずに Variant のみに記述するようにすれば
リファレンスではなくても OK ですし、
LOD の全段を、別レイヤー化してリファレンスした上で VariantSet にするなど
柔軟に構築することも可能です。