頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


Bulletでバネを設定してみる

Bulletでバネっぽい動きを試してみようとしたんだわ。
Bullet Physics 様々な制約と拘束(Constraint)
せっかくだから俺はプログラマの道を選ぶぜ@wiki - Bullet その8 バネジョイント
↑このあたりのサイトを見ながらやってみたんだけど、えらく苦労したよ。

どうもBulletではオブジェクトと空間の任意の点をつなぐ、みたいなことができないっぽい(ホントはできるのかもしれないけど、調べきれなかった)ので空間に固定するオブジェクトと動くオブジェクトをつないでみた。

オブジェクト同士をつなぐのに btGeneric6DofSpringConstraint を使ってみた。btGeneric6DofSpringConstraint オブジェクトを作る(new)のにbtTransformで座標っぽいものが必要だけど、多分ローカル座標だと思う。オブジェクトの中心同士をつなぐのであれば、二つのオブジェクトの座標(Bulletの世界での座標)がどこにあろうと
btTransform frameInA = btTransform::getIdentity();
frameInA.setOrigin(btVector3(0,0,0));
ってな感じで動いてる。
btGeneric6DofSpringConstraint *spring = new btGeneric6DofSpringConstraint(*bodyA, *bodyB, frameInA, frameInB, true);
最後のtrueはAを基準にするよってことらしい。Aを基準にするぞ、ということは
setLinearLowerLimit
setLinearUpperLimit
この辺りの設定に影響してくる。

ちなみに一番はまったのがindexの設定。
spring->enableSpring(index, true);
spring->setStiffness(index, 10.0);
みたいな設定でindexという値を設定するんだけど、最初これが何か意味があるとは思わず単に複数の拘束を付ける場合のインデックスみたいなものかと思っていたんだ。当然、ちゃんと動いてくれない。

正解はindexが0だとx方向、1だとy方向という具合に指定しなければいけなくてこれを正しく指定しないと setLinearLowerLimit , setLinearUpperLimit
あたりの設定が正しく行われなかったのよ。

<< kinematic objectに悪戦苦闘  TopPage  アナ雪アプリの致命的バグ >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/904-07ebb6b2




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad