11 月 11
上の図はジョイント(関節)の中心に球を描画し、各ボディの重心と各関節中心を直線で結び、それが外部から見えるようにボディを半透明にしスケルトン表示しています。
ODE (Open Dynamics Engine) 講座の23回目です。 11月に入り、カニ漁が解禁になりました。雄のズワイガニはとても有名ですが、その雌は香箱ガニと呼ばれ体は小さいのですが、卵が美味で珍味として重宝されています。今年は豊漁のようで、金沢では近所のスーパーで3杯1000円程度で購入できます。金沢では美味しい食べ物とお酒と温泉がこれからの楽しみとなります。
さて、チップさんから、関節中心点の取得法について質問があり、ODE本を読んでもよくわからないとのことだったのでここで補足します。
この例では、関節の中心を球で表示し、重心と関節中心を線で表示しています。さらに、線が見えるようにボディを半透明にしています。 半透明で描画するAPIはdsSetColorAlphaです。
1. 関節中心点の取得
ここでは関節としてヒンジジョイントを例に取ります。ヒンジジョイントの関節中心点を取得するAPIは次の2つあります。
- dJointGetHingeAnchor( dJointID joint, dVector3 result)
- dJointGetHingeAnchor2(dJointID joint, dVector3 result)
- dsSetColorAlpha(float r, float g, float b, float alpha);
CODE:
- static void simLoop (int pause)
- {
- const dReal *pos[BODY_NUM],*R[BODY_NUM];
- dMatrix3 R1;
- dVector3 ap[BODY_NUM-1]; // 関節中心点 anchor point
- float ar = 0.06; // 関節表示用球の半径 anchor radius
- if (!pause) {
- if (steps++ <10) dBodyAddForce (leg[0].body, 0, 1.0, 0);
- for (int i = 0; i <BODY_NUM-1; i++) control(i, joint[i]);
- dSpaceCollide(space,0,&nearCallback);
- dWorldStep(world,0.01);
- dJointGroupEmpty(contactgroup);
- }
- // 重心位置と回転行列の取得 calculate positions and orientaitons
- for (int i = 0; i <BODY_NUM; i++) {
- pos[i] = dBodyGetPosition(leg[i].body);
- R[i] = dBodyGetRotation(leg[i].body);
- }
- // 関節中心の取得 calculate anchor points
- dRSetIdentity(R1);
- for (int i = 0; i <BODY_NUM-1; i++) {
- dJointGetHingeAnchor(joint[i], ap[i]);
- }
- // 関節中心から重心まで直線で描画 draw lines
- for (int i = 0; i <BODY_NUM-1; i++) {
- dsSetColorAlpha(1.3, 1.3, 1.3, 1.0);
- dsDrawLine(pos[i], ap[i]);
- dsSetColorAlpha(0.0, 0.0, 0.0, 1.0);
- dsDrawLine(ap[i], pos[i+1]);
- }
- dsSetColorAlpha(1.3, 0.0, 0.0, 0.5);
- // 関節中心を中心とした球の描画 draw anchors
- for (int i = 0; i <BODY_NUM-1; i++) {
- dJointGetHingeAnchor(joint[i], ap[i]); // 関節中心点の取得
- dsDrawSphere(ap[i], R1, ar);
- }
- // ボディの描画 draw legs
- dsSetColorAlpha(0.0, 0.0, 1.3, 0.5); // 透明色の設定
- for (int i = 0; i <BODY_NUM; i++) {
- if (drawBody) dsDrawCapsule(pos[i],R[i],leg[i].length,leg[i].radius);
- }
- }
続く...
投稿:07年11月11日

