山里ぽん太

thrown into the wineglass

08 August 2018

山里ぽん太はワイングラスにコーヒーを入れました。


Chapter 1 ティーカップに紅茶を注げない
今年4月1日にMODO を買って、最初に作ったモデルはティーカップでした。
作ったティーカップに、ファースト・フラッシュのダージリンを注いで、あの美しい金色を表現できたら。
でも、MODO で液体をシミュレーションしようと思うと Blob を使うしかなくて、作ったティーカップに紅茶を注ぐことはできませんでした。
でも、魔術師 Houdini ならきっとできるでしょう。
というわけで、まずは、蛇口から水が流れ出ているアイコンの「Emit Particle Fluid」シェルフ・ツールで水を注いで、溜めてみましょう。

水を受け止めるのは、ティーカップではなくて、四角の升です(笑)。
というわけで、水はどんどん注がれるけれど、溜まりません。

Chapter 2 Google+ に投稿が
「Google+ Houdini Japan Community」に、なにかヒントがないかな、と思って読んでいたら、同じような質問が投稿されています。
質問の回答の中に、SideFX のフォーラムに回答が上がっていると書かれていて、リンクも記載されています。
さらには、「expansion(膨張)」「divergence(発散)」フィールドを追加するように書かれていて、サンプルファイルも添付されています。
しか〜し、よくわかりません(涙)。
Chapter 3 シミュレーションの境界に溜める
そういえば、「Houdini Visual Effects」の本に載っていた作例では水が溜まっていました。
シミュレーションする空間の境界を、「縦5/横5/高5」と小さくして、その境界に水を溜める、というものでした。
そのとき実際に作った作例では、境界の半分くらいまで水が溜まりました。
今回、もういちどやってみましょう。
溜まります!。

Chapter 4 リファレンスのサンプル
リファレンスの「Particle Fluid Object」のページに、使えそうなサンプルがあります。


それぞれのサンプルファイルの中の DOP ネットワークは次のようなものです。
内容は、もちろんよくわかりませんが、素人目にもなんとなく「古いんじゃない?」と感じるものです。
使い方もわかりません(涙)。


Chapter 5 水が溜まった
もういちど、やってみましょう。
なんと!、水が溜まります!!(おおっ!)。
テキトーに作ったのですが、エミッターの元は半径1の球体で、升は「縦5/横5/高2」です。

もしかして、球体が大きいからじゃないでしょうか?。
ということで、球体の半径を0.1、升のサイズを「縦5/横5/高2」にしてやってみましょう。
溜まりません。

Chapter 6 パーティクルの数を数える
「Chapter 5」で作ったモデルのパーティクルの数を調べてみましょう。
調べる場所は、テキトーに「particle_fluid」ノード内の、「RENDER」NULLノードです。

というわけで、こうなりました。

半径1の球体のとき
コマパーティクルの数
00
100110615
200244792
300324868
400280226
500290031

半径0.1の球体のとき
コマパーティクルの数
00
1009197
20011624
30010370
4009649
5009257

なんか、夏休みの自由研究みたいです(笑)。
水はどんどん注がれているのに、パーティクルの数は、一定の数に到達した後は増えません。
半径1の球体のときは、水はどんどん溢れ出しているので、パーティクルの数も増えないのかな、と思います。
でも、半径0.1の球体のときは、溢れ出していないのに、パーティクルの数は増えません。
水は蒸発しているのでしょうか???(謎)。
Chapter 7 水はどこへ?
半径1の球体のときに、100コマ目まで水を注いで、101コマ目で止めたらどうなるでしょう?。
というわけで、やってみましょう。
な〜んと、溜まった水がどんどん減ってゆきます(なんでや)。

パーティクルの数も、どんどん減ってゆきます(うっひゃー)。
コマパーティクルの数
00
5030067
100110615
150140530
20082064
2509493
3006558
Chapter 8 水を減らさない
ネットワークの中の、いろんなノードの、いろんなパラメータをいじり、いろんなスイッチを入り切りして、あれこれと試していたら、「Flip Solver」ノードの「Particle Motion」の「Behaivior」タブにある「Kill Outside Volume Limits」をオフにすると、パーティクルの数が減らないことがわかりました。


というわけで、「Chapter 7」のモデルで試してみましょう。
水は100コマ目まで注いで、101コマ目で止めます。
というわけで、こうなりました。
パーティクルの数は減りません!(ぶいっ!)。
コマパーティクルの数
03869
5029308
10099161
150278534
200390230
250391377
300391358
350391382
400391139
450390864
500388580
550387265
600387207

レンダリングしてみましょう!!(wktk)。
水は減ります!!。
超絶減ります!!(笑)。
やはり蒸発しているのでしょうか?。
それとも、升の材質は吸水ポリマーなのでしょうか?(ありえねー)。

Chapter 9 ミルククラウン その1
気分転換に、ミルククラウンを作ってみましょう。
現実逃避とも言います(笑)。
シェルフツール「Crown Splash shelf tool」をポチして、テキトーに配置して、そのままレンダリングしてみましょう。
ほとんど投げやりです(笑)。
高速度撮影のミルククラウンの映像です。
真ん中に穴が開きました。

Chapter 10 下天の内をくらぶれば(考察)
というわけで、これにて終了とすべく、考察を書くことにします。
人生、諦めが肝心です(悟)。

① Houdini は、スーパーコンピュータで計算するようなシミュレーションをするソフトウエアではなく、映像を作り出すソフトウエアです。
現実世界の物理現象を完全にシミュレーションできてしまう、というような錯覚に陥るほど優れたソフトウエアではありますが、それは、僕の勘違いでしかありません。
ああ、やはり「RealFlow」を買うしかないのか、と嘆息を漏らす僕であります(sigh)。

② 数々の Flip ノードは、Houdini の進化の歴史とともに進化して、どんどん高性能になり、高機能になり、複雑になってきたのだろうと思います。僕は Houdini との付き合いはまだ3か月に満たないので、ただ、想像するだけです。開発者だけが知り得るノードの機能を、僕が知ることができるはずはなく、盲滅法にパラメータをいじったり、スイッチを切り替えたりしても、目的とする映像が得られるはずはありません。目的とする映像を得たいときは、SideFX にお金を払って教えてもらう方法が、最善にして最良でしょう。

③ などと考えていて、閃きました。
目的とする映像のぜんぶを、シミュレーションで賄わなければいけないことはないのです。
動きが必要なところだけ DOP ネットワークを作ってシミュレーションして、SOP のアニメーションでできるところは、SOP で表現してしまえばよいのです。
水を升に溜める表現は、SOP で作った動かない水を升の底から少しずつ上昇させて、その一番上に、Flip のシミュレーションを乗っければよいのです。
Chapter 11 ミルククラウン その2
ということで、気を取り直して、ミルククラウンの真ん中の穴を塞いで、綺麗にすることにしましょう。
そのためには、ネットワークとノードとパラメータを勉強しなければいけません。
ということで、シェルフツール「Crown Splash shelf tool」で展開されるネットワークビューを広げて、いろいろ見てみました。
ネットワークの中に「Blast」というノードがあります。
爆発するのでしょうか?(謎)。
ということで、リファレンスを調べました。

なんだかよくわかりません。
下の方に、こんな Example があります。

マジっすか!!??。
サンプルを Launch して、DOP ネットワークを開いてみましょう。
「Gas Equalize Volume dynamics node」というノードが追加されています。
ガスです。
しかも、FlipSolver の右から2番目の入力につながっています。
怪しすぎます(笑)。

パラメータはこんなことになっています。

リファレンスの「Gas Equalize Volume dynamics node」ノードのページには、こんなことが書いてあります。

「Scale Goal Volume」と「Add Goal Volume」という2つのパラメータで、Flip の容量を一定に保つことができるようです!!。
「Gas」ですが、大丈夫でしょうか???。

Chapter 12 シェーマスくんの気分で
というわけで、「Chapter 7」のモデルの FlipSolver に「Gas Equalize Volume dynamics node」をつなぎました(大丈夫か?)。

というわけで、「Scale Goal Volume」を1にして、「Add Goal Volume」を0にして試してみましょう。

爆発しましたーwwwww。
いやー、水が爆発するなんて、まさに魔術です。
ハリー・ポッターの映画のシェーマス・フィネガン君の気分です(笑)。

Chapter 13 升酒はいかが
「Scale Goal Volume」は危険なので、値をゼロにします。
というわけで、「Add Goal Volume」をいじってみることにしましょう。
リファレンスには「Scale Goal Volume がゼロなら、これは単に合計のゴール体積になります。」と書いてあります。
なので、ゴール体積を計算して、その値をセットしましょう。
升の内側の寸法は、「縦4.6/横4.6/高1.8」なので、容積は、「4.6×4.6×1.8 → 38.088」と計算できるので、とりあえず30と設定します。

というわけで、水は減ってゆきません!!!。
いい感じです。
少し溢れたので、升の半分くらいまでしか溜まりませんでした。

というわけで、「Add Goal Volume」の値を50に増やしてみましょう。

なかなかいい感じです。
美味しそうです(笑)。

注ぐお酒を細くしてみましょう。
うん、いい感じです。
というわけで、この ponticle のタイトルを「山里ぽん太は升に日本酒を入れました。」にして、これで終了します。
嘘です(笑)。

Chapter 14 魔法のお酒
もういちど、試してみましょう。
うん、大丈夫です。
これなら、お客様に、なみなみと注がれたお酒をお出しすることができます。
でも、ちょっと変です。
お酒は溢れているのに、減りません。

ということで、お酒を少しだけ注いで試してみましょう。
お酒は増えてゆきます(驚)。
魔法のお酒です!!。

Chapter 15 お酒の量を調節する
というわけで、「Add Goal Volume」の値をアニメーションさせてみましょう。
まずは、Add Goal Volume」の値を0から50まで上げます。

お酒は増えませんでした。

次に、Add Goal Volume」の値を50から0に減らします。

お酒は減りました!!。

Chapter 16 お酒を移す
お酒の量を維持したり、減らしたりというコントロールが、ある程度はできることがわかりました。
というわけで、お酒を升から升へ移してみましょう。
できました!!。
盛大に溢れていますが(笑)。
お酒がもったいないです(笑)。

Chapter 17 大きいことはいいことだ
というわけで、升の大きさは5メートルとか10メートルとかです。
デカすぎます(笑)。
人間の手では持てません。
持てないと飲めません(笑)。
というわけで、とりあえず升のサイズを10センチメートル角にしました。
しかし、お酒が出る球体の大きさが、なかなか小さくなりません。
「Fluid Source geometry node」のパラメータをいろいろ変えて、お酒が出る球体のサイズを升よりも小さくしたのですが、お酒は出なくなってしまいました。

というわけで、升の底に小さな穴を開けて、細いお酒の流れを作ってみましょう。
穴の大きさは、左から、10センチメートル、20センチメートル、30センチメートルです。
10センチメートルの穴からは、お酒は出てきません。

穴の大きさを少し大きくしてみましょう。
左から、30センチメートル、40センチメートル、50センチメートルです。
お酒の太さは10センチメートル以下にはならないみたいです。

試しに、ジオメトリのスケールを10分の1にしてみましょう。
SOP ノードも DOPノードもぜーんぶ10分の1です。

お酒は出ません(涙)。

Chapter 18 酒は涙か溜息か(考察)
① 水のシミュレーションは、だいたい20センチメートルくらいより大きなスケールでないと、できないことがわかりました。
それよりも小さな水を表現したいときには、大きなスケールでシミュレーションして、サイズを縮小して使うことになりそうです。
しかし、大きなスケールでシミュレーションした水の動きは大きな動きになりますから、それをそのまま小さくしただけでは、見た感じが奇異に感じられることになるかもしれません。
時間のスケールを調整したり、重力フォースを調整したりして、ある程度はごまかすこともできると思いますが、悩ましいところです。
試しに「Chapter 17」の、水が出なかったモデルを修正して、大きなサイズでシミュレーションした結果を10分の1のサイズにして表示してみました。
こんな感じでやるしかなさそうです。

Chapter 19 ミルククラウン その3
「Chapter 11 ミルククラウン その2」で作ったミルククラウンのレンダリングが終わりました。
落ちる水滴の勢いが弱くて、ミルククラウンがうまく成長しませんでした。
パラメータの値を変えながら、いい感じなるまで、何度もカット・アンド・トライを繰り返すことになりそうです。
ミルククラウンのシミュレーションはすごく時間がかかるので、とりあえず棚上げにします(笑)。

Chapter 20 ワイングラスにコーヒーを入れる
というわけで、ワイングラスを作りましょう(違)。
ティーカップに紅茶じゃなかったのでしょうか?。
いえ、ここは、ワイングラスにコーヒーを入れます。
なんでワイングラスにコーヒーなのでしょうか?(謎)。
それはアレです(何)。
モモンガ・コーヒーさんの、世界一の水出しコーヒーはワイングラスに入っているからです!!(おおー!)。
というわけで、ワイングラスを作りました(早)。
カーブを作って、「Revolve」です!。
カーブを作るところは、マウスで、ちょんちょん、とやって、出来上がった Curve ノードのパラメータの値を Excel で調整しました。

で、シミュレーションのネットワークをコピペしてできあがりです。

漏れましたー(笑)。

ワイングラスを非表示にすると、こんなことになっています。
これは、アレです(何)。
ワイングラスの厚さが薄すぎるのです(ほんまですか?)。

というわけで、シミュレーション用のワイングラスを作りました。
ワイングラスというより、もはや臼です(爆)。

漏れません!!(偉)。

臼を非表示にするとこんな感じです。

臼を非表示にして、ワイングラスを置いてみます。

いい感じです!!(嬉)。

ちゃんと溜まっています。

Chapter 21 染み出す
すこし多めに溜めたら、ワイングラスの外側に染み出しています。

拡大するとこんな感じです。
これは、アレです(何)。
シミュレーションの誤差です(ほんまですか)。
しようがありません!!(断言w)。
なんといっても、ワイングラスの厚さは1ミリ未満ですもの(薄っ!)。

というわけで、シミュレーション結果の周囲を、Boolean で削りましょう。
Houdini は魔術師です!。
液体だって削れちゃいます!!(凄)。

というわけで、染み出さなくなりました。

拡大しても大丈夫です。

Chapter 22 ワイングラスにコーヒーを
というわけで、ワイングラスにコーヒーを注ぎましょう。
上の方からじょぼじょぼ、と注ぐのではなく、魔術師らしく、何もないところから、コーヒーが湧き出すことにしましょう。
Houdini は魔術師です!。不可能はありません!!。
というわけで、爆発しましたーwww。

パラメータをいろいろいじって爆発しないようにしましょう。
ということで、こんどは溜まりません。

もっと調整しましょう。
溜まりました。

横から見るとこんな感じ。
いい感じです。

というわけで、スノードームのときに作った部屋のテーブルに置いてみました。
うん、い〜い感じです。
でも、ちょほいとまつたは〜(何)。
ワイングラスのコーヒーが入っていない部分の屈折が変です。
向こう側の景色が逆さまになっています。
mantra くんは、中が詰まっていると勘違いしているのでしょう。
たぶん、おそらく、ワイングラスの厚さが薄すぎるのです。
厚さが薄すぎて、ガラスの反対側を検出できなくて、そのまま空気の中をずーっとガラスだー、って思ってしまっているのでしょう。

というわけで、ワイングラスの厚さを厚くしてみました。
ワイングラスの向こう側がちゃんと見えるようになりました。
ワイングラスのガラスの部分ですこし歪んでいい感じです。
でも、ワイングラスの一番上のところだけは、まだちょっと変です。
端の部分になるので、スムージングがかかって薄くなりますから、しかたがありません。
ガラスの厚さも、厚いところと薄いところができてしまっているので、完璧にはできません。
でも、まあ、よしとしましょう(笑)。

Chapter 23 モモンガ・コーヒーさんでコーヒーを
というわけで、モモンガ・コーヒーさんのお店のカウンターの上に置いてみました。
カウンターの上と言っても、カウンターは、垂直に立てた壁に写真を投影しているだけです(笑)。
ワイングラスの足元に影ができていますが、これは Photoshop で作った偽物の影です(笑)。
このモデルは、ワイングラスを5倍のサイズに拡大しています。
なので、ワイングラスの厚さも4ミリメートルくらいになっていて、mantra くんが空中をガラスと勘違いする心配もありません。

Chapter 24 レンダリング
というわけで、毎度おなじみ別室のスタジオで(笑)レンダリングしました。
エラーがありますが、ご愛嬌ということで。

こんなふうに大きくエラーしている絵は取り除きました。

Chapter 25 メモ
① Chapter 15 で試した、「Gas Equalize Volume dynamics node」の「Add Goal Volume」の値を増やすアニメーションについて補足します。Chapter 15 では、値を増やしても、見た目の水の量は増えませんでしたが、タイミングを少しずらして、少し水が溜まってからアニメーションを始めるようにすると、見た目の水の量が増えました。Chapter 24 のレンダリングでは、そのようにして、コーヒーの量が増えてゆくようなアニメーションを実現しています。

② ワイングラスをモデリングするときに、Curve のパラメータを Excel で調整しました。このテクが使えるところは、Houdini の大きな長所だと思います。

③ 「Emit Particle Fluid」シェルフ・ツールのデフォルトでは、液体は減少することになっているようです。SOP のアニメーションに、DOP のシミュレーションの動きを組み合わせて使うときには、液体は減少するほうが、都合が良さそうです。例えば、今回の作例では、ワイングラスの中のコーヒーは最後まで揺れ動いていますが、揺れを次第に小さくして、最後には静止させてしまうようなアニメーションにするときには、SOP で水面を持ち上げながら、DOP のシミュレーションの水の量を減少させてゆく、という作り方になるわけです。

④ Chapter 22 で、mantra は、ワイングラスを、中身が詰まったガラスと判定している様子でした。おそらく、厚みを厚みと判定する最小距離を短くしてあげれば、この問題は解決するだろう、と思い、リファレンスを見たり、ノードのパラメータを見たりしましたが、その設定をする場所が見当たりませんでした。この最小距離は、感覚的には1ミリメートルくらいのように思われます。モデルの中の、細かい、あるいは、薄い部分が、絵に大きく影響するときは、注意を要すると思われます。

⑤ 今回作ったコーヒーには、氷は入っていません。通常でしたら、ワイングラスにカットした氷を入れて、それからコーヒーを注ぐでしょう。氷を表現するには、「浮力」を使わないといけないし、注がれる水の勢いでワイングラスの中を動き回る氷も表現しないといけないでしょう。でも、そこまでリアルなものを作ろうと思ったら、たぶん、現実のものを撮影してしまったほうが、ずっと良いでしょう。身も蓋もありませんが。

⑥ 今回作ったワイングラスは、結露していません。Houdini ではどうするのでしょう?。Fog でも使うのでしょうか?。異なるマテリアルをつけた2つのモデルの適用の割合を、ノイズのマスクでコントロールするのでしょうか?。水滴もつけなければいけません。今後の課題です。

⑦ シミュレーションのエラーが発生したようで、数枚の絵が乱れました。商用に仕上げるには、Photoshop などできれいに直すことになるのでしょう。

⑧ コーヒーの色に少々苦労しました。RGB値は写真から得ることができましたが、At Distance 値は、Cut&Try して調整しました。一口に、コーヒーといっても、いろんな色や、濃さがあります。コーヒーの豆の粉末のような、水に溶けないものが混入しているときは、Sub Surface Scattering の計算をしなければならないかもしれません。

⑨ シェルフ・ツールをそのまま使っても、実際に目的とする、ほしい絵には、簡単に届かないようです。シェルフツールと、目的とする絵との間をつなぐ部分は、ノウハウ、ということになるのかもしれません。いくつかの Example を見て思ったのですが、一時的にノウハウを得ても、Houdini のバージョンが進むにつれて、次第に役に立たなくなるだろうと思われます。得られたノウハウは、Houdini のバージョンアップの度に、吟味して、新しいバージョンでも使えるように、常にアップデートしなければいけないだろうと思われます。