ODE概要
ODEとは
Open Dynamics Engine (ODE) はフリーの剛体力学をシミュレートするためのCライブラリです。
精度の方はよくないみたいなんですが高速にシミュレーションできるので、ゲーム作りや研究でロボット動作のシミュレーション等を扱うには十分に役立つツールだと思います。
流体力学とかはないので、飛行機を飛ばしたり船を走らせたりのシミュレーションは難しいかもしれません。
精度の方はよくないみたいなんですが高速にシミュレーションできるので、ゲーム作りや研究でロボット動作のシミュレーション等を扱うには十分に役立つツールだと思います。
流体力学とかはないので、飛行機を飛ばしたり船を走らせたりのシミュレーションは難しいかもしれません。
概要
ODEは次の2つの主要なコンポーネントを持っています。
- dynamics simulation engine (動力学シミュレーション・エンジン )
- collision detection engine (衝突検出エンジン)
オブジェクトの種類
ODEで扱うオブジェクトは次のものがあります。
オブジェクト | ID | 説明 |
world | dWorldID | 剛体とジョイントのためのコンテナ |
space | dSpaceID | 衝突検出するための空間 |
rigid body | dBodyID | 剛体 |
geometry | dGeomID | 衝突のためのジオメトリ |
joint | dJointID | 剛体同士を接続するためのジョイント |
group of joint | dJointGroupID | ジョイントグループ |
World"世界"(動力学シミュレーション空間)
worldは動力学シミュレーションのための空間です。
物体が落ちたり物体同士を繋げたりすることを扱います。
次の情報が計算されます。
物体が落ちたり物体同士を繋げたりすることを扱います。
次の情報が計算されます。
- 重力(gravity)
- 力(force)
- 速度(velocity)
- 剛体(rigid body)
- 位置(position)
- 方位(orientation)
- 質量(mass)
- ジョイント
- 回転力
- 回転速度
etc.
ここでは、剛体がどの位置にどのような状態で剛体の大きさに関する情報しか持ちません。なので、その剛体が球体であれ箱型であれ同じ扱いになります。
Space"空間"(衝突検出空間)
spaceは衝突検出のための空間です。
物体同士が衝突したり転がったりする動作を作るために必要になります。
次の情報を計算します。
物体同士が衝突したり転がったりする動作を作るために必要になります。
次の情報を計算します。
- 物体(geom)
- 位置(position)
- 方位(orientation)
- 形状、大きさ
etc.
ここでは、物体の衝突検出のみを計算します。物体同士が衝突した後に反発するような動作をさせるときに必要な力の計算はここでは行いません。物体の衝突は、contact jointによって表現するようです。
衝突検出されたら、contact jointを生成して衝突した物体同士を接続します。次に衝突した物体に力を与えるための計算します。計算したらcontact jointを破棄して次のステップに移ります。
衝突検出されたら、contact jointを生成して衝突した物体同士を接続します。次に衝突した物体に力を与えるための計算します。計算したらcontact jointを破棄して次のステップに移ります。
衝突検出は常に行われるとシミュレーションにかなり負荷がかかります。ODEは物体同士がある程度距離が近付いたときに計算するような工夫がなされています。
シミュレーションの流れ
ODEのシミュレーションは次のような手順で実行します。
- 動力学世界を生成する
- 動力学世界に剛体を生成する
- すべての剛体に状態(位置など)を設定する
- 動力学世界にジョイントを生成する
- 剛体にジョイントを繋げる
- すべてのジョイントのパラメータを設定する
- 必要なときに、衝突世界および衝突ジオメトリオブジェクトを生成する
- 接触ジョイントを適用するためにジョイントグループを生成する
- 繰り返し処理:while(true)
- 必要ならば剛体に力を加える
- 必要ならばジョイントパラメータを調節する
- 衝突検出を呼び出す
- すべての衝突点に接触点を生成し、接触ジョイントグループに加える
- シミュレーションを1ステップ進める
- 接触ジョイントグループのすべてのジョイントを削除する
- 動力学世界と衝突世界を破棄する
手順がおかしかったりすると正常に動作しないので注意が必要になります。
まとめ
自分がODEを触ってみて現実世界とシミュレーションの世界で違いを感じたことは、
- シミュレーションエンジンには動力学シミュレーションと衝突検出の2種類がある
- 衝突にはジョイントで表現される
です。
ODEは概念や設定を覚えてしまえば、APIが揃っているので手軽にシミュレーションできます。
なので、一から動力学シミュレーションや衝突検出のプログラムを作るよりも簡単にシミュレーション環境を構築できるところがいいところです。
ODEは概念や設定を覚えてしまえば、APIが揃っているので手軽にシミュレーションできます。
なので、一から動力学シミュレーションや衝突検出のプログラムを作るよりも簡単にシミュレーション環境を構築できるところがいいところです。
以上