重心の移動
物体の重心をずらす方法について説明します。
サンプルコードでは重心をずらした球体を地面に落としてみました。
重心がずれていることで球体は垂直にバウンドせずに斜めに跳ね返りました。
サンプルコードでは重心をずらした球体を地面に落としてみました。
重心がずれていることで球体は垂直にバウンドせずに斜めに跳ね返りました。
黄色の球体の中に見える青色の点がずらした重心位置です。

説明
重心を移動するにはソースコードにdGeomSetOffsetPosition関数を追加するだけです。
この関数は、bodyに対してgeomをどれだけずらすかを設定できるものです。
これは重心を移動するのではなく、重心位置(body)から衝突物体(geom)位置をずらすイメージになります。
この関数は、bodyに対してgeomをどれだけずらすかを設定できるものです。
これは重心を移動するのではなく、重心位置(body)から衝突物体(geom)位置をずらすイメージになります。
コードでpos[]が物体の位置でg_pos[]が重心位置をずらす値です。
dBodySetPosition関数によってpos+g_posに配置した後、dGeomSetOffsetPosition関数によって-g_posして物体位置を補正しています。
dBodySetPosition関数によってpos+g_posに配置した後、dGeomSetOffsetPosition関数によって-g_posして物体位置を補正しています。
dGeomSetOffsetPosition関数を使用する際の注意として、geomにbodyが設定された状態でこの関数を呼ぶ必要があります。
もし設定されていない状態で使用すると思わぬエラーが出力されます。
もし設定されていない状態で使用すると思わぬエラーが出力されます。
// create Sphere
dReal pos[3] = { 0.0, 0.0, 5.0 }; // 物体位置(絶対値)
dReal g_pos[3] = { 0.1, 0.0, 0.0 }; // 重心位置(相対値)
b_sphere = dBodyCreate( world ); // set dBodyID
dBodySetPosition( b_sphere, pos[0]+g_pos[0], pos[1]+g_pos[1], pos[2]+g_pos[2] );
dMass sphere_mass;
sphere_mass.setSphere( 1.0, radius );
dBodySetMass( b_sphere, &sphere_mass ); // 質量設定
g_sphere = dCreateSphere( space, radius ); // set dGeomID
//dGeomSetPosition( g_sphere, pos[0], pos[1], pos[2] );
dGeomSetBody( g_sphere, b_sphere );
dGeomSetOffsetPosition( g_sphere, -g_pos[0], -g_pos[1], -g_pos[2] ); // 重心位置変更
関連
void dGeomSetOffsetPosition (dGeomID, dReal x, dReal y, dReal z);
void dGeomSetOffsetRotation (dGeomID, const dMatrix3 R);
void dGeomSetOffsetQuaternion (dGeomID, const dQuaternion Q);
サンプルコード

以上