##概要
この記事は、Unity #2 Advent Calendar 18日目の記事です。
NVIDIA Flex for Unityを試しに少し触ってみたので、それについて簡単にまとめてみます。
##NVIDIA Flexとは
まず、NVIDIA Flexとは、流体・軟体・布等の動きをリアルタイムでシミュレーションするミドルウェアです。
https://developer.nvidia.com/flex#
そして、NVIDIA FleX for Unityは、NVIDIA FlexをUnityで動作させるプラグインです。
(2018/12/18現在、1.0ベータ版となっています)
https://assetstore.unity.com/packages/tools/physics/nvidia-flex-for-unity-1-0-beta-120425
##NVIDIA Flexを使ってみる
今回、NVIDIA Flex for Unityを使って、試しにこんなものを作ってみました。
NVIDIA Flex for Unityを試しに使って軟体と流体を表示。エッグマフィンやワッフルをふるふるに。 pic.twitter.com/yeXP4PQBBQ
— 2018年12月18日
食べ物のモデルと水の流れを NVIDIA Flexで動かしています。
上記の動画を見てもらうと、ハンバーガーやワッフル等が軟体として動いているのがわかってもらえるかと思います。
食べ物のモデルはAssetStoreにあったものをダウンロードして使用させていただきました。
https://assetstore.unity.com/packages/3d/props/food/3d-bakery-object-17167
##ポリゴンモデルを軟体(ソフトボディ)として表示する
では、試しにFlexでポリゴンモデルを軟体として表示してみたいと思います。
AssetStoreからNVIDIA Flexをダウンロードしてインポートし、
食べ物のモデル(3D Bakery Object)をダウンロードしてインポートすると、プロジェクトは以下のようになります。
(これから作成するファイルの置き場として、プロジェクトに FlexBakeryという名前のフォルダを追加しています。)
まず、Flexでシミュレーションを行うには、Flex Container というアセットが必要なのでこれを生成します。
Create > Flex > Flex Container
でコンテナを生成します。
※このコンテナにFlexのオブジェクトを登録することで、オブジェクト同士の動きのシミュレーションを行うことができます。1
次に、ハンバーガーのモデルを軟体で出すことにします。
Create > Flex > Flex Soft Asset
で軟体のアセットを生成します。
アセットの名前は SoftAsset_Hamburgerとしておきます。
ハンバーガーのモデル(FBX)は以下のフォルダにあります。
ここでは、Scale Factorの値を0.05として大きさを調整しています。
そして、SoftAsset_Hamburgerをインスペクタで見て Boundary Mesh のところに
ハンバーガーのFBXのメッシュ(FBXの1階層下にあるやつ)をドラッグ&ドロップします。
すると、ポリゴンメッシュが、Flexでシミュレーションするための粒子で構成されたモデルに変換されて、インスペクタに表示されます。
次に、ハンバーガーのモデルをシーンに出すために
Create > Create Empty でシーンに GameObjectを追加して(ここでは名前をHamburgerとしています)、
その GameObjectに Add Componentで FlexSoftActor コンポーネントを付加します。
そして、Container のところにコンテナのアセット(FlexContainer)を、Soft Asset のところにハンバーガーの軟体のアセット(SoftAsset_Hamburger)をそれぞれ指定します。
このとき、DrawParticles のチェックボックスをONにすると、粒子のモデルがシーン上に表示されます。
ハンバーガーのポリゴンモデルを軟体として表示するために、
ハンバーガーの GameObjectに、更に FlexSoftSkinning と、SkinnedMeshRenderer コンポーネントを付加します。
SkinnedMeshRender コンポーネントの Mesh のところにハンバーガーのポリゴンメッシュを、
Materials のところにはハンバーガーのモデルのマテリアルを指定します。
(これでハンバーガーのポリゴンモデルが表示されるようになったので、FlexSoftActor コンポーネントの Draw Particles はOFFにします)
この状態で、Unityエディタで Playボタンをクリックして実行すると、ハンバーガーが床に落ちてぽよんと弾むのを見ることができます。
他の食べ物のモデルも同様の手順で追加してみます。
※ Flex Container は2つ以上作らずに、同じ1つの Flex ContainerをそれぞれのFlexSoftActorのインスペクタに指定するようにしてください。
ちなみに、Flex Soft Asset の Cluster Stiffness(剛性、変形しづらさの度合い)の値で、軟体の柔らかさを変えられるので、
食べ物のモデルの種類ごとに、このパラメーターを調整してみるとより良い見た目にすることができます。
流体の表示
蛇口から水が流れ出るような感じで、流体をシーンに出してみることにします。
まず流体の粒子の発生源を作ります。
Create > Flex > Flex Source Asset
でアセットを生成します。
その FlexSourceAssetをインスペクタで見て、Surface Mesh の右端の○ボタンをクリックして、粒子の発生源となるメッシュを選択します。
ここでは Quad 形状のメッシュを選択します。
そして、Mesh Tesselation の値で、粒子を発生させる点の数を増やすことができます。
Max Particles はこのメッシュから発生する粒子の最大数です。
ここでは、それぞれのパラメーターの値を(スケールの値も)シーンに合わせて適当に調節しています。
シーンに GameObjectを追加して、FlexSourceActor コンポーネントと FlexFuidRenderer コンポーネントを付加します。
そして、Container のところに FlexContainerのアセットを、Soft Asset のところに FlexSourceAssetをそれぞれ指定します。
FlexSourceActor コンポーネントの Fluid のチェックボックスをONにします。
このパラメーターをONにすることによって、粒子は流体として発生します。
その他に、StartSpeed は粒子の初速を、LifeTimeは粒子が発生してから消えるまでの時間(秒)を表しています。
ここではそれぞれのパラメーターをシーンに合わせて調節しています。
シーンに流体の発生源を置いたので、これをUnityエディタで実行すると、
この動画のように、軟体のモデルを流体で押し流す動きを作ることができました。
pic.twitter.com/yeXP4PQBBQ
— 2018年12月18日
最後に
今回 NVIDIA Flex for Unityを試しに少し使ってみて、軟体や流体の動きを簡単に表示することができて結構楽しかったです。
まだベータ版ということもあってか、処理はかなり重いのですが、そのあたりは今後のバージョンアップに期待したいと思います。
参考にした記事
https://www.youtube.com/watch?v=Fp1SMb3SWoo
https://www.youtube.com/watch?v=2IOXPnbHuvo
https://www.youtube.com/watch?v=VelIt1v0CAY
http://www.asset-sale.net/entry/NVIDIA_FleX_for_Unity_%281_0_BETA%29
-
(注釈)Flexのコンテナは正確に言うと、Flexで位置計算を行うための粒子のコンテナです。Flexでは剛体・軟体・流体・布等全て粒子から成るモデルで構成されていて、シミュレーションは全て粒子の位置計算によって行われています。軟体の動きは、軟体を構成する粒子のモデルから、粒子の相互作用を計算してスキンメッシュの形状に反映しています。 ↩