Skip to content

SOLARIS で VariantSet

HoudiniSOLARIS で VariantSet を作りたい場合の方法について、
作り方がわかりにくかったのでメモ。

まず、VariantSet は USD のコンポジションアークの1つで、
USD の説明詳細は CompArc(3) バリアントセット にまとめてあります。
かんたんに説明すると、ある Prim に対してスイッチを作る事ができる機能です。

こんなかんじで、ある Prim に対してスイッチを作り、

切り替えられるようにできます。

このサンプルの場合、スフィアとキューブとコーンのモデルを
スイッチできるようにしています。

SOLARIS の VariantSet ノードについて

SOLARIS で VariantSet を作りたい場合は、

ノードは Add Variants to Existing Primitive と Add Variants to New Primitive
のいずれかを使用することで作ることができます。

VariantSet を作るというのは同じですが、この2つでは若干得られる結果が
変わります。

Add Variants to New Primitive

まずはこちらから。
こちらのノードはその名の通り VariantSet で新しいノードを作り
切り替えをできるようにします。

使い方はとてもかんたんで、input2 に対して
切り替えするモデルをコネクトします。

設定はデフォルトのままで OK です。

出来上がった結果のシーングラフ。
Primitive Path で指定した場所に(この場合 addvariant1)に対して
VariantSet が追加されます。
特徴は、この Primitive Path で指定した Prim の子に対して
input2 で入力した Prim のうち選択されているもののみ表示されます。

この VariantSet がどのように作られているか Inspect Active Layer で確認してみると

Primitive Path 以下に VariantSet が作られ
その VariantSet 以下の各選択肢に対して、input2 で入力した Prim が
作られています。

なので、シーングラフをみると選択されている Prim がけが表示されている状態
になっているわけですね。

Add Variants to Existing Primitive

対して、もう一つの Existing Primitive。
こちらは Existingとあるとおり、すでにあるシーングラフの Prim に対して
VariantSet で設定を変更するような場合に使用します。

まず、同じような挙動をするようにノードを構築。

まず、Graft を使ってある Prim 下に切り替え用 Prim を配置しておきます。

結果。
variant ノード以下に 3 つの Prim が配置されました。

その variant Prim を VariantBLock に対してコネクト。

Prune を使用して、表示したい Prim 以外は非表示になるようにします。

Prim をみると、Prune ノードの効果で指定 Prim 以外は非アクティブになっています。

そして、 VariantBlock End ノードの Primitive Path を
入力に入れた Primitive Path (variant)に変更します。

最後に、 input1 に対して Graft ノードをコネクトします。

結果。
先ほどとは違い、全部の Prim が variant 以下にあるものの
VariantSet で選択された Prim のみが Active になった状態になります。

中身を確認してみると、
VariantSet 下の選択肢の中は active の変更ののみが入っていて、
Prim 定義自体は VariantSet 外に定義されています。

つまり、 VariantBlock のノードで挟まれている間部分のみの差分が
VariantSet 内に定義サれるのが Existing Primitive ということになります。

なので、

こんな感じで input1 に何も入力されていない場合

こんな感じで over になっているので

Prim の定義がないためモデルが表示されない状態になってしまいます。
(これにきづけずめっちゃハマる)

まとめ

SOLARIS 内で構築されたシーングラフに Variant を入れたい場合は Exists で
Variant を定義することによって、差分情報のみでコンポジションが作れる...
というのに今回調べていてようやく気が付きました。
(こちらのパターンを使うほうが多そう)

New のほうは、Reference でモデルを読んできてから...とか
そういうパターンで使うのがメインになる感じと想像していました。

使い分けることによって、いろいろなバリエーション構築が
できるようになりそうです。