Houdini Advent Calender2018 12月12日枠に参加!
RBD Packed ObjectのAcitve制御と初速度の継承について、いくつかの方法をPick Upしてみました。
試しにこんなのを作ります。
以前、「徐々に壊れる破片」についての記事を書きましたが、これはその応用で、各破片がActiveになった瞬間に吹っ飛ぶシミュレーションです。
吹っ飛ぶためには初速度が必要なのですが、それは元ジオメトリに速度vとしてあらかじめ設定したものを継承して使います。
このようなシミュレーションを行う方法はいくつかあるので、それらをまとめて紹介するのがこの記事の目的です。
初めの動画のような結果を得るためには、破片がActive状態になると同時に初速の継承を行う必要があります。
以下、その方法を楽な順に三種類示します。
文字と絵の解説だけじゃよく分からぬと思うので、サンプルファイル付けときます。
サンプルファイル SampleFile→ InheritVelocity_SampleFile.hiplc
方法1:Inherit Velocity
もっともスマートだと感じたのが、この手法。
SOPで設定したactiveアトリビュートと速度vを継承するというもの。
以下、ネットワーク概要。
ネットワークは結構普通なのだけど、Packed RBD Object(DOP)をちょいと設定する必要あり。
設定方法は以下の通り。
- Packed RBD Object(DOP)のパラメータ「Initial Object Type」が”Create Animated Static Object”または、”Create Deforming Static Object”、”Create Deforming Active Object”のどれかに設定。
- Overwrite Attribute…を有効にする。
- 次に、Packed RBD Object(DOP)のパラメータ”Inherit Velocity from Point Velocity”を有効にする。
この3つを設定すれば、Packed RBD Object(DOP)がアクティブになった瞬間に、速度(v)が元ジオメトリから継承されて、ふっとぶ。
ちなみに、[1]のパラメータ「Initial Object Type」の設定は、ジオメトリの”active”、”animated”、”deforming”ポイントアトリビュートの値を変更しているだけなので、破片の元ジオメトリにwrangleやなんかで、これらアトリビュートをつけて値を操作してもOK。
でもこの方法、以前は出来なかったはずなのです、絶対!
どうやら、Houdini16.0.491から出来るようになったとか。Changelogsに書いてあるそうです。
こんなん、気付かんよ!って感じです。
方法2:SOPとWrangleを駆使して初速vを作る
二つ目の方法は、シミュレーション内でGeometry Wrangle(DOP)を使って、破片がactiveになった瞬間に元となるSOPの破片から速度情報を読み込んでくる、というものです。
ネットワークはこんな感じ。
cgwikiで紹介されているのも、この手法。
1フレーム前の情報と比較して情報が変化した瞬間を判定するのは、これに限らずよく使ってます。
方法3:DOP内で”Active”も”v”を継承させる
ActiveのON/OFFの切り替えと速度の継承の両方ともDOP内でやってしまうのがこの方法。
ネットワークはこんな感じ。
あまり使わないです。
以前、「(Packed RBD Objectの)、Activeが1になった際に最初だけ初速をつけることはできるか否か」というお便りを頂きまして、ちょうど良い機会なのでまとめた次第です。
以下、参考URL
https://forums.odforce.net/topic/31356-inherit-velocity-rbd-packed-object/
https://forums.odforce.net/topic/25884-houdini-dop-inherit-velocity/
Houdini Advent Calender2018 12月12日枠
https://qiita.com/advent-calendar/2018/houdini
先月からHoudiniを勉強しはじめた初心者です
こういったスフィアなど仮のジオメトリーをトリガーにして行った破壊を、キャラが行ったように見せるショットを作成するとして。
飛び散った破片が Alembic で読み込まれているキャラのジオメトリーを貫通してしまうのを回避したくて、上の図の Inherit_V_continue_SIM 内で
Collisions→DeformingObject や キャラ自体も RBD PackedObject にする等を試してみたのですが、うまくいきません。
こういった場合はどのように対処するのがよいのでしょうか?
お知恵をおかしいただけると、たいへんたすかります。
どういった物を作られ、どういったネットワークを構築されているのか文章からは測りかねるのですが、DOP内で衝突オブジェクトを設定するアプローチで合っていると思います。
SideFXの公式ページに日本語フォーラムがありますので、そちらに問題のシーンファイルを添付して質問すると、きっと誰かが答えてくれると思いますよ。
https://www.sidefx.com/forum/71/
いつも記事読ませて頂いておりますm(_ _)m
こちらの記事を参考にして勉強させて頂いたのですが、リジッドボディで破片を飛ばした後の回転や移動が止まりません…
この地面に落ちた後の破片の挙動を静止するにはどのような方法があるのでしょうか?
破片の停止は、RBDでのシミュレーションなら”RBD Auto Freeze(DOP)”というノードがあります。
しかしこのノードはBulletシミュレーションでは機能しません。
Belletの場合は、自分で条件を付けてactiveアトリビュートの切り替えで止めたりでしょうか。
odforceにそれっぽいスレッドが立っているので、そちら参考にしてみてはいかがでしょうか?
https://forums.odforce.net/topic/20776-how-to-freeze-bullet-objects/
ありがとうございます!!こちらで試してみたいと思います!
英語のページに中々慣れずに情報を上手く探せませんでした・・・
詳しい情報を教えていただき大変ありがとうございます!