Houdini 18 SOP No.26 “Switch-if SOP”


~“Switch-if SOP”~

前回に引き続きHoudini18.0にて新規に追加されたSOPノードの解説を行います。
前回の記事をご覧になられていない方はこちらからご覧ください。

※本記事ではHoudini 18.0.460を使用しています。

今回はSwitch-if SOPについて説明していきます。

 

Switch-if SOP

このノードは、Houdini 18.0にアップデートされた際に新しく追加されたノードとなります。
このノードの機能では、エクスプレッションまたは入力されたジオメトリをテストし、出力を第一入力と第二入力で切り替えることができます。

このノードは、Switch SOPと似た機能を持っています。Switch SOPは、入力に2つ以上の接続が可能であり、入力されたものをパラメータによって切り替えることができます。しかし、このSwitch-if SOPには入力が2つしかありませんが、ある程度細かく条件を設定した切り替えを行うことができます。

それでは詳しく説明していきます。

まず初めに、このノードと同系統のノードである「Switch SOP」について説明します。

「Switch SOPは」入力されたノードを数値によって切り替えるものとなります。
入力された順番で0番から番号が振られ、「Switch SOP」内のパラメータを切り替えることによってその数値に適応した入力ジオメトリをアウトプットします。

 

では「Switch SOP」の使い方を説明します。

例として下のような3種類のジオメトリの切り替え方法を説明します。

このジオメトリを全てSwitch SOPに入力します。

入力されている順番が「Box1」、「Sphere1」、「Tube1」の順番となっています。
入力された順番で
 「Box」:0
 「Sphere」:1
 「Tube」:2
が割り振られます。

この数値に合わせてパラメータを変更することでアウトプットを変換することができます。

下のパラメータの赤く囲われた「Select Input」を変更することでアウトプットを変換することができます。

下のパラメータの赤く囲われた部分は入力されたノードの順番が示されています。

今回は「Box1」、「Sphere1」、「Tube1」の順番で接続されているため、下の画像のように上から「Box1」、「Sphere1」、「Tube1」となっています。

※この順番を変更することによって入力された順番を変更することができます。

「Select Input」を変更した際の出力結果が下のようになります。

このように入力されたノードの出力を数値によって変更することが可能となります。
今回は入力したノードは3つでしたが、それ以上でもスイッチを行うことができます。

以上が「Switch SOP」の説明となります。

 

それでは話を本題に戻しまして、「Switch-if SOP」の説明を行います。

まず初めにパラメータを確認します。
パラメータは下のようになります。

「Use Second Input If 」
 プルダウンによって選択できるタイプの結果に基づいて、第二入力に切り替えるかを設定することができます。
このプルダウンには4種類のタイプがあります。具体的には下のようになります。
 “All Conditions True”
  すべてのテストがTrueまたは0以外となった場合に第二入力に切り替えます。
 “Any Condition True”
  どれかのテストがTrueまたは0以外となった場合に第二入力に切り替えます。
 “All Conditions False”
  すべてのテストがFalseまたは0となった場合に第二入力に切り替えます。
 “Any Condition True”
  どれかのテストがFalseまたは0となった場合に第二入力に切り替えます。

「Test Input」
 テストを行う対象を選択することができます。
 “First Input”
  第一入力に接続されたジオメトリをテストします。
 “Second Input”
  第二入力に接続されたジオメトリをテストします。
 “Spare Input 0”
  指定されたノードのジオメトリをテストします。
  (パラメータ一番下にある「Spare Input 0」で指定したノードをテストします)

「Number of Tests」
 切り替えを行うかを決めるテストの数を指定することができます。
 プラスマイナスを押すもしくは数を指定することによって行うテストの数を変更することができます。 

「Test Type」
 「Number of Tests」によって作成されたテストの実行するタイプ設定します。
 この設定は5種類あり、各設定によりアトリビュートを利用してコンポーネントによる切り替えを行うことができます。

以下がその各設定の説明となります。

 

 “Expression”

  Enableパラメータ内のエクスプレッションを用いてテストを行います。
  そのエクスプレッションが0以外の値の場合はTrueと見なされます。

 

 “Attribute Presence”

  指定した名前のアトリビュートがジオメトリ内に存在するかどうかをテストします。 これを選択した場合に出てくる“Enable When”、“Class”、“ Attributes”のパラメータを用いて、どのアトリビュートに対してテストを行うかを設定することができます。
   “Enable When”
    All Attributes Present
     指定されたアトリビュートが全て含まれている場合に切り替えます。
    Any Attributes Present
     指定されたアトリビュートが1つでも含まれている場合に切り替えます。
    All Attributes Absent
     指定されたアトリビュートが全て含まれていない場合に切り替えます。
    Any Attributes Absent
     指定されたアトリビュートが1つでも含まれていない場合に切り替えます。

   “Class”
    指定するアトリビュートのタイプを選択できます。

   “Attributes”
    テストを行う際のアトリビュートを指定します。

 

 “Element Count

  ジオメトリ内のコンポーネントの数に基づいてテストを行います。“Enable When”、“In Group”、“Is”、“Value”のパラメータを使ってテストを行うかどうかを設定することがでできます。
   “Enable When”
    Number of points
     ポイントの数を対象とします。
    Number of Primitives
     プリミティブの数を対象とします。
    Number of Vertices
     バーテックスの数を対象とします。

   “In Group”
    コンポーネントの数を指定します。

   “Is”
    Equal to
     “In Group”で指定した数と等しい場合に変更します。
    Not Equal to
     “In Group”で指定した数と等しくない場合に変更します。
    Greater than
     “In Group”で指定した数よりも大きい場合に変更します。
    Less than
     “In Group”で指定した数よりも小さい場合に変更します。
    Greater than or Equal to
     “In Group”で指定した数以上の場合に変更します。
    Less than or Equal to
     “In Group”で指定した数以下の場合に変更します。

   “Value”
    “In Group”を指定していない場合は、この数値によって変更を行うかどうかの数値を設定することができます。

 

“Attribute Value”

  ここで指定したアトリビュートの 最初の値が特定の値に合致するかをテストします。“Class”、“Attributes”、“Of Type”、“Is”、“Value”のパラメータを使って、このテストを行うかどうかを設定することができます。
   “Class”
    対象のアトリビュートのタイプを指定することができます。

   “Attributes”
    テストを行う対象のアトリビュートを指定することができます。

   “Of Type”
    数値もしくは名前のどちらでテストを行うかを選択することができます。    

   “Is”
    Equal to
     “Value”で指定した数と等しい場合に変更します。
    Not Equal to
     “Value”で指定した数と等しくない場合に変更します。
    Greater than
     “Value”で指定した数よりも大きい場合に変更します。
    Less than
     “Value”で指定した数よりも小さい場合に変更します。
    Greater than or Equal to
     “Value”で指定した数以上の場合に変更します。
    Less than or Equal to
     “Value”で指定した数以下の場合に変更します。

   “Value”
    アトリビュートの数値の設定と名前の設定を行うことができます。
    (“Of Type”がNumberの場合は数値、Stringの場合は名前を指定)

 

“Input Wired”

 Test Input で指定した入力にジオメトリが接続されていればTrueを返します。 
 Test Input が”Spare Input 0″であった場合は、Spare Inputパラメータで指定したパスにノードが存在すればTrueを返します。

以上がパラメータの説明となります。

 

では実際の使い方の例を紹介します。

まず初めに全てデフォルト設定の場合です。

下の画像のような2つのジオメトリをスイッチしていきます。

パラメータの変更を行わず下の画像のように第一入力にBox、第二入力にSphereを入力します。
このように変更を行わずに接続した場合このノードは通常の「Switch SOP」と同様の機能となります。

下の画像のように「Enable」を変更することによって通常のSwitch SOPと同じようにジオメトリをスイッチすることができます。

 

次にアトリビュートを保持している場合の切り替え方法を説明します。

切り替えに使うジオメトリは、先ほどと同じ下の画像のようなジオメトリを使用します。

先ほど同様に第一入力にBox、第二入力にSphereを入力したSwitch-if SOPを作成します。
そのあとにBoxと第一入力の間に新しく“test01”というStringのアトリビュートを加えます。

その後にSwitch-if SOPの
 「Test Type」を“Attribute Presence”
 「Attributes」を“test01”
に変更します。

そうすることによって第一入力のジオメトリが“test01”というアトリビュートを保持している際に出力を第二入力のジオメトリに変換することができるようになります。

以上が実際の使用例とSwitch-if SOPの説明となります。

 

では最後に「Switch SOP」と「Switch-if SOP」の比較を行います。

各ノードで、プリミティブの数が任意に設定できるパラメータよりも大きくなった場合に入力を切り替える設定を行います。

各ノードで切り替えに使うジオメトリは下の画像の物となります。

左側にあるBoxを基準としてこのボックスのプリミティブ数よりも任意に設定できる数値が大きくなった場合に入力を切り替えるように設定します。

 

「Switch SOP」

通常の「Switch SOP」では「Attribute Wrangle」を使用する必要があります。
下の画像のように「Box」と「Switch SOP」の間に「Attribute Wrangle」を挿入します。

挿入された「Attribute Wrangle」に条件を設定していきます。

i@prim = nprimitives(0);
int number = chi("number");
int change = 0;

if(i@prim < number)
    i@change = 1;
else    
    i@ccange = 0;

中身はこのようになっており、入力されたジオメトリのプリミティブ数を所得し、その数値が任意で設定可能か「Number」よりも小さい場合は「change=0」、大きい場合は「change=1」を返すように設定しています。

ここで設定された「change」の数値を「Switch SOP」の「Select Input」に入力します。

prim(0, @primnum, "change", 0)

このようにエクスプレッションを記入することにより、「change」の値を用いて「Select Input」を変更することができます。

それにより下の動画のように「Attribute Wrangle」で作成して「Number」の数値を変更することで出力を切り替えることができま

このように「Number」がBoxのプリミティブ数の6よりも大きくなった際に出力が切り替わるようになります。

 

「Switch-if SOP」

「Switch SOP」とは異なり「Switch-if SOP」ではVEXを書く必要はありません。

「Switch-if SOP」と同様の順番でBoxとSphereを入力します。
その後に「Switch-if SOP」のパラメータを変更します。
 「Test Type」:Element Count
 「Enable When」:Number of Primitives
 「Is」:Less Than

このように変更することによって第一入力につないだBoxをテストし、任意に設定できる「Value」がプリミティブの数よりも大きくなった場合、出力を切り替えることができます。

こちらも「Switch SOP」同様に「Value」がBoxのプリミティブ数の6よりも大きくなった際に出力が切り替えられます。

 

この2つを比較すると、「Switch SOP」を用いた場合にはVEXが必要だった条件による切り替えを「Switch-if SOP」を用いることによりVEXを必要とせずに行うことができます。

このノードは、簡単に条件を付けた切り替えができるため、モデリングやシミュレーション、アニメ―ションといったような作業に幅広く用いることが可能です。

 

こちらの記事のhipファイルが以下のURLからダウンロードできますので興味のある方はご確認ください。
https://www.dropbox.com/sh/b2hgoq7rcic9mxl/AADuj9B50EF3ks5Hd-W8yO98a?dl=0