私には、当たり判定など、無い(毛利名人)――剛体シミュレーション

Alcyone2004-08-27

昨日の問題は、結局、局所速度計算のバグでした。ベクトル同士の外積を、ユーザー定義した演算子で行っているのですが、演算子同士の優先順位を意識していなかったために、計算順序がおかしくなっていました。C++の仕様として、ユーザー定義の(オーバーロードした)演算子に優先順位はつけられるのでしょうか?とはいえ、単純に括弧で明示的な優先順位を示せばいいだけなので、この辺は無駄に悩まないほうがよさそうです(^^;;


作ってみて気付きましたが、慣性テンソルを使った計算をしてあげれば、コマの歳差運動も再現できるのですね(当たり前かも(^^;; )。昨日のサイコロの下に一本足をつけて、Z軸周りでくるくる回して遊んでみました。ちなみに、剛体シミュレーションでは全部絶対座標系上で計算することが基本のようで、慣性テンソルも姿勢に応じて順次変換するのが定石らしいのですが、面倒だと思ったので速度と角速度ベクトルの方を物体座標系に変換して計算を行っています。

  • 併進運動式:F=ma → a=m/F    (F:力、m:質量、a:加速度)
  • 回転運動式:τ=Iω'→ ω'=I^-1・τ (τ:トルク、I:慣性テンソル、ω':角加速度)

難しい事は出来ないので、こんな感じの単純計算で実際の計算には逆慣性テンソルを使用します。逆テンソルは、初期化の時に一度計算してしまえばOKですね。ただ、変形ロボットとか(?)になると動的に慣性テンソルが変化するので、いちいち逆テンソルを求める手間が厳しいかも。


あとは、物体同士や、地面に対しての当たり判定を系統だって実装しなければいけません。こちらは撃力ベース(もしくはペナルティ法)を使うことになりそうですが、現実にはありえない剛体同士の「めりこみ」が生じるという意味で、モデル化を工夫しないと安定しなさそうです。