PythonによるOpen Dynamics Engine講座 その3

単なる落下物


ここでは、単にリンゴ(球体)を自由落下させてその位置を数値で出すだけのプログラムを作成します。なぜ、いきなり3D描写しないかというと、C++版のODEには"drawstuff"という三次元グラフィクスライブラリが付いていますが、pyODEにはついていません。そこで、OpenGL、GLUTを用いて3D描写をします。サンプルプログラムをここからダウンロードしてください。

プログラムの流れは以下のようになっています。

  1. 動力学計算の世界の生成(ode.World)
  2. 重力の設定(world.setGravity)
  3. 剛体の生成(ode.Body(world))
  4. 剛体の質量の設定(apple.setMass(mass))
  5. 剛体の位置の設定(apple.setPosition)
  6. シミュレーションループ(while True 〜 world.step(dt))

動力学計算の世界を最初に作らなければなりません。この世界にode.Body(world) で剛体を登録するといった感じかな。
この世界に登録された剛体は同じ重力を受けますし、worldの動力学計算を1ステップ進めると登録された剛体は1ステップ進みます。
少しわかりにくいのが剛体の質量の設定だと思います。これって、apple.Sphere(m,r)じゃダメなのでしょうか?

massは全質量、重心位置、慣性モーメントなどのパラメータが格納されている構造体・・・・・・らしいです。(簡単!実践!ロボットシミュレーション 著者:出村公成 出版社:森北出版 2007年発行 10ページ参照)

これ(動力学計算用のボディ、ode.Body(world))の他に、物体の衝突計算用のジオメトリを作らないと衝突判定はできませんがそれが原因なのでしょうか。
つまり、動力学計算だけして衝突計算は行わない剛体も作れます。

あと、重要な関数はworld.step(dt)です。これは動力学計算を1ステップ、dtだけ進めるための関数です。

実行した結果はZ軸方向の大きさがどんどん小さくなっていくのがわかります。
つまり、3D描写する際はこの実行結果のX、Y、Z座標を中心とした半径rの球を描写すれば落下するリンゴを再現できます。次回はPyOpenGLの使い方をやります。


PythonによるOpen Dynamics Engine講座に戻る

トップページへ戻る