本日はUnityの続きをやっていきたいと思います。
というのも前回の物理演算が楽しかったからです。
前回は粒子をたくさん使った剛体の物理演算でしたが、今回は流体を使ったモデリングを行ってみたいと思います。
流体や軟体のモデリングが可能なプラグイン
流体のモデリングがしてみたいと息巻いていたのですが、実際どうやってやれば良いんだろうと思っていました。
しかし、そんなときにあのNVIDIAがすばらしいPluginを無料で提供していることがわかりました。
それが「NVIDIA Flex for Unity」と呼ばれるPlugin です。去年にリリースされ、流体・軟体・布等の動きをシミュレーションすることができます。今は1.0Beta版がリリースされており、今回はこれをインストールして使ってみました。
流体を出現させてみる
NVIDIA Flex for Unityをインストールして流体を出現させてみます。
新規作成から Hierarchyに舞台となるPlaneと流体となるCubeを作ります。
そしてCubeの方でInspectorの欄からAdd Component→NVIDIA→Flex→Flex Soft ActorとAdd Component→NVIDIA→Flex→Flex Fluid Rendererをコンポーネントに加えます。Soft Actorは軟体を表現し、Flex Fluid Rendererは流体の見た目を表現に関するScriptだと思います。
さらに加えたFlex Soft ActorのContainerにFlexContainerをセットし、Soft AssetにNew FlexSoftAssetをセットします。セットした状態が下図です。FlexContainerは流体や軟体の柔らかさなどのパラメータを変更することができ、FlexSoftAssetはモデリングする粒子の数等を変更することができます。Flex Soft ActorのFluidにチェックを入れるのを忘れずに。
セットしたNew FlexSoftAssetはAssetsのCreateから作ることができます。今回はとりあえず下図のようにしました。
また、FlexContainerはとりあえず下図のようにしてみました。
いざゲーム起動!
Cubeが弾けて流れていく様子がわかると思います。
実際にどのような計算がされているか詳しく見てみます。Flex Soft ActorのDraw Particlesのチェックをオンにしてみるとわかりやすかったです。
流体のしずくの中に複数の粒子が入っていることがわかります。Cubeを構成する粒子が弾けて流体のような挙動をしているんですね!
次に粒子同士の結合力を強くしてみます。FlexContainerのCohesionを0.01から50倍して0.5にしてみました。
すると、
「べちゃっ」と流体が広がらなくなりました。粒子同士の結合力が強いので、広がることなくスライムのような挙動になっていると考えられます。
このようにパラメータいじることでいろんな流体の挙動が再現できるということですね。
流体と剛体の組み合わせ
次に流体と剛体を組み合わせた挙動も見たみたいと思います。
最終的なイメージとしては海の上の船みたいな感じです。
まずは前回と同様に舞台の側面に壁を作って流体をプールのように貯めます。下図みたいな感じです。特に難しい設定はなかったです。
ちょっとゼリーっぽいですが、容器に水がたまっている様子がわかると思います。
ここに物体を落とします。物体はCubeにAdd ComponentでFlex Solid Actorをコンポーネントしました。設定したFlexSolidAssetは以下のように設定しました。
あとはゲームを起動するだけです。
おおおー、なんかそれっぽくなりました。
やっていてわからなかったのが、粒子の密度を設定するところがなかったので、なぜ流体に対して浮いているのかということです。物体の粒子の数を増やしてみても浮いたので、どこかに物体の質量を決めるパラメータがあるのでしょうか。
物体を動かしてみよう!
なんとなく、水の上に浮かぶ物体を再現できましたので、ゲーム要素を少し入れてみたいと思います。今回は物体を方向キーで移動させるような挙動に挑戦します。
といってもネットで調べたScriptを前回同様に物体にコンポーネントするだけですが。
物体を動かす方法は色々あるみたいです。代表的なものにポジションを強制的に移動させるもの(キー入力分ポジションを移動する)、物体に力を加えるもの(キー入力に対する力を物体に与え移動させる)があるみたいです。後者の方が実現象に近い挙動をするみたいですので、今回は後者の方で物体を移動させてみます。
Scriptは以下の通りです(こちらを使いました)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { Rigidbody rb; float speed = 10.0f; // Use this for initialization void Start() { rb = GetComponent<Rigidbody>(); } // Update is called once per frame void FixedUpdate() { float x = Input.GetAxis("Horizontal") * speed; float z = Input.GetAxis("Vertical") * speed; rb.AddForce(x, 0, z); } } |
難しいことはわかりませんが、剛体(Rigidbody)に対してスピード(加速度)を与える感じみたいです。作成した物体(Cube)にはRigidbodyをAdd ComponentからComponentしました。さらに上記のScriptもコンポーネントするため最終的に下図のようなCubeの中身になりました。
いざ起動!舞台に物体が落ちてからキー入力をしてみます。まずは流体無しで。
ぬるぬる移動していることがわかります。自然かどうかはわかりませんが、力が加わるとこのように動くようです。
次に流体を入れてみます。
一応流体の上でも物体を動かすことができました。
ただ見てもらうと分かる通りキーを入力し続けると「スーッと」壁をすり抜けてしまいます。
「どこいくねーん」って感じです😫
ん~いまのところなぜこうなるかがわかりません。ちょっと勉強してみます。
というわけで今回はここまでにします。
まとめ
今回はUnityを使って流体の挙動についてモデリングしてみました。
今日行ったモデリングくらいだとあまり処理重くなることなく動かすことができました。
こんな面白いことが無料でできるのはすばらしいですね。
今後のこのプラグインの製品版が楽しみです。
今回色々課題もあって今後もっと勉強する必要があることもわかりました。千里の道も一歩からというようにコツコツ続けていきたいと思います。
コメント
[…] https://ashikapengin.com/2019/08/11/unity-fluid/ […]
[…] やっぱり難しい Unity で流体モデリング!| 底辺動物の雑記ブログ […]