ODEでドミノ倒し
ODEの基本機能を使ってドミノ倒しを作成しました。
遊んでみてください。
遊んでみてください。
- コマンド操作
'a' : 牌を置く 'b' : 球を発射 'x' : 1つ削除 'd' : 全削除 'h' : カーソル左移動 'j' : カーソル前進 'k' : カーソル後退 'l' : カーソル右移動 'm' : カーソル右回転 'n' : カーソル左回転 '+' : カーソル移動距離+ '-' : カーソル移動距離ー
作成環境
OS:Linux(Ubuntu10.10)
ODE version 0.11.1
ODE version 0.11.1
ダウンロード
ode_domino01.tgz
使用した主なAPI
- dWorldCreate
- dHashSpaceCreate
- dJointGroupCreate
- dCreatePlane
- dWorldSetGravity
- dBodyCreate
- dBodySetKinematic - カーソル作成で使用
- dBodySetPosition
- dGeomSetBodydGeomSetBody
- dGeomSetBodydRFromAxisAndAngle
- dGeomSetBodydGeomSetRotation
- dGeomSetBodydGeomSetBody
- dGeomSetOffsetRotation - カーソル作成で使用
- dGeomSetOffsetPosition - カーソル作成で使用
- dGeomGetPosition
- dGeomGetRotation
- dBodySetAutoDisableFlag - シミュレーション速度確保のため
- dBodySetAutoDisableLinearThreshold
- dBodySetAutoDisableAngularThreshold
- dBodySetAutoDisableSteps
- dBodyDestroy
- dGeomDestroy
- dSpaceCollide
- dWorldQuickStep
- dJointGroupEmpty
- dJointGroupDestroy
- dAreConnectedExcluding
- dJointCreateContact
- dCollide
- dWorldDestroy
- dSpaceDestroy
- dCloseODE
低スペックなマシンのための設定
- シミュレーションステップの変更
dWorldQuickStep( world, 0.01f ); // <= 変更
- AutoDisableの設定
dBodySetAutoDisableFlag(tile->body, 1); dBodySetAutoDisableLinearThreshold(tile->body, 0.3); // <= 変更 dBodySetAutoDisableAngularThreshold(tile->body, 0.3); // <= 変更 dBodySetAutoDisableSteps(tile->body, 10);
数値は適当です。
この設定ならば私のAtomのNotePCでかろうじて動きます。
この設定ならば私のAtomのNotePCでかろうじて動きます。
まとめ
ドミノ倒しのサンプルは前々から作りたいと思っていたのですが、ようやくできました。
こだわりとしてはカーソルの移動のところ。
以前YoutubeにBulletを使ったドミノ倒しをみて対抗?してみました。
こだわりとしてはカーソルの移動のところ。
以前YoutubeにBulletを使ったドミノ倒しをみて対抗?してみました。
プログラムとしては、簡単な機能しか使っていないです。
工夫としては、衝突において、地面の摩擦を無限、牌同士の衝突を0.1と設定しています。
そうしないとうまく動きません。今回のサンプルの中で、少ないポイントの1つです。
工夫としては、衝突において、地面の摩擦を無限、牌同士の衝突を0.1と設定しています。
そうしないとうまく動きません。今回のサンプルの中で、少ないポイントの1つです。
あと、当初、dWorldStepを使って実行していたのですが、ドミノが倒れるごとに実行速度が遅くなってしまって、途中でほとんど動かなくなってしました。
ということでサンプルはdWorldQuickStepを使っています。
それと、AutoDisable機能を使って倒れている牌のみを有効にしてシミュレーション速度を確保してみました。
この機能、ちょっとやっかいでStepサイズが大きい(おおざっぱすぎる)とDisableとなる閾値にうまく入ってくれず、うまく機能してくれない場合があります。うまく動かすのに結構手間かもしれません。
ということでサンプルはdWorldQuickStepを使っています。
それと、AutoDisable機能を使って倒れている牌のみを有効にしてシミュレーション速度を確保してみました。
この機能、ちょっとやっかいでStepサイズが大きい(おおざっぱすぎる)とDisableとなる閾値にうまく入ってくれず、うまく機能してくれない場合があります。うまく動かすのに結構手間かもしれません。
Enjoy!!