このチュートリアルは「【初心者向けHoudiniトライアル010】割れる前にひびがみえちゃう!RBD Disconnected Facesでばっちり修正!」の続きです。
使用するHoudiniバージョン
Houdini 18.0.460
ここまでの問題
何かが衝突してガラスが割れたシーンを作りました。ここでレンダリングして問題に気が付きます。
上のガラスに全くひびが入っていない!!!
RBD Disconnected facesによって、破片同士がくっついている場合、その間を削除してしまっているため、ひびを形成する破片がなくなりレンダリングに反映されていません。これではおかしいのでひびを残す部分も追加したいと思います。
破片間のひびわれグループを取り出す
- RBD Disconnected facesにてひびわれを削除するか決定しているためその前にあるsortからOutputをもう一つ伸ばし、Nullを接続します。
このNullの下でいくつかのひびわれを取り出していきましょう!
はじめに取り出したいひび割れは衝突した場所から放射状に広がっているひび割れです。
現在のGroupをビューポートで確認します。
- ビューポートでDisplay group and attribute listを有効にします。
- ビューポート右上にリストが表示されますが、歯車アイコンからPrimitivesグループのみを表示するように変更します。
様々なGroupができていることがわかりますが、この中にglass radialinsideというグループがあります。
このグループにマウスカーソルをあわせると必要な放射状に延びるひびわれであることがわかります。
- 先ほど追加したNullの下にsplitを追加します。
これは条件によりTrueとFalseの判断を行うことができます。ここで条件を設定します。
- Groupの右側にあるドロップダウンボタンから先ほど確認したglass_radialinsideを選択します。
ビューポートにはglass_radialinsideのみ表示されます。
この中から任意のプリミティブを選択します。
- Splitの左側の出力をクリックし、Groupを追加します。
- Group Namaにglass_cracksと入力します。
- これはプリミティブのグループなので、Group TypeはPrimitivesに設定します。
- Base Group横の選択ボタンをクリックします。
- 下記のように衝突した瞬間に発生させたいひび割れ部分を選択します。
横隣り同士を選択する部分も追加します。横並びでひびがはいればその間にもひび割れが入ります。
- Splitの右側の出力に新しいSplitをつなぎます。
- 2つめのsplitの条件はglass_concentricinsideに設定します。
このグループは同心円状のひびわれグループです。
- 先ほど作成したGroupを複製するために、Altキーを押しながらgroupをドラッグして話します。
- 複製したgroupを2つのSplitの左側の出力と接続します。
- Base Groupに入力された番号をすべて削除し、その後選択ボタンをクリックします。
- 放射状に入ったひびわれが横に並んでいる場所をつなぐひびわれを選択します。
- Mergeノードを選択し、2つのGroupノードをつなぎます。
- 2つ目のSplitの右側に3つ目のSplitを追加します。
- 3つ目のSplitの条件はglass_chippinginsideに設定します。
- 先ほどと同様にGroupノードを複製し、3つ目のSplitノードと接続します。
- Base Groupに入力された数字をすべて削除後、選択ボタンをおしいくつかの大きめの破片を選択します。
- 3つめのグループもMergeに接続します。
- 3つ目のSplitの右側出力を引っ張り、Altを押しながら何もない部分をクリックします。
ここではネットワークを見えやすくするためのDotを追加しました。
- Dotから、Mergeに接続します。
これで再度すべての破片とひびを統合することができました。
また、選択したひび割れはすべてglass_cracksというグループに登録しています。
このglass_cracksに登録したプリミティブはつながってないというように設定すれば問題は解決します。
RBD Connected Facesにてプリミティブがつながっているかどうかを格納するアトリビュートとしてFace Attributeというアトリビュートを追加しています。
RBD Connected Facesを確認するとデフォルトのままにしていたのでfaceidというアトリビュートに格納しています。
faceidに格納される値を確認します。
Unpackされるまでプリミティブアトリビュートを取得することができません。
- UnpackにDisplay フラグを設定します。
- Unpack上にマウスカーソルを置き表示されたリングからNode Infoを選択します。
- 表示されたウィンドウでfaceidをクリックします。
- ビューポートでビジュアライザが有効になり、faceidが表示されます。
この時削除されていない破片(間に入っているひび割れ以外)のfaceidは-1という数字で登録されていることがわかります。そのため、表示したいひび割れを登録したglass_cracksグループのプリミティブにも‐1を割り当てればいいことがわかります。
- glass_cracksを統合したMergeノードの下にAttribute Wrangleを追加します。
- Attribute Wrangleにて、下記のように設定します。
Groupはglass_cracksを指定
Run OverはPrimitivesに設定
VEXとして下記の指揮を入力します。
@faceid = -1 ;
glass_cracksに-1 を設定する前
glass_cracksに-1 を設定した後
これで任意のひび割れのfaceidを設定することができました。
後は、Sortして、RBD disconnected faceを追加します。
- unpackの下のsortとRBD disconnected faceを選択し、Altキーを押しながらドラッグして複製します。
- 複製したノードをAttribute Wrangleの下に接続します。
ここまでの結果をレンダリングしてみましょう。
- Render Viewを開き、Renderボタンをクリックします。
このように部分的なひび割れを残すことができました。
しかし、このままだと1フレームから結局日々がはいってしまいます。そこで、Switchノードを使用しひび割れが最初から入った状態と入っていない状態を切り替えます。
- ビューポートのビジュアライザをクリックしてオフにします。
- RBD Bullet Solverの中に入ります。
- 丁度Sphereがガラスに当たるフレームを確認します。
このシーンでは6フレーム目でした。
- RBD disconnected faceの下にSwitchノードを追加します。
- 次に最初からひび割れを追加したRBD disconnected faceをSwitchノードに接続します。
Swtichのパラメータを見ると下記のようになります。
0と1を切り替えて出力するためにSelect Inputに条件式を入力する必要があります。
先ほどSphereが衝突するフレームを確認したのでそれを条件に使用します。
- Select Inputに$F>5と入力します。
5フレームまでは0番目の入力が使用され、6フレームで1番目の入力に切り替わります。
5フレームまでは0番目が実線となり
6フレームからは1番目が実線となります。
- 5フレームをレンダリングするとひび割れがありません。
- 6フレームをレンダリングするとひび割れが・・・・!
ガラスが壊れたフレームまでいってレンダリングを行います。
壊れていない上の部分にもひびがはいっていていい感じ出すね!
ここまででRBD Material Fracture、RBD connected face、RBD Bullet Solverなどを使用した設定は終了となります。お疲れさまでした!