チュートリアル / 3ds Maxではじめるエフェクト制作
第2回:mParticles Flowを使用してみる
- 3ds Max
- エフェクト
- コラム
- チュートリアル
- 学生・初心者
トリプルアディショナル小張です。
前回はParticle Flowの基礎的な部分について触れていきました。今回はもう一歩踏み込んで、mParticles Flow について書いていきます。Particle Flowの機能の一部になっているので、基本的な操作は何も変わりません。
※今回の使用ツール:3ds Max 2018
初めて触る方の中には、mParticles Flowって?という方もいるかと思います。Particle Flowに物理シミュレーションの機能を付加させるものと思って頂ければ問題ないと思います。
今回はmParticles Flowを使用してリジッドボディー(剛体)のシミュレーションを行っていきます。
リジッドボディーとは変形しない硬いもの(石や金属)を指します。
リジッドボディーのシミュレーションをParticle Flowで行うメリットとしては前回と同じような理由で修正が容易なことに加え、通常のリジッドボディーでは苦労する部分が容易に出来るところかと思います。その部分にも少しだけ触れていこうと思います。
まずはmParticles Flowを触ってみましょう。
まずは難しいことを考えず、mParticles Flowを作ってみましょう。
といってもフローからmParticles Flowを選び、ドラッグ&ドロップするだけで、プリセット的なものは出来てしまいます。
作成し再生してみるとキューブ上のパーティクル同士が衝突し合い、重力により落ちていき、最終的に地面に衝突し跳ね返ると思います。
ここで重要なのが、Event 001の中にあるmP ShapeとmP Worldになります。
mP Worldは、mP Worldで指定したドライバーで定義された物理的な空間だと思って頂ければ良いかもしれません。
物理的な空間というのは、重力等が定義された空間です。
イベント内のmP Worldを選択し、矢印のようなアイコンをクリックすることで現在使用されているドライバーにアクセスできます。
そこで重力の強さや地面の有無等の設定をします。
mP Shapeは、物理シミュレーションエンジンにパーティクルを認識させるために必要です。
つまり、mp Shapeが無いとシミュレーションがかかりません。
またシミュレーションで使用されるパーティクルの形状や特性を設定するのもmP Shapeになります。
デフォルトでは、全てボックス形状としてシミュレーションされます。
実際に作っていってみましょう。
では以下のようなパーティクルアニメーションを作っていこうと思います。
一気にではなく上の方から徐々に崩れていくようにしています。
この辺がパーティクルでリジッドボディーを行うことで、容易に出来る部分です。
崩したいところから崩していくにはどうしたら良いか?
どうすればmParicles Flowの機能で出来るか?など技法を考えていく段階では、最初から複雑なモデルで進めるとシミュレーションに時間がかかりストレスになります。
今回に限らず技法を考えるときは、まずシンプルなもので試していくことをお勧めします。
既にどうすれば出来るか気づいてる方もいるかと思いますが、一つ目のイベントではシミュレーションを止め、collision(テスト)を使用して次のイベントに送られたものからシミュレーションがかかるようにしています。
ではまずシンプルなモデルを用意し、モデル自体をパーティクルとして読み込むところまでを解説していきます。
軽いオブジェクトで試していきます。
以降青文字部分は何のために作業したかの解説になります。
まずモデルを用意します。
(とりあえずなので、プリミティブの球体を用意しました。)
球体を分割して破片になるようにします。
ブーリアン等で作成していく方がクオリティーはあがりますが、最終的な作業が果てしなくなってきます。より高度に破片を作成できる機能が搭載されてるソフトやプラグインも販売されていますが、今回はFractureVoronoiというフリーのスクリプトを使用させて頂きました。
http://www.scriptspot.com/3ds-max/scripts/fracture-voronoi
FractureVoronoiを起動→Pick Objectで球体を選択→今回はデフォルトのままBreak in をクリックで分割しました。
(アンドゥーが効かない?のと分割する前のオブジェクトが非表示でシーンに残っているので、最終的に表示されてるものを別レイヤーにする等して混じらないように気を付けて下さい。)
さらに割りたい場合は同じ作業を繰り返していきます。
mParticles Flowをドラッグ&ドロップします。
(ゼロから組む場合はEmpty Flowをドラッグ&ドロップ)
次に、作成した破片オブジェクトをパーティクルとして使用するため、Birth GridをBirth Groupと置き換えます。(Birth Groupはシーンのオブジェクトをパーティクルとして使用する機能になります。)
Birth Groupをイベント内のBirth Gridの上にドラッグ&ドロップして置き換えます。
Birth GroupのBy List等で、破片オブジェクトを読み込みます。
オブジェクト自体をパーティクルとして読んでいるためShapeは不要になります。
イベント内のShape を削除します。
spinも、不要そうなので削除してしまいます。
一度再生してみると、勢いよく弾け飛んでしまいます。
これは、mP Shapeで定義されてる形状がデフォルトのboxのためです。オブジェクトの形状に近い形状を定義させるためConvex Hull に変更します。
イベント内のmP Shape を選択→Collide AsをboxからConvex Hullに変更します。
もう一度再生してみると、大人しく下に落ちていくようになると思います。
徐々に崩れていくようにしてみましょう。
どこから崩していくかアニメーションを付け易くするため、一度mP Worldをオフにしました。
イベントのmP Worldのアイコン部分をクリックすることでオフにします。
Ceateパネル→Space Warps→Deflectors→SDflectorでSDeflectorを作成します。
崩していきたい順になるよう、SDeflectorにアニメーションを付けていきます。
SDeflectorと接触したパーティクルを次のイベントに送るために、Collisionテストを用意します。
Event 001にCollisionをドラッグ&ドロップし、さきほどのSDeflectorを指定します。
イベントのmP Worldを選択し、空の部分へShift+ドラッグ&ドロップし次のイベントを作成します。
(同じmP World Driverを使用していないと、別イベントのパーティクルと衝突しなくなります。)
一つ目のイベントのシミュレーションを止めるため、mP Switchを使用します。
一つ目のイベントへmP Switchをドラッグ&ドロップ。mP SwitchのTurn Off Simulationをオンにします。
SDeflectorと接触した部分から崩れていくようになりましたか?
これで任意の場所から崩していくことが可能だと分かりました。
では実際の(最初に見て頂いた動画)モデルに近いもので作業していきます。
最終モデルより軽い状態でアニメーションを作ります。
まず、どこから崩していくか?重力はどれ位の強さにするか等の設定をしていくことにします。
前述のように重いモデルで作業するとストレスになるので軽めで破片も最終のものより少なめのモデルで、アニメーションのタイミングをある程度詰めてしまいます。
またBirth Groupで読んでいるモデルを変更しても、アニメーションのタイミングなどはそのまま引き継ぐことが出来ます。こういった部分もmParticles Flowでシミュレーションするメリットではないでしょうか。その点で考えると、実際の現場でエフェクト制作スタッフとモデラーが別のスタッフだとしても、ある程度モデルの大まかな形状が決まった時点でエフェクトの作業が始められます。
モデルが変わるだけで、作業内容は先ほどの球体の作業と同じです。
まず、馬のローモデルを読み込みます。(実際はモデリングの初期段階のものです。)
もっとローモデルでも良い気がしたので、リダクションしました。
モデルを選択し、Modifyパネル→Modifier List からPro Optimizerを適用
Calculateをクリックしたのち、Optimization Level を50%にしました。
ある程度シミュレーションの具合や崩れていく際のニュアンスが確認出来る程度まではVoronoiFractureを使用してモデルを分割していきます。
分割作業の終了後、Particle View を開き、mParticles Flow をドラッグ&ドロップし作成します。
前述の球体と同様のフローを作っていきます。
Birth GridをBirth Groupと置き換えます。(Event内のBirth Gridの上にBirth Groupをドラッグ&ドロップします。)
そのBirth Groupを選択し、By Listをクリックしモデルを読み込みます。
Shapeと今回はSpinも不要なので削除してしまいます。
Event内のmP Shape を選択し、Collide AsをデフォルトのBoxからConvex Hullに変更します。
このままだとモデリングした馬とパーティクルの馬が両方とも表示されているので、モデルの方を非表示にします。少々作業的には前後してしまいましたが、同時に破片を作成中に生成された非表示になっているモデルと混じらないようレイヤー分けをします。本来はモデリング終了後に分けてしまうか、使わないモデルが今後不要であれば削除してしまうことをお勧めします。
モデルを選択し易いよう、一度Particle Flowを非アクティブにします。
(もしくはDisplayパネルで、Hide by Categoryでパーティクルを非表示でも良いです。)
Eventの右上にあるアイコンをクリックすることで、非アクティブにします。
シーンで表示されてるモデルを選択します。
Toggle Layer ExplorerをクリックしLayer Explorerを開きます。
シーンのモデルが選択されたままの状態で、Layer ExplorerでCreate New Layerをクリックし新規レイヤーに移します。
目玉のアイコンをクリックし、非表示にします。
再びParticle Viewで、アクティブに戻します。
EventにCollisionテストを追加。
Event内のmP Worldを空の部分にShift+ドラッグ&ドロップで次のEventを作成。
Collisionと次のEventをつなぎます。
mP Switchを最初のEventに追加し、Turn Off Simulationのチェックを入れる。
Ceateパネル→Space Warps→Deflectors→SDflectorでSDeflectorを作成。
壊したい部分から順になるよう、SDflectorにアニメーションをつけていきます。
SDflector一つでは足らなかったので、さらに必要なだけ作りアニメーションを付けました。
Event内のCollisionで作成したSDflectorを全て指定してあげます。
納得がいくまでSDfeflectorのアニメーションや重力などの設定をしていきます。
さらにシーンのオブジェクトを衝突に追加してみます。
破壊されるオブジェクト(馬)とは別に、壊れはしないが衝突判定させたいオブジェクトを追加しました。パーティクル側には影響させたいが、そのオブジェクトにはパーティクルからの影響をさせたくない時などは、PFlow Collision Shapeというモデファイヤを使用します。
下の画像の、選択され青く囲われてるオブジェクトを衝突用に追加していきます。
レンダリング用はハイポリが良いですが、衝突用はそこまでディティールは要らないので、リダクションします。
モデルを選択し、クローンを作成します。
(モデルを選択した状態で右クリック→Clone等やり易い方法で作成して下さい。)
Clone OptionでCopyにチェックをつけクローンを作成します。
クローン元でもクローンでも構いませんが、片方を選択しModifyパネル→Modifier List からPro Optimizerを適用
Calculateをクリックしたのち、Optimization Level を適当な値まで下げリダクションします。
(今回は10%まで下げてしまいました。リダクション前のものはレンダリング用に使用します。)
さらにそのモデルに、Modifyパネル→Modifier ListからPFlow Collision Shapeを適用します。
(割と細いオブジェクトなので、Pushモデファイアを加えて少し太らせています。)
PFlow Collision ShapeのShapeがGeometryになってることを確認し、Activateをクリックし有効にします。
Particle Viewを開き、二番目のイベントにmP Collisionをドラッグ&ドロップします。
そのmP Collisionを選択しAddをクリック。先ほどのモデルをクリックし指定します。
(PFlow CollisionとmP Collisionの組み合わせはセットだと思って頂いても良いです。シーンのオブジェクトを衝突判定に使用する場合はPFlow Collision Shapeモデファイアを適用し、mP Collision で指定してあげます。)
これで、シーンのオブジェクトが衝突として判定されるようになりました。
最後に完成したモデルと差し替えます。
完成モデル(Capture5_Hires_horse_Fracture.max)も用意したので、興味がある方は先ほどのシーン(Capture4_scene4.max)に読み込んで、作業してみて下さい。
Particle Viewを開きます。
一番目のイベント内にあるBirth Groupを選択し、リスト内のオブジェクトを選択。
Removeボタンを押し、読み込んでいるオブジェクトを削除します。
Fileメニュー→Import→Mergeをクリックし、完成モデルを読み込みます。
Particle Viewに戻り、一番目のイベント内にあるBirth Groupを選択。
By Listをクリックし、読み込んだモデルを指定します。
以上で作業は完了です。
重いのでCache Diskをグローバルイベントにドラッグ&ドロップし、キャッシュを取りました。
今回の記事の冒頭に貼った画像は、今回と同じ方法で馬ではなく背景に対してシミュレーションをかけたものです。
リジッドボディーのシミュレーションをParticle Flowで行うメリットが少しでも伝わっていれば幸いです。
次回はまだ何をするか決めていませんが少しでも興味を持っていただけるものを紹介できればと思っています。
今回のシーンファイルがダウンロードできます。