1 月 02

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日

