RayFire ToolのFragmentationで亀裂を入れ、PhysXでシミュレーションをスタートした瞬間にImpact Objectsが吹き飛ぶような現象を回避する方法。


始めはコリジョン許容範囲や摩擦係数が原因かと思っていたのですが、アップされているサンプルシーンなどでシミュレートしてみるとそういう現象が起きなかったので、割り方に原因があるのかと思いCGTalkのRayFire Toolスレッドを読んでみました。

RayFire Toolスレではこのような現象を”Popcorn現象”や”Boom現象”と呼び、Fragmentation OptionsのNoise Strengthが少しでも入っていることが原因みたいです。作者曰く、PhysXのアップデートによって起こり始めたもので、以前のバージョンでは起きなかったとのことです。

肝心の回避方法なのですが、単純にNoise Strengthを0にするだけです。ただ、それではあまりにもディテールが無さすぎるということで追加されたのがBoronoiというフラグメントタイプです。このタイプを使用する際は、Iterationの右のスピナー、Chaos、Detalization、Noise Strengthと、Advanced Fragment OptionsのJitter AmountとRift Widthを最小値にして、Fill Riftsのチェックを外します。

そんなもんちゃんと書いとけ!!って思ったら、ヘルプに最重要事項としてしっかり明記されてましたorz

訳すと、「PhysXエンジンはシミュレーション時、オブジェクトを凸面オブジェクトとして単純化します。現時点では凹面オブジェクトとして計算することは一切できません。これによってオブジェクトが相互貫通していないにも関わらず、シミュレート開始直後に吹き飛んでしまいます。凸面オブジェクトは、お互いのローカルスペースを離し合おうとしているのです。
これを回避するにはフラグメントタイプをBoronoiにしてください。これはフラグメントをきれいな凸面オブジェクトとして生成します。もしくは、Noise Strengthを0にしてください。凹面としてシミュレートする唯一の方法は、標準のグループ機能を使っていくつかのオブジェクトをコンバインすることです。この場合は1つのソリッドオブジェクトとして扱われます。」

まぁ作者からするとRayFire Toolはプラグインというよりはスクリプトみたいなものなので、あくまでもMaxとPhysXのコントロール下であがくしかないみたいですw ただいかんせん、Noise Strength値を入れたときのようなランダムな割りとは程遠いので、PhysXともども何とかしてほしいですね。

ちなみにVoronoiと言えば、『2012』にも使われていたCebasのVolumeBreakerもVoronoiを使っていたような。要はボリューメトリクスのアルゴリズムでオブジェクトを分割するということみたいです。