Open Dynamics Engine

描画有無の設定

進化計算など行う場合,描画が必要なくなります.以下は,描画無しの設定方法を示します.

描画無し

while(1){
	simLoop(0);
	// シミュレーションループを終了する条件 
	if(t>10.){
		break;
	}
}

描画有り

dsSimulationLoop (argc,argv,640,480,&fn);

 シミュレーションを特定の条件で止める場合は,simloop内でdsStopを利用してください.『break』と同様の効果とみなしてください.これにより,『dsStop』を利用すれば,描画有りのループも可能です.また,テキスチャを描画せず,描画ウィンドウも小さくすれば,計算処理は早くなります.ただし,二回目以降の描画には球体を描画されません(バグ?)ので,描画のみボックス型と仮定して表示することをお勧めします(動力学計算は球体,描画のみボックス型ということで).

static void simLoop (int pause){
  // 省略
  if(t>10.)dsStop();
}

描画の種類

  • ODE表記
    void dsSetTexture (int texture_number);
    void dsSetColor (float red, float green, float blue);
    // alpha: 1.0->fully opaque, 0.0->fully transparent
    void dsSetColorAlpha (float red, float green, float blue, float alpha);

dsSetColor (1,0,0);
dsDrawBox(dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides);
redgreenblue
100
110
010
011
001
000
101

(半)透明化

物体の半透明化が可能だが,半透明化している物体の中に他の物体を描画させたいときには,描画順位が重要となる.例えば,大きい半透明物体の中に小さい非透明の物体を描画させたい場合,小さい物体の描画を行った後,大きい物体の描画を行う必要がある.そもなくば,大きい物体が半透明としても小さい物体が大きい物体の内側に入ったとき,表示されない.

// 小さい物体
dsSetColorAlpha(1,1,1,1.0);
dsDrawBox(dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides0);
// 大きい物体
dsSetColorAlpha(0,1,1,0.5);
dsDrawBox(dBodyGetPosition(body[1]),dBodyGetRotation(body[1]),sides1);

模様

dsSetTexture (DS_WOOD);
dsSetColor (1,0,0);
dsDrawBox(dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides);

影無とテクスチャ無の描画方法

影とテクスチャの設定は既にライブラリの組み込まれているが,既存の開発環境で,プログラムコードでの設定は不可能である(自らdrawstuff/src/internal.hに紹介されているコードに応じてをcpp編集し,独自のdrawstuff.libを作成する方法もあるが,開発環境の再構築となるため,ここでは紹介しない.).そのため,現状における影およびテクスチャを無効する方法は,ODEの画面におけるメニューバーのショットカット(影:ctrl+S, テクスチャ:ctrl+T)を使用方法のみとなる.つまり,resource.rcにかかわることになるが,Visual C++ 2005 Express Editionではリソース編集ができないため,キーイベントを利用して,影とテクスチャの描画を無効にする方法を紹介する.

  • 宣言部
    double flag_key=0;
  • 描画部
    if(flag_key==0){
     keybd_event(VK_CONTROL,0,0,0);
     keybd_event('T',0,0,0);
     keybd_event('T',0, KEYEVENTF_KEYUP, 0);
     keybd_event('S',0, 0, 0);
     keybd_event('S',0, KEYEVENTF_KEYUP, 0);
     keybd_event(VK_CONTROL,0, KEYEVENTF_KEYUP, 0);
     flag_key=1;
    }
    dReal sides1[3] = {length[0],width[0],height[0]};
    dsSetColor (0,1,1);	
    dsDrawBox (dBodyGetPosition(body[0]),dBodyGetRotation(body[0]),sides1);
    	  

各物体の描画コード

ODE表記

void dsDrawBox (const float pos[3], const float R[12], const float sides[3]);
void dsDrawSphere (const float pos[3], const float R[12], float radius);
void dsDrawCylinder (const float pos[3], const float R[12], float length, float radius);
void dsDrawCapsule (const float pos[3], const float R[12], float length, float radius);
void dsDrawLine (const float pos1[3], const float pos2[3]);
* 括弧内の変数は,以下のコードに対応する.
『const float sides[3]』は長方形のサイズ情報『dReal sides[3] = {LENGTH,WIDTH,HEIGHT};』
『const float pos[3]』は物体位置情報『dBodyGetPosition(dBodyID)』
『const float R[12]』は物体角度情報『dBodyGetRotation(dBodyID)』

BOX(箱型)

dReal sides[3];
side[0] = length[i];
side[1] = width[i];
side[2] = height[i];
dsDrawBox (dBodyGetPosition(body[i]),dBodyGetRotation(body[i]),sides);

SPHERE(球型)

dsDrawSphere (dBodyGetPosition(body[i]),dBodyGetRotation(body[i]),radius[i]);

CAPSULE(カプセル型)

カプセル型の場合,全長は『clength』ではなく,『cradius+clength+cradius』となることに気をつける.

dsDrawCapsule (dBodyGetPosition(body[i]),dBodyGetRotation(body[i]),clength[i],cradius[i]);

RAY(線分)

// pos0は線分開始座標,pos1は線分終了座標
dVector3 pos0,pos1;
pos0[0]=0; pos0[1]=0; pos0[2]=0; 
pos1[0]=1; pos1[1]=1; pos1[2]=1; 
dsDrawLine (pos0,pos1);

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-11 (月) 06:30:33 (3481d)