チュートリアル / 3ds Maxではじめるエフェクト制作
第4回:MaxLiquidを使ってみる
- 3ds Max
- Arnold
- エフェクト
- コラム
- チュートリアル
- 学生・初心者
トリプルアディショナル小張です。
今回は2018.3から搭載された流体機能を使ってみます。
普段、液体系は別のソフトウェアを使用しているので、3ds Max の流体機能は初めて使用します。
またレンダリングに関しても今回初めてになりますがArnoldを使用してみたので、その辺も少しだけ紹介していきます。
MaxLiquidは、Mayaにも搭載されているbifrost技術を使用して液体のシミュレーションを行う機能と紹介されています。正直現状ではMayaに比べると機能的にだいぶ制限がありますが、基礎的な液体シミュレーションは出来るように思いました。
またヘルプを見ると「Maya との直接的な相互運用性のために BIF ファイルを読み込む、または作成します。」とあったり、VDBやAlembicをサポートしているようなので、他のソフトウェアやレンダラーとの互換性を持たせることも可能なようです。
今回は、以前まで紹介してきたParticle Flowの機能と組み合わせて基礎的な液体シーンを作っていきます。
では、以下のようなアニメーションを作ってみます。
こちらのプレビューではパーティクルの表示量は20%になっています。
Arnoldでレンダリングした画像はこんな感じです。
以降青文字は何のために作業したかの解説になります。
まず必要なモデルを用意します。
グラス、氷、と後述しますが液体のシミュレーション時に必要になる液体用のエミッターを作ります。
コップの断面形状のシェイプにモデファイアのLatheをかけてグラスを作りました。
さらにグラスのクローンを調整し、液体のシミュレーション時にエミッターとして使用するオブジェクトを用意します。
最後に簡易的なモデルではありますが氷になるオブジェクトを作成しました。
プリミティブのボックスにモデファイアのNoiseやTurboSmooth、Optimizeを数回かけて作りました。
次に氷のアニメーションを作成します。
今回氷のアニメーションはParticle Flowで作成しました。
そういった機能がMaxLiquidになかった?ということもありますが、コントロールのし易さなどを考えると、こういった方法がオーソドックスなのではないかと思います。
Particle Viewを開き、Particle Flowを組んでいきます。
フローからEmpty Flowをドラッグ&ドロップし、グローバルイベントを作成します。
次にオペレーターからBirth Streamをドラッグ&ドロップして出来たイベントと、グローバルイベントとを繋いであげます。
さらにイベントにオペレータのShape Instance、mP Shape、mP Worldを追加します。
シーンのオブジェクトをパーティクルとして使用する場合はShape Instanceを使用します。
追加したmP Worldを選択しCreate New Driverをクリックで、新規にドライバーを作成。
作成したドライバーのApply Gravityにチェックを入れます。
mP Worldにある => アイコンをクリックでアクセスできます。
グラスと衝突判定をさせるため、イベントにmP Collisionをドラッグ&ドロップします。
シーンのグラスオブジェクトを選択し、モデファイアのPFlow Collision Shapeを適用。
PFlow Collision ShapeのパラメーターにあるActiveをオンにします。
Particle Viewに戻り、先ほどのmP Collisionを選択。Deflectorsにグラスオブジェクトを追加します。
コップのサイズからして、それほどパーティクルの量は必要なさそうなので、Birth Stream のEmit Stopを35フレーム目。Rateを6に変更しました。
シーンにあるBirth Streamのエミッターを選択し、任意の高さまで移動します。
一度再生してみます。
少し氷のサイズが小さいように思ったので、Shape Instanceを選択しScaleを130%にしました。
サイズや量は十分かと思いますが、このままでは水の中に入ったような動きではないのでもう少し調節していきます。
まず任意のサイズでプリミティブのPlaneを作成します。
さらに、水面の高さ(液体用のエミッターの上面の位置)まで移動します。
次にParticle ViewでイベントにmP Buoyancyを追加し、パラメーター内>Surface LevelにあるPlane Primitiveにチェックを入れ、先ほどのPlaneを選択してあげます。
mP Buoyancyは、パーティクルに浮力を加えるオペレーターです。
一度再生した結果、勢い良く落ちすぎている気がしたので、Birth Streamを選択し、パラメーター内にあるSpeedの値を50まで下げました。
また、より浮力がついたように見せるため、mP BuoyancyのパラメーターにあるLiquid Densityを1.5まで上げました。
さらにイベントにRotationを加え、パラメーター内にあるOrientation MatrixをRandom 3Dにします。
発生時にランダムに角度がつくようになります。
加えてイベントにSpinも適用し、Spin Rateを5、Spin AxisをRandom 3Dにします。
ランダムな回転のアニメーションが付きます。
次にMaxLiquidのセットアップをしていきます。
色々試した結果になりますがParticle Flowで使用したグラスオブジェクトでは、液体のコリジョンでは上手くいかなかったので、別途調節したものを用意しました。
グラスを選択しクローンを作成。
ModifyパネルでPFlow Collision Shapeを削除。
ベースになっているシェイプ(現状のシーンではLine)のAdaptiveのチェックを外しました。
プリミティブのPlaneでグラスが置いてある床を作ります。
グラスから飛び出した水の衝突用にも使うので、大き目のサイズにしました。
Createパネル>Fluids>MaxLiquidをクリックし、シーンにMaxLiquidを追加します。
作成したLiquidのパラメーターにあるSimulation Viewをクリックし、開きます。
Liquid Attributes>Emitters>Emitter IconにあるIcon TypeをCustomに変更します。
シーンのオブジェクトをエミッターにする場合はCustomを使用します。
Liquid Attributes>Emitters>Add Custom Emitter ObjectsでPickもしくはAddをクリックし、液体用のエミッターを選択します。(こちらのシーンではemitterになります。)
さらに液体が入っているグラスおよび、地面、氷を衝突用のオブジェクトとして追加していきます。
Liquid Attributes>Colliders/Kill PlaneのAdd CollidersでPickもしくはAddをクリックし、使用するオブジェクトを追加していきます。
(先ほど修正したグラスglass_Liquid_collisionおよびgroundを追加しました。)
ここでParticle FlowをCollidersで選択出来ないことに気付きました。スクリプトを使用するなどしてParticle Flowを通常のオブジェクトに変換しようかと思いましたが、試しに別のアプローチをしてみました。
Createパネル>Compound Objects>Mesherをクリックし、シーンにMesherを作成します。
Mesherのパラメーター内、Pick objectでParticle Flowを選択。
LiquidのSimulation Viewに戻り、Add Collidersで選択します。
これで無事、氷オブジェクトも追加できました。
Liquidのシミュレーションを設定していきます。
シーンのLiquidを選択し、Simulation Viewを開きます。
Solver Parametersパネルに移ります。
Solver Parameters>Simulation Parameters>General Parametersの
ScaleにあるUse System Scaleのチェックを外し1unit=1centimetersに設定しました。
リアル系のシミュレーションの場合で、シーンスケールを正しく設定している場合はこの作業は不要かと思います。
次にSolver Parameters>Liquid Parametersで液体自体の設定をしていきます。
(2018.4から、色々と液体のプリセットが付きました。)
今回はPresetsからOlive Oilを選んでみました。
Solver Parameters>Emitter Objectsに行き、エミッターの設定をします。
Emitter Parameters>Emitter PropertiesでEmitter TypeをContainerに変更します。
タイプがEmitterの場合はパーティクルを放出し続けます。それに対してContainerは一度だけ放出します。
今回は、既にグラスに入っている水をシミュレーションするのでContainerにしました。
Solver Parameters>Collision Objectsに行き、衝突オブジェクトの設定をします。
今回はデフォルトのままで問題なさそうです。
Collider Conversion Parameters>ConversionのModeに関して
Solidは中身のつまったオブジェクトとしてシミュレーションします。
Shellは中身が空洞のオブジェクトとしてシミュレーションします。
Solid(Robust)はヘルプを見る限りでは、完全な空洞でもないし詰まってもいないオブジェクトといった感じでしょうか?今後試してみます。
試しに一度シミュレーションをかけてみようと思いますが、デフォルトのままだとそれなりに時間がかかりそうなので、軽い設定にします。
Solver Parameters>Simulation Parameters>General ParametersのSolver Propertiesで
Master Voxel Sizeを2.5にしました。
Cachingパネルに移動し、Cashe Settingでキャッシュの書き出し先の設定をしてシミュレーションを開始してみます。
シミュレーションが開始されるとパーティクルが表示されると思います。
一つづつのパーティクルの表示サイズが大きすぎるので
Display Settingsパネルに行き、Liquid Setting>Particle SettingsでSizeを0.1まで下げました。
そうすると、パーティクルに偏りがあるのがわかるかと思います。
そこで一度シミュレーションを止め、Solver Parameters>Simulation Parameters>General Parameters
のSolver PropertiesにあるDelete Exceeding Paritclesのチェックをオフにします。
(上方が多くて、下方が少なくなっています。特にスケールが大きい海洋等のシミュレーションで深部を見せる必要がない場合などは有効な機能ですが今回は向いていません。)
もう一度シミュレーションをかけなおします。
Restartをクリックし最初からシミュレーションをし直します。
(Resumeは再開になります。)
シミュレーション結果をみた感じから、重力が軽い印象があったので12まで上げました。
またFoam(泡)を足しました。
今回はスケールの小さいシーンなので、少量で十分です。
Solver Parameters>Foam Parameters>Foam Propertiesで調整しました。
細かい部分はヘルプを読んで頂いたければと思います。
さらに粘性(Viscosity)を0.09まで上げてみました。
最終的にMaster Voxel Sizeを0.8にして再度シミュレーションをかけました。
レンダリングの設定をしていきます。
Render Setupを開き、Renderer をArnoldに変更します。
Arnold Rendererパネル>Envioroment,Background & Atomosphereで
Open Enviromet Settingをクリックし、Enviroment and Effectsを開きます。
(メニューのRenderingからEnviromentをクリックで開いても同じです。)
Enviroment MapにBitmap>HDRI画像を適用しました。
Arnold Rendererパネル>Envioroment,Background & Atomosphereに戻り、
Background(Backplate)をCustom Colorにします。
コンポジット作業を考え、背景を環境マップではなくフラットな色にするためです。通常は黒だと思います。
氷に質感をつけていきます。
Particle Viewを開き、グローバルイベントにオペレーターのMaterial Staticを追加。
Material EditorでMaterials>Arnold>SurfaceからStandard Surfaceを選び、
先ほどのMaterial Staticにインスタンスでアサインします。
Createパネル>Lights>ArnoldでArnold Lightを作成します。
Arnold Lightのパラメーター内にあるShape>Emit Light FromのTypeをSpotにしました。
先ほど氷に割り当てたStandard Surfaceを調整していきます。
ArnoldでMaxのマテリアルの機能を使う場合は、Render Setup>Systemにある
Legacy 3ds Max Map surpportにチェックを入れると使用できるようになります。
氷用のStandard SurfaceのNomalにMap>Arnold>Bump 2Dを割り当て
さらにMap>General>Noiseを割り当てていきバンプをかけました。
細かい設定は、シーンを見て頂ければと思います。
さらにグラスにも質感をつけました。
次に液体のメッシュを設定し、質感をつけます。
Liquidを選択、Simulation Viewを開きます。
Display SettingsパネルへいきLiquid Settings >Display TypeをBifrost Dynamic Meshに変更しメッシュの設定をしていきます。
細かいパラメーターはヘルプを見て頂ければと思いますが、特に見た目に大きく影響してくる部分は、そもそものシミュレーション解像度(Master Voxel Size)。Surface Radius=パーティクルの半径および、Resolution Factor=解像度のスケーリング係数(大きい値ほどディティールが付きます。)あたりかと思います。
また予めメッシュのキャッシュをとる場合はDisplay TypeをBifrost Cache Meshに変更しキャッシュを作成します。最終的に動画のレンダリングをする際はそちらの方が良いと思います。
続いてRender Settingsパネル>Liquid Settings>Render AsでCashe Meshにします。
Foam SettingsはArnold Pointにし、Radiusを0.2にしました。
Arnoldはデフォルトで?モーションブラーがかかるようなので、オフにしてみます。
Render Setup>Arnold Renderer>Motion BlurでRespect Physical Camera settingsのチェックを外し
Motion Blur Time SpanのLengthの値を0にしました。
最後に地面の設定をしていきます。
今回は影のみ欲しかったので、その設定をしていきます。
Material Editorを開き、Maps>Arnold>SurfaceからShadow Matteを任意の場所にドラッグ&ドロップします。
このままではMapなのでオブジェクトに適用できません。
次にMaterial>Arnold>UtilityからMap to Materialをドラッグ&ドロップ。Texture Mapに先ほどのShadow Matteを適用し、地面のオブジェクトにマテリアルを適用します。
これで影のみレンダリングできるようになります。
さらにレンダリングしてみると、グラスへの地面の影があまり綺麗に見えなかったのでレンダリングされないようにしていきます。
地面用のオブジェクトにModifyパネルでモデファイアのArnold Propertiesを適用。
Arnold Propertiesのパラメーター内>General Properties>ShadowにあるCast Shadowsをオフにしました。
最後にコンポジット用にAOVsの設定をして、スキャンラインでいうところの要素を出しました。
以上がMaxLiquidで作成した基礎的な液体シミュレーションになります。
冒頭に貼った画像もMaxLiquidをベースに、Arnoldを使用してレンダリングしてみました。
ではまた次回もよろしくお願い致します。
今回のシーンファイルがダウンロードできます。