Day 2-1 : RBD : オブジェクトを砕く ですべての破片がばらばらに砕け散るように設定しました。
しかし実際には、衝撃の強さに応じて 部分的に砕けず残る部分も出てくるはずです。どうすれば実装できるでしょうか?
現在、Voronoi Fracture によって紐づいている各ピースを、のり付けするようなイメージでお互いに拘束 ( Constraint ) します。
その上で一定以上の力が加わった場合に拘束が外れるようにしてあげれば 実装できそうです。
前回の作例を改造して、部分的に割れないようにしてみましょう。
DOP Network との紐づけに利用していた Null ノードから Connected Adjacent Pieces ノードを作成して接続します。
これは隣接する破片間にラインを作成するノードです。
そして Connection Type を Adjacent from Surface Points に変更しましょう。
これはラインを作成する時、破片の重心がラインの起点になるモードです。
このように特定の条件を満たしている 破片同士を ラインで結ぶことができます。
Search Radius の値を増やすと 離れた破片もエッジで接続するようになります。
Max Connections は 一つの破片から結ぶエッジの最大本数を指定する項目です。
Max Search Points は小さくすると隣接する破片を検索する際の処理負荷が下がりますが、精度も落ちてしまいます。
今回は Search Radius を 0.2, Max Search Points を 3, Max Connections を 2 に変更します。
Adjacent from Surface Points の下に Attribute Create ノードを接続します。
これは任意のアトリビュートを付与できるノードです。
ここでは constraint_name と constraint_type の 2 つのアトリビュートを付与したいので Number of Attribute は 2 にします。
constraint_name は同様の処理を複数設定する際に 他と区別するための名づけです。
constraint_type は拘束条件です。 移動だけ、回転だけなど、拘束条件を指定できます。
新しく作成した 2つのアトリビュートをそれぞれ設定していきます。
片方は Name を constraint_name, Class は Primitive, Type は String, String に Glueと設定します。
もう片方には Name を constraint_type, Class は Primitive, Type は String, String に allと設定します。
ジオメトリスプレッドシートでも確認しておきましょう。
Primitives モードに切り替えると今回設定したアトリビュートが追加されていることが確認できます。
設定した項目を DOP 階層に引き渡したいので null ノードから DOP Network の 1 番左のコネクタに接続します。
また Attribute Create ノード から DOP Network の左から 2 番目のコネクタに接続します。
これでSOP 階層での設定はおしまいです。
DOP Network 内部の設定をしていきます。
まずは Glue Constraint Relationship ノードを作成します。これは 拘束の強度などの各種パラメータを設定するためのノードです。
Strength の値を大きくするほど 強力にのり付けされるようになります。ここでは 5000 と設定します。
また Data Name は 先ほど constraint_name で設定したのと同じ Glue としておきます。
Gravity ノードと Merge ノードの間に Constraint Network ノードを接続します。
Constraint の対象を SOP階層から受け取るためのノードです。
コネクタが3つあるので真ん中のコネクタに Glue Constraint Relationship ノードを接続します。
Constraint Network ノードの SOP Path で 先ほど設定したラインを受け取るのですが、受け取り方が 2 つあります。
1 つは Attribute Create ノードのパスを直に書き込んでしまう方法です。
分かりやすいですがノード構造を変更したときにパスを改めて書き直す必要が出てくるかもしれません。
もう 1 つは エクスプレッションパスを使用する方法です。
`opinputpath("..",1) と記載することで DOP Network の左から 2 つ目に接続したパスを読み取ることができます。
変数に 1 と書いてあるのに 2 番目に接続したノードを読み取るのは少し変な気がします。
Houdini に限らず プログラミング言語は 0 からカウントするので 一番左が 0, 2 番目が 1 となるのです。
エクスプレッションパスを指定するのに使った記号「 ` 」ですが、これは Backtick と呼びます。
Shift + @ で入力することができます。普段使わない記号なので初めて使う人は覚えておきましょう。
また この後出てくる VEX などで使いそうな記号についても読み方と入力方法を紹介しておきます。(いずれも JIS キーボードの場合です)
「 " 」ダブルクォートといいます。 Shift + 2 で入力できます。
「 ' 」シングルクォートといいます。 Shift + 7 で入力できます。
「~」チルダといいます。Shift + ひらがなの「へ」で入力できます。
その他にもいろいろな記号があります。
興味がある人はこちらを参照してみましょう。
プログラミング言語 記号比較 - https://www.ne.jp/asahi/hishidama/home/tech/lang/symbol.html