ブランコ

定義

static dSpaceID swings_space;
static dBodyID  swings_base_body[5];
static dGeomID  swings_base_geom[100];
static dBodyID  swings_chain_body[100];
static dGeomID  swings_chain_geom[100];
static dGeomID  swings_base_trans[100];
static dBodyID  swings_base_trans_body;

オブジェクト生成

#define SWINGS
#ifdef SWINGS

#undef SCALE
#define SCALE 5
#define SWINGS_BASE_RAD 0.07*SCALE
#define SWINGS_BASE_LEN 2.5*SCALE
#define SWINGS_BASE_POS_X  0
#define SWINGS_BASE_POS_Y -10

	{
 
 
		swings_base_trans_body = dBodyCreate(world);
 
		swings_base_trans[0] = dCreateGeomTransform(swings_space);
		dGeomTransformSetCleanup(swings_base_trans[0],1); 		
		swings_base_geom[0] = dCreateCapsule (0,SWINGS_BASE_RAD,SWINGS_BASE_LEN);
		dGeomTransformSetGeom(swings_base_trans[0],swings_base_geom[0]);
		dGeomSetPosition (swings_base_geom[0],SWINGS_BASE_POS_X,SWINGS_BASE_POS_Y,SWINGS_BASE_LEN*0.4);
		{
			dMatrix3 R;
			dRFromAxisAndAngle(R, 1.0, 0.0, 0.0,  M_PI/ 6.0);
			dGeomSetRotation(swings_base_geom[0],R);
		}
 
		swings_base_trans[1] = dCreateGeomTransform(swings_space);
		dGeomTransformSetCleanup(swings_base_trans[1],1); 		
		swings_base_geom[1] = dCreateCapsule (0,SWINGS_BASE_RAD,SWINGS_BASE_LEN);
		dGeomTransformSetGeom(swings_base_trans[1],swings_base_geom[1]);
		dGeomSetPosition (swings_base_geom[1],SWINGS_BASE_POS_X,SWINGS_BASE_POS_Y-1.3*SCALE,SWINGS_BASE_LEN*0.4);
		{
			dMatrix3 R;
			dRFromAxisAndAngle(R, -1.0, 0.0, 0.0,  M_PI/ 6.0);
			dGeomSetRotation(swings_base_geom[1],R);
		}
 
		swings_base_trans[2] = dCreateGeomTransform(swings_space);
		dGeomTransformSetCleanup(swings_base_trans[2],1); 		
		swings_base_geom[2] = dCreateCapsule (0,SWINGS_BASE_RAD,SWINGS_BASE_LEN);
		dGeomTransformSetGeom(swings_base_trans[2],swings_base_geom[2]);
		dGeomSetPosition (swings_base_geom[2],SWINGS_BASE_POS_X+3.0*SCALE,SWINGS_BASE_POS_Y,SWINGS_BASE_LEN*0.4);
		{
			dMatrix3 R;
			dRFromAxisAndAngle(R, 1.0, 0.0, 0.0,  M_PI/ 6.0);
			dGeomSetRotation(swings_base_geom[2],R);
		}
 
		swings_base_trans[3] = dCreateGeomTransform(swings_space);
		dGeomTransformSetCleanup(swings_base_trans[3],1); 		
		swings_base_geom[3] = dCreateCapsule (0,SWINGS_BASE_RAD,SWINGS_BASE_LEN);
		dGeomTransformSetGeom(swings_base_trans[3],swings_base_geom[3]);
		dGeomSetPosition (swings_base_geom[3],SWINGS_BASE_POS_X+3.0*SCALE,SWINGS_BASE_POS_Y-1.3*SCALE,SWINGS_BASE_LEN*0.4);
		{
			dMatrix3 R;
			dRFromAxisAndAngle(R, -1.0, 0.0, 0.0,  M_PI/ 6.0);
			dGeomSetRotation(swings_base_geom[3],R);
		}
 
		swings_base_trans[4] = dCreateGeomTransform(swings_space);
		dGeomTransformSetCleanup(swings_base_trans[4],1); 		
		swings_base_geom[4] = dCreateCapsule (0,SWINGS_BASE_RAD,SWINGS_BASE_LEN*1.2);
		dGeomTransformSetGeom(swings_base_trans[4],swings_base_geom[4]);
		dGeomSetPosition (swings_base_geom[4],SWINGS_BASE_POS_X+1.5*SCALE,SWINGS_BASE_POS_Y-0.66*SCALE,SWINGS_BASE_LEN*0.85);
		{
			dMatrix3 R;
			dRFromAxisAndAngle(R, 0.0, 1.0, 0.0,  M_PI/2.0);
			dGeomSetRotation(swings_base_geom[4],R);
		}
 
		dGeomSetBody(swings_base_trans[0],swings_base_trans_body);
		dGeomSetBody(swings_base_trans[1],swings_base_trans_body);
		dGeomSetBody(swings_base_trans[2],swings_base_trans_body);
		dGeomSetBody(swings_base_trans[3],swings_base_trans_body);
		dGeomSetBody(swings_base_trans[4],swings_base_trans_body);		
 
	}
#endif

Geom描画関数

static void drawGeom(dGeomID g, const dReal *pos, const dReal *R)
{
  if (!g) return;
  if (!pos) pos = dGeomGetPosition(g);
  if (!R) R = dGeomGetRotation(g);
 
  int type = dGeomGetClass(g);
 
  if (type == dCCylinderClass) {
    dReal radius,length;
    dGeomCCylinderGetParams(g,&radius,&length);
    dsDrawCappedCylinderD(pos,R,length,radius);
  }
  else if (type == dSphereClass) {
    dsDrawSphereD(pos,R,dGeomSphereGetRadius (g));
  }
  else if (type == dGeomTransformClass) {
    dGeomID g2 = dGeomTransformGetGeom(g);
    const dReal *pos2 = dGeomGetPosition(g2);
    const dReal *R2   = dGeomGetRotation(g2);
    dVector3 actual_pos;
    dMatrix3 actual_R;
    dMULTIPLY0_331(actual_pos,R,pos2);
    actual_pos[0] += pos[0];
    actual_pos[1] += pos[1];
    actual_pos[2] += pos[2];
    dMULTIPLY0_333 (actual_R,R,R2);
    drawGeom(g2,actual_pos,actual_R);
  }
}

描画部分

#ifdef SWINGS
	{
		drawGeom(swings_base_geom[0],0,0);
		drawGeom(swings_base_geom[1],0,0);
		drawGeom(swings_base_geom[2],0,0);
		drawGeom(swings_base_geom[3],0,0);
		drawGeom(swings_base_geom[4],0,0);
	}
#endif
最終更新:2013年10月08日 14:51