チュートリアル / ICEの秘密
第1回:SimulatedFrameFraction 考察
- エフェクト
- コラム
- シミュレーション
- チュートリアル
- 上級者
- 映画・TV
皆さんこんにちは、私はPhilip Taylorと申します。7月に東京でICE Kinematicsのセミナーを行ったので、そこに参加された方は覚えている方もいらっしゃると思います。今回AutodeskのAREA JAPANが立ち上がると言うことで、ICEのコラムを担当することになりました。私の記事がICEコミュニティーを支えることにつながれば幸いです。
シミュレーションを計算する際は、パーティクルの挙動にフレームの間のステップと現在の位置が考慮されます。それぞれのフレームは直前のフレームの結果から導き出されます。

ICEではフレーム単位でサンプルを取得します。パーティクルやメッシュの動きは分割された直線のセグメントで近似されます。外力はパーティクルの軌跡を決めるシミュレーションの段階で考慮され、その値を元に位置が確定します。パーティクルはあるフレームから次のフレームに直線的に移動すると仮定してください。

シミュレーションという言葉は非常に難しく聞こえるかもしれませんが、実はそうでも無かったりします。この例のパーティクルの位置を決める時には、パーティクルが持つ速度と外力を足し合わせて新しいパーティクルの位置を計算します。この手法はオイラー積分と呼ばれ、パーティクルの位置を割り出す数ある手法の一つです。ICEではデフォルトでこの計算手法を採用しています。この他にもベルレ積分などがあります。この手法は衣服や髪の挙動などでしばしば使用されていますが、このコラムでは取り扱いません。

シミュレーション時にFrame FractionのパラメータはICEでは全てのパーティクルに存在します。それぞれのフレームの最初では値は0.0にセットされ、フレーム内のシミュレーションの間に値は1.0になってきます。SimulatedFrameFractionの値が更新されSimulateParticleノードが計算されます。ほとんどのケースではSimulate Particleノードが評価され、SimulatedFrameFractionの値が1.0にセットされることはパーティクルのシミュレーションが終了したことの一つのステップになります。ただし通常SimulatedFrameFractionに関して気にする必要性はありません。なぜならSimulate Particleノードをハンドルする際に不用意にマニュアルで値をいじるとシミュレーションが破綻することがあるからです。
それでも幾つかのケースではSimulatedFrameFractionは重要な値になります。パーティクルをどういう形でシミュレーションするにせよ、FrameFractionの値を見ることでフレームの中でパーティクルがどこまでシミュレーション済みで、どれくらい残っているのかを決めることができるためです。

ICEはContinuous Collision Detectionという非常に洗練された衝突判定のアルゴリズムを持っています。このシステムを用いれば、たとえオブジェクトが動いていたとしてもオブジェクとパーティクルの正確な衝突を検出することができます。たとえばパーティクルをシミュレートしてフレームの終わりでチェックした場合、既にパーティクルがオブジェクトから弾んだ場所にある場合があります。そんな時SimulatedFrameFractionの値を調整しパーティクルの軌道を戻してどこでパーティクルが衝突しているかを正確に測り、再度軌跡を計算することができます。Basic Collideノードはその為に使用します。
サブフレームシミュレーション
シミュレートのプロセスではパーティクルの動きは線形の動きで近似されるため、時々問題を起こします。たいていこの問題は最終的に孤の軌跡を求めているのに、ステップが少なすぎる時などに発生します。少ないステップの際に求めている結果と異なってしまうのは、我々がパーティクルの動きをフレーム単位でしか見ることができないためです。

外力がパーティクルにかかっていることを想像してください。たとえば重力の様な外力がパーティクルをある点に引っ張っていると仮定してください。パーティクルは我々が期待しているポイントには到達せず、その点を通過して飛んで行ってしまいます。一つのパーティクルだけではこの問題に気付かないかもしれません。この問題は数千のパーティクルを飛ばした時に顕在化します。たとえばパーティクルの位置が層状になってしまうといった現象が出てきます。

上記のシーンは典型的な問題が現れたものです。これらの造型的な問題点はテクニカルディレクターにとって頭痛の為です。実際このような問題はレンダリングの際に顕著に表れ、これを消すことは容易ではありません。そこで次回の記事からは、各シチュエーションごとに如何にこの問題をICEのパーティクルにおいて解決していくかを紹介していきます。 お楽しみに!