挨拶
こんにちは。深夜作業にドクターストップかかって趣味Houdiniを実質引退した人です。
この記事出る翌日、クリスマスの健康診断で命運が決まる。
肝臓は大事だぞ(27歳にして壊滅した人)
ラバランプとは
個体だと水より重く硬いように調整された油が、電球の熱で溶かされていったり来たりする”アレ”です。
ラバライトともいわれるようです。
こんなの作ります
https://youtube.com/shorts/P94qklrSBlE
どう作るか
さて、まずラバランプがどう動いているかを考えます。
ざっくり纏めると、固体状態では水より重く、液体状態では水より軽い油が入ってるわけです。
つまり、真面目にやるならphaseを利用して混ざらないようにしつつ、massを弄るのがいいわけです。
でもここで難点。Houdiniにおいて「閉じられた空間に満たされた水」というのはよくバグります。
すり抜け、体積が減る、などなど.....
なので、もっと簡単にして 「熱の情報によって重力の向きが変わる」 という方向で行きましょう。
作るネットワーク

青枠はモデリングなので今回は省きます。シミュレーションのもととなるモデルを作るので、任意の形状でやってください。
余談ですが、こういう中に閉じ込める系シミュをする場合はVDBcollisionのinvertSDFを使うと楽。
あとFluidは粘性いい感じに付けてsurfacetension付けてください。私は以下の設定でやりました。

赤枠はシミュレーションにかかわる部分です。
熱を加えて冷却する
シミュレーションの中で「熱」と言うと、Temperatureを思いつきます。
しかし、これはHoudiniが使用する値であり、ユーザー側で勝手に弄るのは極力避けたいです。(弄るのも大変面白いので興味あるなら是非やってほしい)
なので、独自のアトリビュートである @temp を先に作っておきます。

-1にしているのは、温度を0開始にしてしまうとこの後不都合があるからです。
ではSolverの中に入っていきましょう。

Wrangle : 熱の発生、重力の計算
POPForce : ランダム要素
POPDrag : 空気抵抗を増やす事で水中のような雰囲気に。
ここでは熱により重力を操作します。
予め、SolverのGravityは0にしておきましょう。
簡単なコードですね。
ざっくり説明すると、0からの距離を測り、その距離に応じて熱を伝える
全体を一定数冷ます
Clampする(しなくてもいいが、制御しやすいのでよくやる)
温度によって重力の方向を変える
という形です。
この0からの距離と温まりやすさ、冷めやすさは好きに変更してください。
重力はGravityノードで付ける物という認識がありますが、重力ってのはすごい単純に言えばある方向への重力加速度があればそれっぽく見えるわけです。
なので、温度でY方向上下への重力加速度を設定してやれば、疑似的な重力が生まれるわけです。上方向なら浮力(斥力かもだけど今回は液体なので)
重力の方向を弄るのはいろんな所で使えるので覚えとくと面白い。normalize(-@P);の方向へ重力をかければ0点へ集まるようになる。
という事をし、シミュレーションをかけてtempで色を分けたのを見るとこうなります。
いい感じに玉っぽくなるように結構数値の調整が必要です。
ヘビ花火みたいにズズズズって上がるか、海坊主みたいにふわふわするだけになりがち。
最後にマテリアル付けてレンダリングすれば終わり!
あとがき
今回はなんかいつも通り水になりましたね。以前水の混ざり方作ったので、今回は浮いてる水作りたいなーと思ってラバランプになりました。作る物はノリで決めるもん。
一応、最初に言った厳密な方法で、phase分けてsurfacetension別にすれば混ざらない別の液体としてシミュレーションされて乱流を用いたラバランプにもなるし最初それ作ったんですが、結構複雑になったし伝えるの長くなって誰も理解できないやつになりそうなので簡単にしました。
液体と重力ってだけで結構美しい絵出来るからね。
難しいほうの作り方やりたければ結構面白いのでやってみるとオススメ。
最後になりますが、シーンの共有です。
https://drive.google.com/drive/folders/1wNq63WyR1SP9PEpv8Or9XHJ5BcIjJrSe?usp=drive_link
ではこの記事が上がるのはクリスマスイブですかね。
ケーキとチキンと旨い酒でも飲んで楽しんでください。私は健康診断の為に絶食です。
ではメリークリスマス!よいお年を!!
