Unity 2019.3 ベータ版 で、Unity に組み込まれている PhysX にかなり多くの更新が行われます。これにより、現在の Unity 組み込みの PhysX がより正確、高速、そしてよりロバストに動作するようになります。
私たちは PhysX ライブラリを PhysX 3.4 から PhysX 4.1 にアップグレードしました。詳細については、NVIDIA の PhysX 4.1 SDK Guide にある「Migrating from PhysX SDK 3.4 to 4.0」セクションをご覧ください。
Unity 2019.3 で、Temporal Gauss-Seidel と呼ばれる新しいソルバータイプを公開しました。このソルバーは、Physics カテゴリーの Edit > Project Settings 下でご利用できます。この新しいソルバータイプでは、ジョイントのオーバーストレッチやさまざまな不具合に対する耐性が高まる傾向にあります。
さらに、Automatic Box Pruning と呼ばれる新しいブロードフェーズアルゴリズムを公開しました。これは、しばらくの間利用可能であった Multibox Pruning アルゴリズムに似ていますが、現在ではワールド境界と細分化する量を自動的に計算ができるようになりました。グリッドセルのセットを維持し、通常の Sweep And Prune アプローチを使用して重なる可能性のあるコライダーのペアを見つけ出します。これは、単一の Sweep And Prune が必要以上に多くの誤検出を引き起こすような大きなシーンで役立てることを目的としています。このモードは PhysX 4.1 のデフォルトのブロードフェーズアルゴリズムですが、Unity への導入に際しては保守的なアプローチをとり、デフォルトでは無効にしてあります。お試しになりたい方は、Physics 設定の Broadphase Type を変更して有効にしてください。
ミッドフェーズは、物理クエリを実行したり、コライダーがメッシュの表面に接近したりしたとき、メッシュに交わる可能性がある三角形の小さな集合を選択する一連のデータ構造とアルゴリズムです。メッシュが多数の三角形で構成されており、そのすべての三角形に対して正確なチェックを実行せずに済むようにしたいというアイデアに基づき、アルゴリズムがチェックする価値がある小さなサブセットのみを選択できるような加速構造を構築します。
この加速構造は、物理演算のメッシュベイク処理中に構築されます。これは通常、MeshCollider コンポーネントをインスタンス化し、その sharedMesh プロパティを割り当てるときに発生します。その構造の構築には時間がかかる可能性があり、その時間を最小限に抑えることは一定の価値があります。古い PhysX では、このプロセスで費やされた時間の大部分は R-Trees の構築に費やされていました。
PhysX 4.1 では R-Trees を必要としない新しいアルゴリズムが構築されています。ただし、現時点では、Windows、Mac、および Linux のみでしか実行できないという欠点があります。デスクトッププラットフォームでは新しいアルゴリズムが自動的に使われますが、Cooking Options ドロップダウンメニューから MeshCollider ごとに無効にすることができます。サポートされていないプラットフォームでは、自動的に古いミッドフェースアルゴリズムにフォールバックします。
前述したように、新しい MeshCollider のインスタンス化には時間がかかる場合があります。2019.3 の物理演算では Physics.BakeMesh 関数を使用して MeshCollider で使うための Mesh のインスタンスを事前にベイクすることが可能です。ロード待ち画面や、アドベンチャーゲームの会話シーンやカットシーンのような画面遷移シーンの背後で、計算量の大きいメッシュのベイキング処理を行うことができます。
この関数に付随して現れる興味深い現象は、メインスレッドから実際に関数を呼び出すことができ、そのような方法で利用可能なすべてのコアにベイキングの負荷が分散されることです。C# Job System で使用する方法の例については、ドキュメントを確認してください。
Exposing a thread-safe Physics.BakePhysicsMesh(meshInstanceId, isConvex) function to bake the data for MeshCollider on-demand from any thread. Usage example with C# job system (generate N meshes and bake off the main thread): https://t.co/vWIQ64yVqG pic.twitter.com/wsHHsD9Rsx
— Anthony Yakovlev (@AnthonyYakovlev) April 15, 2019
Unity 2018.3 で TerrainCollider のよりロバストな接触生成パスへの切り替えを行い、また接触生成アルゴリズムにも変更を加えました。この新しいアルゴリズムは、接触の計算を行うときにハイトマップのジオメトリを扱う特別なパスを使う代わりに、接触しているハイトマップの一部分をメッシュとして扱い、通常のメッシュとの接触を生成するコードを利用します。ただし、古いコードも当面残され、Enable Unified Heightmaps オプションを有効にすることで引き続き利用可能でした。
Physx 4.1 へのアップデートに伴い、Enable Unified Heightmaps オプションが削除されます。これに基づいて、Terrain コンポーネント内のプロパティで使用可能だった厚さ設定も削除されます。地形の厚みは、高速で移動するオブジェクトが検出されずに地形の表面を通過するトンネリング効果を解決することを目的とします。厚みがなくなったので、代わりに、Continuous Collision Detection を使用することをお勧めします。
キネマティックな Rigidbody がキネマティックでない Rigidbody に変わると、物理エンジンは衝突検出のためにその Rigidbody をブロードフェーズの木構造に再挿入します。これにより、追加の OnTriggerEnter イベントが発生します。
私たちは Unity における PhysX の統合の完成と安定化に注力してきましたが、このアップデートにより、精度、安定性、およびパフォーマンスを向上させたいと思っています。Unity 2019.3 ベータ版を入手しましょう。お試しいただいたら、フォーラムでぜひあなたのご意見をお聞かせください!