[Houdini] Fluid用衝突ジオメトリの作成

以前コバタロ先生と話してて、じゃあまとめますとか言った割りに放置してしまっていたネタです。
Fumeやパーティクルシミュレーションなどで使用する為の衝突用ジオメトリをHoudiniで作るというお話です。


たとえばFumeにキャラクタを衝突させて巻き込むような煙がつくりたい!!となったとします。
でもキャラクタのモデルはクソ重い!!複数のジオメトリで形成されているからシミュレーションがなんか変な感じになる!!なんてことはよくあるんじゃないかと思います。
(複数ジオメトリで〜、って方は、経験則から来る「どうせそうなるでしょ」的なノリで書いてるので違ったらすみません。)

こういう場合どういうメッシュが理想的かといえば、ワンスキンの軽量なメッシュ

実際にFumeでも重いメッシュと軽いメッシュでコリジョンテストをしたところ、
軽い方のが明らかに計算速かったです。
でも精密に調査したわけじゃなくて、作業中にちょっとやってみただけなので嘘だったらすみません(またか)。

あとパーティクルの場合、ワンスキンじゃないと、
あっ!鎧の間にパーティクルが挟まって抜け出せなくなっている!!!とかありそう。
もちろんワンスキンだろうと関係ない場合はありますが。形状によって。

しかしそういうメッシュが欲しいとは言え、まさか準備されているわけもないので、
大体の場合は自分で作るか、適当なものでごまかすかどっちかです。

そう言う場合に便利なのがHoudiniですよ奥様!!

まずはどういうものか説明してみます。
手元にいい感じのジオメトリデータがないので、いい感じのティーポットでやってみました。

これ見た感じでどうだこうだ、ってのはなかなか言い辛いというか、
ただポリゴン減らしただけにしか見えないので分かりづらいのですが、
何をしたかというと、こんな感じです。

1. ジオメトリをHoudiniに持ってくる
2. そのジオメトリの上にScatterSOPでポイントをばらまく。
3. 2のポイントの上にCopySOPでMetaballをコピーする。
4. 3をisooffsetSOPでポリゴン化。
5. 4で作られたポリゴンの、一番大きな塊を取り出す。(小さい塊は削除する)
6. 再度isooffsetをかけて、太ったジオメトリを元に戻す。
7. 5に対してPolyReduceSOPをかけて、軽くする。

こういう流れです。
頭から順に説明していきます。

1はそのまんまです。
FBXでもobjでもなんでもいいので、とにかくHoudiniにジオメトリを持ってきてください。

2では3のmetaballのcopyの際に使うポイントを作成します。
十分にハイポリなデータなら必要無いと思うかも知れませんが、普通レンダリングで使用するジオメトリは
ポイントの粗密が形状によってかなり影響を受けるので、metaballのコピーには適しません。
一様にポイントが散布されている状態が一番望ましいです。

3でmetaballを2のpointにコピーするのですが、この時点ではまだメッシュ化されません。
ビジュアライズ用のポリゴンが一応ビューポートでも確認できるのですが、
これはあくまでもデータとしてのポリゴンではないということです。
しかしデータ的には、分断されていたメッシュがmetaballによって一繋ぎになります。
ティーポットを見ると例えば、取っ手と蓋とボディと注ぎ口の4つにわかれているのですが、ちゃんと1つになります。

4でisooffsetを使用することによって、ようやくポリゴン化出来ます。
他にはConvertMetaSOPなどでもコンバート出来ると思いますが、多分好みで使い分けていいのではないでしょうか。
個人的にはisooffset推しですが。

ここで作成されたジオメトリは、metaballのサイズ分だけ太っているのがわかるかと思います。
一応現状このまま作業をすすめますが、最後までこれだとまずいので、後で直します。

5はどういうことかわからないと思うので、図を。

作成されたメッシュごとに色分けしてみました。
(あとこれは説明用に適当にデータいじってありますのであしからず。)

metaballをポリゴン化した際、実は内側が出来てしまうことがあります。
これは表面に対してポイントを作成し、その上にmetaballを作るため、
イメージ的にはジオメトリの表面に薄い膜を作る様な感じになるわけです。

しかし衝突に必要なのは表面だけなので、一番大きい部分(=一番必要であろう部分)を残して消してやります。
measureSOPを使ってポリゴンごとのarea(面積)を割り出し、塊ごとの表面積を求めて、一番大きいもの以外を消しています。

上記の画像だと紫色の部分ですね。
まさか取っ手の中身欲しい!!ってことはないですよね・・・?どんなシミュレーションだよという話ですw

そして6で再度isooffsetをかけます。
既にポリゴン化しているのにまたやるの?って話ですが、そうなんです。
ここでは太ったジオメトリを直すために、offsetをかけてやります。
peakでいいんじゃないの?とも思われそうですが、内部的な処理が根本的に違うのでこちらを使います。
でもやはりボリュームデータを作成するのは重いため、peakを使って問題なければそれでいいと思います。
この辺はケースバイケースでいいかと。

最後にpolyReduceをかけてポリゴンを減らします。
上記の画像だと6000ポリゴンが240ポリゴンぐらいまで減ってた気がします。
1%って指定したのにおかしいな、、とは思いつつも、この辺は値いじって調整してください。

これをご使用のソフトウェアに向けに出力して、完成〜〜〜。です。

ざっくりとした説明は以上になります。

上記は静的なオブジェクトのフローになりますが、
コリジョン用ジオメトリなので、当然アニメーション用も作成出来ます。
流れは上記とほぼ同じなのですが、できればトポロジを変えたくないので、
1フレーム目(または任意のフレーム)のジオメトリで一旦衝突用ジオメトリを作成した後に、
LatticeSOPを使ってそのポイントを動かします。

Latticeと言ってもMayaなどのラティスとは違い、ポイントでポイントをキャプチャーして動かすモードを使います。
Mayaで言えばWrapに近い感じですかね。

口で言っても分かりづらいことだらけなので、今回もデータを用意しました。
ティーポットなのでちょっと利点が分かりづらい部分もあるかもしれませんが、ご容赦くださいませm(__)m
データダウンロード

この方法の調整の肝は、
・Scatterの数
・metaballの大きさ
・isooffsetのレゾリューション
です。

scatterでのポイント数が多ければmetaballのradiusは小さく出来るため、
オリジナル形状に近いジオメトリが作成出来ます。逆に荒いとディテールがどんどんなくなっていきます。
ここは時間とのトレードオフですね。
isooffsetのレゾリューションが最終的な形状を決める訳なので、ここも時間との兼ね合いでの調整です。

また、一回目のisooffsetで穴が開いていたりすると、それ自体ワンスキンとみなされるので、
ちゃんと穴がとじる様にパラメータを調整してやる必要があります。

scatterの数の割りにmetaballが小さいとよくなりがちです。
最初は割りと大きめのmetaballでやるのがいいかもしれません。

この開いたはシーンスケールにもよるので、scatterの結果に同じサイズのsphereとかをcopyして確認するのもいいかも知れません。

 
その他何か質問あればどしどしどうぞ。

 
さて、割りと実践的なHoudiniネタだったと思うのですが、
まずは衝突用オブジェクトからGo Proceduralするのはいかがですか奥様。

「でもお高いんでしょう?」

いやいやいやいや。
これはHoudini Masterの機能を使わない範囲で作れるのでHoudini EscapeがありさえすればOKです。
まぁもちろんすぐにMasterが欲しくなるのは目に見えているので、
ここらで一念発起して買ってみませんか?<各プロダクション担当者様

とりあえず個人的にはこれをOTLにしてバンバン使えるようにしたいなーと思っています。
この間Fumeと組み合わせて使ったのですが、Fumeはジオメトリのvelocityを影響させてくれるので、
この方法はかなり使えました。

メッチャクチャ重いジオメトリでも、まぁ何分か何時間かわかりませんが、
セットアップして計算待てば超軽量なジオメトリが作成されます。
しかもシミュレーションしてるわけじゃないので分散処理も可能です。

やはりHoudiniはMasterとBatchライセンスが何本かあると効率が一気に違います。マジで。

Houdiniは処理速度自体は決して速くないですが、やれることが桁違いです。
他のソフトではなかなかこうはいきません。

FumeやKrakatoaなども使いたいので、今すぐHoudiniに乗り換えるのは無理ですが、
それらをサポートする立場として使うだけで、ずいぶんパワーアップ出来る気がします。
実際Fumeとの組み合わせはかなり便利です。
Mayaだとvelocityが影響しないのでそこまででもないかもしれませんが、Fumeとは相性◎です。

あとはパーティクルも、ですね。以前Mayaに持ってきて使いました。
ただし今思えば、このやり方ほど洗練されたやり方ではなかった(内側残ってたり)ですが、
それでもずいぶん便利に使えたことを覚えています

先日発表されたICE Modelingでも、もしかしたら似た様なことが出来るのかも知れませんね:)
そしたらそっち使うでも全然問題ない気がします。
重要なのはこういうアプローチでのデータの作成が出来るかどうか、ということです。

マシンパワーも相変わらずいい感じで向上してますし、メモリも安くなってます。
これからはプロシージャルの時代ですね!!間違いない:D
Houdini=パーティクルに強い、というイメージもそろそろ時代遅れじゃないですかね;)

「[Houdini] Fluid用衝突ジオメトリの作成」への5件のフィードバック

  1. @rvakに、
    nParticleでfillObjectしてメッシュ化してやれば出来るじゃん、と言われました。たしかに。
    でもあえて一つ言うならば、それだとそのまま太りっぱなしのメッシュが出来るわけなので要注意、ってところかなー。
    Houdiniじゃなくても出来るよ、といわれればまぁそうかもしれんね、という感じですか。
    とはいえ僕はHoudini推しですが。調整し易いし。重いけど。

  2. Share有り難うございます。分かりやすい解説ですね。参考にさせて頂きます。

  3. >Auratusさん
    コメントありがとうございます。
    参考になれば幸いです:)

  4. 初めまして!
    「Maya Houdini 違い」 で検索したら一番上位にこちらのブログが載ってましたので、拝見させていただきました。
    全部ではないのですが、興味のある記事ひと通りを読んでみました。
    ほんとにブログ主には頭が下がります!
    なぜこうも多岐にわたるソフトと言語が使えるんだろうと不思議に思いつつ感服です。
    時間管理とか習得方法とかはどうしていらっしゃるのか興味深いです!私なんかここ最近パソコンに向かいすぎのせいか、腕から手までの部分、すごい脱力感に襲われております、というか、手が小刻みに震えたりして、ポインターが外れてしまうこともありましたOrz.. 暫く休んだほうがいいかもしれません。ですので、ぜひその辺の話聞かせて頂きたいですw。

    現在大学二年生やってますが、Mayaのダイナミックセクションをいじっています。
    Houdini使った経験がないので、Mayaとの違いがよく分からないです。ただ、エフェクトに関してはHoudiniのほうが遥か上を行っているようね?
    YoutubeでParticleのエフェクト見てみたら、個人的にすごいと思ったものは大抵Mayaによるものじゃなかったです。逆に「Maya Particle」でひっかかったのは大抵残念な感じのがほとんどでした(とほほ)。Mayaの強みを一言で表すと何ですか?最近になってやっとMELの勉強を始めたのですが、プログラミングの基礎が薄くまだまだMELの道は険しいです、何よりも時間が足りないことを痛感してますね。

    Mayaで従来からあったParticleは割とサクサクなのですが、Fluidはコンテナの解像度あげたら計算もレンダリングもかなり重くなってしまいますが、Houdiniはどうなのでしょうか。MayaかHoudiniか、難しい選択ですね。将来的に考える意味で、早いうちにどっちを使用するのか決めたほうがいいと思います。それともはやり両刀遣いのほうがいいんでしょうか。

    ここに辿りつけたのもある種巡り会わせだと思っております。業界の話も聞けて素晴らしい記事ありがとうございます。ツイッターやってる暇なんてないんじゃないかと思いますが、持ってるのならフォローさせて頂きたいです。

    ちなみに、私、日本人ではないので、文章におかしかった箇所がありましたらすみません。
    日本人じゃないんですけど、日本を愛しているといっても過言ではないです。訳を言えばまたえらく話が長くなりますのでやめときますが。
    こちらで就職することも考えています。というよりも、したいですが。。。
    今度の原発事故で思ったのですが、日本が滅ぶくらいなら、もういっそここで日本とともに滅んじゃったほうがいいよなんて考えてましたww。まあ、事なきを得てよかったのですが、これ以上の被害がでないように祈っております。

  5. >xmyさん
    はじめまして。コメントありがとうございます。
    日本語上手!!
    途中まで日本人かと思って読んでました:P
     
    習得方法ですか、、うーん、なんでしょう。
    僕は基本的にかなり筋金入りのCGオタクなんで暇さえあればCGやらプログラミングやらのことばっかり考えてるので、それかもしれませんね・・・w
    良いことだとは思えませんが、まぁほぼ趣味なので仕方ないですw
    あとは何個か触ってると勘で触れるようになってくるというのもあります。プログラミング言語も一緒ですかね。
    もちろん深い部分に行くまでは時間かかるので、僕はメインのソフト以外は検証程度というか、触りの部分を少しいじってるだけですよ:P
     
    Mayaは良いソフトだと思いますが、エフェクトに関してはちょっと弱いかも・・・?
    でもFluidあたりはHoudiniよりも圧倒的に速くて制御しやすい気がしますw 使う人次第ですかね。
    そもそもHoudiniのFluidは重過ぎてまともに使ったことはありませんが。
    MayaのParticleはMELが出来ないと割としんどいので、目下MEL頑張ってみてください;)
    Fluidはパラメータだけ知ってればあとはセンスと度胸なので、相反する部分ありますが、良い結果出すために何かをするという部分では一緒、、です・・・!!;)
     
    良い結果出せればソフトなんて何でもいいよ、と、ものすごくたくさんの人に言われた(今も言われる)ので、ソフトの新機能ばっかり追って、僕の二の舞にならないようにぜひ頑張ってくださいww
     というわけでMayaかHoudiniか、なんてのはとりあえず置いといて、良いものを作りましょう!!
     
    Twitterは@taikomatsuでやっています。もしよかったらフォローしてみてください!
     
    日本は今だいぶ物騒ですが、ぜひとも日本の業界で力を発揮してください!!
    僕は海外にも行ってみたいですが・・・(ぇーー
     
    今後ともよろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。