Houdini 18.5でのガイドシミュレーション


この記事は Qiita の Houdini Apprentice Advent Calendar 2020 (12/17)に投稿したものとなります。

  株式会社インディゾーンでインターンシップをしている三浦嘉大(みうらよしひろ)です。
Houdini Apprentice Advent Calendar 2020の12/17が空いていましたので書かせていただきました。

 

※本記事ではHoudini18.5.408を使用しています。

 Houdini18.5にアップデートされ、ガイドシミュレーションに新しい機能が追加されました。Houdini18.0まではガイドシミュレーションはSOP階層のみ(RBD Bullet Solver SOP使用時のみ)で使用可能な機能でした。
 しかし、Houdini18.5 では、従来のRBD Bullet Solver SOPを使用したガイドシミュレーションに加えて、新たに実装されたノードを使用することによってDOP階層内でもガイドシミュレーションを使用することが可能になりました。それによってSOP階層では設定の難しい処理(外力の設定など)を行うことが可能となり、RBDシミュレーションの自由度がさらに向上しました。

 Houdini18.5でこの機能を使用するために新しくSOP階層とDOP階層に1つずつ新しくノードが追加されました。
 そのノードが以下の2つになります。

SOP階層
 RBD Guide Setup SOP
DOP階層
 RBD Guide DOP

  使い方を簡単に説明すると、RBD Guide Setup SOPを使用してSOP階層内でガイドシミュレーションに使用するモデルを設定し、RBD Guide DOPでそれを読み込み、シミュレーションを行うという流れになります。

 では、実際にこの機能の詳しい使い方をHoudini18.0でのガイドシミュレーションと比較して説明していきます。

 

RBD Bullet Solver SOPを使用したSOPでのガイドシミュレーション

 まず初めに、従来までのRBD Bullet Solver SOPを用いたSOP階層でのガイドシミュレーションの方法を解説します。

 任意の形状のモデルを準備し、そのモデルを分割します。
 今回はRBD Material Fracture SOPを使用してモデルを分割します。

 次に、モデルを破壊する際のガイドとなるモデルを作成します。

※このガイドを作成する際に破壊するモデルと全く同じ形状のモデルを使用する必要はありません。ある程度近い形状のモデルであればガイドの機能を使用することが可能となります。

 今回はガイドとして以下の画像のようにモデルが2つに割れるような形状を準備していきます。

 では、ガイドのジオメトリの作り方を説明します。

 まず初めに、破壊するオブジェクトに近い簡単なモデルを作成するために、「Bound SOP」を使用して元のモデルのバウンディングボックスを作成します。

次に、作成されたボックスを分割します。

 今回分割する際には「Boolean SOP」を使用してモデルを分割します。その際に必要な面はGridをコピーすることによって作成します。

 この作成された面と、バウンディングボックスをBoolean(Subtract)することによって、以下の画像のような形状に分割します。

※この際のBooleanは立体と面でのBooleanとなるため、面側の入力(今回は第二入力側なので「Set B」のパラメータ)を「Solid」から「Surface」に変更する必要があります。

 このようにモデルが分割出来たら、このモデルを割るために左右のグループ分けを行います。今回はWrangleを用いて左右のグループに分けていきます。

 Booleanの下にWrangleを作成し、「Run Over」を「Primitive」に変更します。そしてVEXpressionに

  i@group_left = @P.z > 0;
  i@group_right = @P.z < 0;

 と入力します。
 これによってZ軸軸の数値によって左右にグループ分けを行います。

  このようにグループ分けが出来たら、グループごとに左右に広がるように「Bend SOP」を使用して曲げていきます。
 「Bend SOP」を2つ作成し、各Bendの「Group」に「left」、「light」と入力します。その後に、Bend、Taperに対してキーを打ちながらモデルに対してデフォームを行います。

 今回は1~48フレーム間で
  Bend:0~150
  Taper:1~2
 で動くようにキーを打っています。

 そうすることによって以下の画像のようなデフォームを作成します。

 以上のように「破壊するオブジェクト」、「ガイド用のジオメトリ」が準備できたら、シミュレーションを行うために、Houdini18.0にて導入されたSOP階層で破壊のシミュレーションを行うことのできる「RBD Bullet Solver SOP」を作成してつなぎます。

 第1入力から第3入力までにRBD Material Fracture SOPの各出力を、第5入力にガイドとして使用するジオメトリを入力します。

 このノードの1~3の入力は「RBD Material Fracture SOP」と同様に「Geometry」、「Constraint Geometry」、「Proxy Geometry」となります。第4入力、第5入力はそれぞれ「Collision Geometry」、「Guide Sim」となっており、コリジョンジオメトリやガイド用のジオメトリを読み込むことが可能となります(今回はガイドの機能を使用しますので、コンストレイン等は設定しなくても大丈夫です)。

 入力出来たらまずは地面を設定します。

 RBD Bullet Solver SOPのパラメータ内のSolver>Groundにて「Add Ground Plane」を「Ground Plane」に変更します。

 これにより、下の画像のように、無限に続く地面を作成することができます。

 次にガイドシミュレーションの設定です。

 同パラメーター内の「Guide Simulationタブ」で「Use Guides」にチェックをいれます。

 これによって第5入力に入力されたジオメトリの形状を参照したシミュレーションを行うことが可能となります。

 その結果が以下に画像になります。

 このようにしてガイドシミュレーションを行うことが可能です。

 こちらがHoudini18.0までのSOP階層でのシミュレーション方法となりす。

 このようにHoudini18.0ではSOP階層でシミュレーションを行うことが可能でした。しかしながら、SOPでシミュレーションを行う場合には外力(Wind Force DOPといったような力)等の設定が難しくなってしまいます。その為、DOPを使用した際のようにDOP内で細かく外力の設定等を行ったようなシミュレーションを行うことが難しくってしまっていました。
 しかし、Houdini18.5ではこのシミュレーションをDOP内で行うことが可能となりました。では、次にDOPでのガイドシミュレーションの方法を説明していきます。

 

Houdini18.5でのガイドシミュレーション

 こちらは破壊するモデルの作成と、ガイド用のジオメトリの作成までは同様の方法となります。
 こちらでも以下の画像のように、先ほど説明した際と同様のオブジェクトを使用します。

 破壊用のオブジェクト

 ガイド用のジオメトリ

 

Houdini18.5でのガイドシミュレーション(SOP)

 この2つが準備できたら、「RBD Guide Setup SOP」を作成して繋げます。

 この「RBD Guide Setup SOP」は「RBD Bullet Solver SOP」内のGuideの機能をDOP内に読み込む際に使用するノードとなります。
 各入力は1~3番入力は「RBD Bullet Solver SOP」と同様に、「Geometry」、「Constraint Geometry」、「Proxy Geometry」となります。第4入力、は「Guide Geometry」となっており、「RBD Bullet Solver SOP」の第5入力と同様のつなぎ方をすることが可能で、ガイド用のジオメトリを読み込むことが可能となります。

 各出力は各入力に対応しており、「Geometry」、「Constraint Geometry」、「Proxy Geometry」、「Guide Geometry」を出力することが可能となります

※このノードのみではシミュレーションを行うことはできません。

 今回のガイドシミュレーションにはコンストレインとProxyジオメトリは必要ないので、第一入力にRBD Material Fracture SOPの第一出力を、第4入力にガイド用のジオメトリを入力します。

 さらに、DOPに持ち込んでシミュレーションを行うので、破片に対してパック処理を行います。

 RBD Material Fracture SOPとRBD Guide Setup SOPの間にAssemble SOPをつなぎ、赤く囲われた「Create Packed Geometry」にチェックをいれ、それ以外はチェックを外します。

そして、DOP階層に読み込む際の目印としてNullを作成しておきます。

この際にNullをつなぐのは第1出力と第4出力です。第1出力は入力されている破壊用のオブジェクトが出力され、第4出力からはガイド用のジオメトリが出力されます。

 第1出力からのNullは「OUT_PACK」、第4出力からのNullは「OUT_GUIDE」という名前に変更します(こちらは自分が分かりやすい名前にして大丈夫です)。

 そしてDOP Network SOPを作成します。

 以上でSOP階層での準備は終了となります。

 

Houdini18.5でのガイドシミュレーション(DOP)

 次にDOP階層での操作となります。 

 DOP階層内での操作は基本的なシミュレーションとほとんど同じになります。新しく「RBD Guide DOP」を作成してつなぐことによってガイドのシミュレーションを行うことができるようになります。

 では具体的な説明を行います。 

 まず初めに、DOP内に入り「RBD Packed Object DOP」を作成し、下の画像で赤く囲われている「SOP Path」でSOP階層にて作成したオブジェクト用のNullを指定します(今回は「OUT_PACK」を指定)。
 その後に、シミュレーションを行うためのSolverとして「Rigid Body Solver DOP」を作成し、「RBD Packed Object DOP」と接続します。

 接続出来たら、地面として「Ground Plane DOP」を作成し「Rigid Body Solver DOP」とマージします。

 そして、「Gravity Force DOP」を作成し、「Merge DOP」と「Output」の間に接続します。

 これで基本的な準備が出来ました。
 ここから「RBD Guide DOP」を追加してガイドシミュレーションを行います。

 「RBD Guide DOP」を作成し、「Rigid Body Solver DOP」の第2入力に接続します。

 この「RBD Guide DOP」はDOP内でガイドのシミュレーションを行う際に使用するノードとなります。このノードは「RBD Bullet Solver SOP」内のGuideの機能を使う際のパラメータを含んでだ物となります。このノードでSOP階層の破壊用のジオメトリと、ガイド用のジオメトリを読み込むことによって、DOP内でガイドの機能を使用すること可能となります。

 では詳しい設定方法を説明します。

 こちらが入力出来たら、「Inputsタブ」の「Guide Source」と「Geometry Source」の設定を行います。

 各設定の「SOP Path」に対してSOP階層で作成したNullを指定します。
「Guide Source」には第4出力からのNull(今回は「OUT_GUIDE」)を、「Geometry Source」には第1出力からのNull(今回は「OUT_PACK」)を指定します。

 以上の工程でDOP階層内でガイドシミュレーションを使用することが可能となります。

 その結果が以下の画像となります。

 このようにSOP階層でのガイドシミュレーションと同様にDOP階層内でガイドシミュレーションを使用することが可能となります。

 以上のようにHoudini18.5へのアップデートによって、DOP階層内で、ガイドジオメトリを使用したシミュレーションを行うことが可能となりました。

※この機能はSOPのガイドシミュレーションをDOPに読み込むための機能となります。
 その為,基本的に結果に差はありません.

 このように、Houdini18.0では行えなかったDOPでのガイドシミュレーションが可能となりました。DOPはSOPでは設定しづらい外力(風など)を追加することが可能となり,シミュレーションをさらに細かく設定することが可能となります。
その中にガイドの機能はなかったため,Houdini18.5にてガイドの機能が追加されたという点で,DOPの自由度がさらに向上しました。

 

ガイドジオメトリに関しての注意事項

 Houdini18.0、Houdini18.5でともに、ガイドのジオメトリを作成する際には注意が必要となります。それは

 「ガイドとするモデルが単一のジオメトリによるデフォーム等で設定されている場合にはガイドの形状が破綻する場合がある」

という点です。

 ガイドのジオメトリは先ほど説明していますが、正確に元の形状のジオメトリを使用する必要はありません。似たような形状を用いることによってガイドのシミュレーションを行うことが可能となります。

 例として今回説明してきたモデルと同じ形状で単一のポリゴンでガイドの機能を使用した際と、分割されたモデルを使用したガイド機能の比較を行います。

 まず初めに、今回の説明で使用した分割されたモデルでのガイドです。

 下の画像はガイドとして使用するためにデフォームを行ったモデルと、実際にガイド機能で使用されるモデル(RBD Guide Setup SOPの第4出力から出力されるモデル)の比較となります。

そしてこの状態でガイドのシミュレーションを行った結果が以下の画像となります。

 このように今回の説明で作成したようにモデルをBooleanによって分割し、その複数のジオメトリに対してデフォームを行い、それをガイドとして利用した際には、デフォームを行った物と非常に近い形状でガイドが作成され、シミュレーションを行うことが可能となります。

 では、次に単一のジオメトリに対してデフォームを行ったもモデルをガイドとした際です。

 下の画像は先ほどと同様に、ガイドとして使用するためにデフォームを行ったモデルと、実際にガイド機能で使用されるモデル(RBD Guide Setup SOPの第4出力から出力されるモデル)を比較となります。

この結果を見ると、ガイドで使用されるジオメトリがデフォフォームしたモデルの形状とかけ離れているのがわかると思います。

このように単一のジオメトリに対してデフォームを行ったものをガイドとして使用するとこのように、ガイドとして使用されるジオメトリの形状が正確に認識されない場合があります。

この状態でガイドのシミュレーションをかけたものが以下の画像となります。

このように、ガイドシミュレーションがうまく行かなくなってしまいます。

ここからわかるように、基本的にガイドのジオメトリは、複数のジオメトリによって構成されていなければ、このような曲げる等のようなシミュレーションをうまく行うことが出来ません。

こちらが、ガイドシミュレーションを行う際の注意点となります。