メインコンテンツまでスキップ

バリアントセットについて

バリアントセットとは、プリムに対していわゆる「複数の選択肢から 1 つを選んで切り替える」
スイッチをつけることができるコンポジションアークです。

具体的にどういうものかを、お約束の公式サンプルキッチンセットのアセット下から
assets/Book/Book.geom.usd
を開きます。

開いたら、Book プリムを選択して、MetaData タブを確認します。

その中に「shadingVariant variant」という項目があります。

この項目を切り替えると、色を変えることができます。

このように、いくつかの選択肢から 1 つを選ぶとプリムの中身をスイッチできるのが「バリアントセット」
です。

基本構造

#usda 1.0

def "testPrim" (
prepend variantSets = "hogehoge"
)
{
}

バリアントセットは、切り替えを追加したいプリムに対して追加します。
このサンプルを usdview で表示すると

このような testPrim に

空の variant が追加されました。

切り替え設定を追加する

#usda 1.0

def "testPrim" (
variants = {
string hogehoge = "green"
}
prepend variantSets = "hogehoge"
)
{
variantSet "hogehoge" = {
"blue" {
string testAttr = "blue"
}
"green" {
string testAttr = "green"
}
"red" {
string testAttr = "red"
}
}
}

なんの選択肢もない場合はただの空の入れ物だけがある状態なので
これに対して選択肢を作成します。

これで、アトリビュートの切り替えができるようになりました。

L と V の関係について

前回の Local と Inherits のように、このバリアントもコンポジションアークなので
原則によってアトリビュートやプリムが決定するわけですが

#usda 1.0

def "testPrim" (
variants = {
string hogehoge = "green"
}
prepend variantSets = "hogehoge"
)
{
string testAttr = "????"

variantSet "hogehoge" = {
"blue" {
string testAttr = "blue"
}
"green" {
string testAttr = "green"

}
"red" {
string testAttr = "red"

}
}
}

このようにしてみるとどうなるかというと

アトリビュートの値は、 ???? になっているのがわかります。
この状態で variant を切り替えても値は変わりません。
つまりは、この ???? の行の部分が Local の指定で
V よりも強いため値が上書きされていることが分かります。

子プリムの切り替え

上の例だと、プリムにあるアトリビュートをセットする機能にも見えますが
そういうわけではなく、

#usda 1.0

def "testPrim" (
variants = {
string hogehoge = "green"
}
prepend variantSets = "hogehoge"
)
{
variantSet "hogehoge" = {
"blue" {
def "Blue"{}
}
"green" {
def "Green"{}
}
"red" {
def "Red"{}
}
}
}

このように、各バリアントセットの設定部分に対してプリムを定義することで プリムの構造そのものを複数のパターン持つことが出来ます。
このサンプルでは 1 階層ですが、もちろん子・孫、そのプリムに対してのアトリビュートもつけられますし
このバリアントセットのスイッチ内に別のコンポジションアークを追加することができます。
(このあたりは次回のリファレンスにて紹介)
切り替えできるものがアトリビュートに限らず、構造そのものをまるごと切り替えできるのが
バリアントセットの強力な機能になります。