レジデント準備完了 静的コンパニオン
kari_mikumao 研究室

Physics

WMMDの物理:1つのインターフェースの背後に3つのバックエンド

MMD忠実な基準としてのBullet、純Rustのフォールバック、クリーンルームのPGSソルバー、XPBDの布エンジン――コンパイル時に差し替え可能。

  • wmmd
  • 物理
  • bullet
  • xpbd

MMDの物理は、シミュレーションの問題である前に互換性の問題です。揺れもの、剛体、ジョイントは元のツール向けに作られており、期待される挙動があります。「正しく」しかし違う形でシミュレートするレンダラーは、モデルを作った本人にとってはやはり間違って見えます。WMMDの答えは、複数のバックエンドを1つのインターフェースの背後に置き、そのうち1つを基準として扱うことです。

バックエンド

4つはすべてwmmd-runtimeのCargoフィーチャの背後にあり、ホストはコンパイル時にトレードオフを選べます。

  • Bullet(既定)— crates/wmmd-bullet-sysの薄いCシムを介したBullet3による、MMD忠実な基準挙動。ベンダーされたソースをビルドするため、cmakeとC++17ツールチェーンをビルド時に要求します。
  • ネイティブRust — cmakeを必要としない組み込みバックエンド。C++ビルドが割に合わない環境向けです。
  • ネイティブPGS — Havok風のクリーンルーム実装による投影ガウス・ザイデル法とBaumgarte安定化。
  • Loom — 布と髪を狙った実験的なXPBDエンジン。

最速の実装を持つことより、基準となる実装を持つことのほうが重要です。別のソルバーでリグの挙動が怪しいとき、Bulletの結果が裁定者になり、問いは「どちらが正しいか」ではなく「なぜこのバックエンドは食い違うのか」になります。

ランタイムが持つもの

物理モジュールはIKソルバーやPhysicsControllerとともにwmmd-runtimeの中にあり、PMXの揺れもの拘束をフォーマットの3つのモードすべてで扱います。ランタイムは不変条件によりCPUのみかつファイルを読まない存在で、解析済みアセットを受け取り、ホストのフレーム時間に駆動されて1回のupdate()で物理・ボーン変換・IKを進めます。物理はモデル追加と同じコマンドキューを通じて一時停止・再開・リセット・段階指定ができます。これはエディタでは重要な細部で、リグを凍らせて再実行できるかどうかが、推測と診断の分かれ目になります。

IKソルバーはVMDのIK on/offトラックに対応しており、シーケンスの一部で意図的にIKを切るモーションも、作られたとおりに再生されます。

検証の姿勢

物理の正しさは目視で決めません。ツールクレートにはスナップショットランナーと並んで物理検証器があり、エンジン全体の作業規則として「修正は一般化しなければならない」が課されています。問題を露呈させたモデルで再現するのは構いませんが、コミットする変更と追加するテストは一般的な言葉で表現します。任意のボーン数、モーフ集合、マテリアル構成、リグ配置に対して成り立つ形であり、特定のファイル向けの特別扱いにはしません。