1 月 02

新年明けましておめでとうございます。
ゲーム開発やロボットの研究者にも使われているオープンソースの物理計算エンジンODE(Open Dynamics Engine、オープン ダイナミクスエンジン)を学ぶODE講座の第14回目です。
ご質問の中でインタラクティブにシミュレーションをしたいという要望が多かったので、今回はその方法を学びます。ODEでは,シミュレーション中にキーボードからの入力を受付けますので,入力するキーに対応する関数などを作成するとインタラクティブなシミュ レーションが可能となります.ODEもブログもインタラクティブなところが魅力の一つですね.
以下に重要な部分だけソースコードを示します.このプログラムはsample2を変更し,ボールの他に円柱オブジェクトを表示して,キーボードからの入力により外力を加えたり,シミュレーションの再スタートを可能としています.
CODE:
-
/*** 描画の準備 ***/
-
void prepDrawStuff()
-
{
-
fn.version = DS_VERSION;
-
fn.start = &start;
-
fn.step = &simLoop;
-
fn.command = &command; // キー入力で呼び出される関数のアドレス
-
fn.stop = NULL;
-
fn.path_to_textures = "../../drawstuff/textures";
-
}
-
-
/** * キー入力で呼び出される関数 ***/
-
void command(int cmd)
-
{
-
switch (cmd) {
-
case ’s’: dBodyAddForce(pillar.body,50, 0, 0);break; // sキーが押されたらときの処理
-
case ‘j’: dBodyAddForce(ball.body ,0,-10, 0);break; // jキーが押されたらときの処理
-
case ‘k’: dBodyAddForce(ball.body ,0, 0,50);break; // kキーが押されたらときの処理
-
case ‘l’: dBodyAddForce(ball.body ,0, 10, 0);break; // lキーが押されたらときの処理
-
case ‘r’:restart() ;break; // rキーが押されたらときの処理
-
}
-
}
-
-
/*** シミュレーションを再スタート ***/
-
void restart()
-
{
-
// 破壊
-
dJointGroupDestroy(contactgroup); // 接触点のグループを破壊
-
destroyBall(); // ボールを破壊
-
destroyCylinder(); // 円柱を破壊
-
-
// 生成
-
contactgroup = dJointGroupCreate(0); //接触点グループの生成
-
createBall(); // ボールの生成
-
createPillar(); // 円柱の生成
-
}
-
-
/*** ボールの破壊 ***/
-
void destroyBall()
-
{
-
dBodyDestroy(ball.body);
-
dGeomDestroy(ball.geom);
-
}
-
-
void destroyCylinder()
-
{
-
dBodyDestroy(pillar.body);
-
dGeomDestroy(pillar.geom);
-
}
-
-
static void simLoop (int pause)
-
{
-
// キーボードからcontrolキーを押しながらpキーを押すと
-
// シミュレーションが一時停止する
-
if (!pause) {
-
dSpaceCollide(space,0,&nearCallback);
-
dWorldStep(world,0.01);
-
dJointGroupEmpty(contactgroup);
-
}
-
drawObject(ball.geom,1.3,0,0);
-
drawObject(pillar.geom,0,0,1.3);
-
}
command関数はキーボードからの入力を処理する関数です。caseの右にある'r'などの文字はキーボードが押された文字に対応します。この部分に必要な処理を書けばインタラクティブなシミュレーションを作ることが可能となります。ここでは、'r'キーが押されるとrestart関数がよばれ、シミュレーションが再スタートされています。
なお、ソースコードはここにありますのでダウンロードして実行してください.
キーボードのs, j ,k, lキーを押すと円柱やボールに外力が働き,rキーを押すとシミュレーションがリスタートし,コントロールキーを押しながらpキーを押すと一時停止します.お試しあれ.
投稿:07年01月02日

