剛体のこと
剛体は力が加えられても変形しない大きさのある理想的な物体
3次元空間でボディを指定するためには位置と姿勢を決めなければならない
dBodyId dBodyCreate(dWorldID world);
worldにボディを作成する
戻り値(dBodyID型)がボディを識別するためのID番号となる
void dMassSetZero(dMass *mass);
質量パラメータmassを0に初期化する
ロボットシュミレーションのための質量、慣性テンソル、重心位置など
重要なパラメータをまとめdMass構造体で定義している
typedef struct dMass{
dReal mass; // ボディの全質量
dVector4 c; // ボディ座標系での重心位置
dMatrix3 I; // ボディ座標系での慣性テンソル(3*3行列)
} dMass;
基本形状で重心位置や慣性テンソルを自動計算するAPI
void dMassSetSphere(dMass *mass, dReal d, dReal r);
void dMassSetSphereTotal(dMass *mass, dReal m, dReal r);
基本Totalの方を使うのが楽
使用例
dMass mass;
dReal m = 10; //構造体にまとめるといい(質量)
dReal r = 1; //構造体にまとめるといい(半径)
dBodyID ball = dBodyCreate(world); //ballのなかにIDが入る
dMassSetZero(&mass); //重心をリセット
dMassSetSphereTotal(&mass, m, r);//massのパラメータの自動計算
dBodySetMass(ball, &mass); //ballというボディに現在のmassデータをセットする
dBodySetPosition(ball, x,y,z); //ballというボディの位置を与える
これが基本的な流れ => ほかのものにも適応できる
void dMassSetCapsule(dMass *mass, dReal d, int dir, dReal r, dReal l);
void dMassSetCapsuleTotal(dMass *mass, dReal m, int dir, dReal r, dReal l);
dirについて
長軸方向を表す
1 : x軸方向
2 : y軸方向
3 : z軸方向
void dMassSetCylinder(dMass *mass, dReal d, int dir, dReal r, dReal l);
void dMassSetCylinderTotal(dMass *mass, dReal m, int dir, dReal r, dReal l);
基本カプセルと同じ
void dMassSetBox(dMass *mass, dReal d, dReal lx, dReal ly, dReal lz);
void dMassSetBoxTotal(dMass *mass, dReal m, dReal lx, dReal ly, dReal lz);
void dBodySetMass(dBodyID body, const dMass *mass);
ボディbodyに質量パラメータmassを設定する
void dBodyGetMass(dBodyID body, dMass *mass);
ボディbodyの質量パラメータmassを取得する
void dMassAdjust(dMass *mass, dReal new_m);
質量パラメータmassの全質量が質量new_mに一致するように質量パラメータを調整
void dMassTranslate(dMass *mass, dReal x, dReal y, dReal z);
ボディの位置は通常、重心位置となる。そして、それが相対座標系の原点になる
その原点を(x,y,z)と変位させたいときの質量パラメータmassを計算する
void dMassRotate(dMass *mass, const dMatrix3 R);
相対座標系で回転行列Rだけ回転させたときの質量パラメータmassを計算する
void dMassAdd(dMass *a, const dMass *b);
質量パラメータbを質量パラメータaに加える
void dBodySetPosition(dBodyID body, dReal x, dReal y, dReal z);
ボディbodyの位置を絶対座標系(x,y,z)[m]に設定する
void dRSetIdentity(dMatrix3 R);
回転軸ベクトル(ax,ay,az)を中心にangle[rad]回転(反時計回り)したときの回転行列Rを取得
void dRFromAxisAndAngle(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle);
void dBodySetRotation(dBodyID body, const dMatrix3 R);
void dRtoQ(const dMatrix3 R, dQuaternion q);
オイラー角 phi, theta, psi から回転行列Rを取得する
void dRFromEulerAngles(dMatrix3, dReal phi, dReal theta, dReal psi);
2つのベクトル(ax,ay,az), (bx,by,bz)から回転行列Rを取得する
これらのベクトルには回転後の相対座標系のx,y軸ベクトルを入れる
void dRFrom2Axes(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal bx, dReal by, dReal bz);
void dQsetIdentity(dQuaternion q);
回転軸ベクトル(ax,ay,az)を中心にangle[rad]回転(反時計回り)したときのクオータニオンqを取得
void dQFromAxisAndAngle(dQuaternion q, dReal ax, dReal ay, dReal az, dReal angle);
void dBodySetQuaternion(dBodyID body, const dQuaternion q);
void dQMultiply0(dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
void dQMultiply1(dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
void dQMultiply2(dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
void dQMultiply3(dQuaternion qa, const dQuaternion qb, const dQuaternion qc);
dQMultiplyの後の数字はほかの掛算関数と同様に
0 : qa = qb * qc : qc回転したあとに、qb回転する純パン
1 : pbの逆
2 : qcの逆
3 : 両方逆のクオータニオンを使って計算する
姿勢q、角速度ベクトルwからqの時間微分を計算し、その値dqを返す
void dWtoDQ(const dVector3 w. const dQuaternion q, dVector4 dq);
void dBodySetLinerVel(dBodyID, dReal x, dReal y, dReal z);
void dBodySetAngularVel(dBodyId, dReal x, dReal y, dReal z);
ボディの速度(x軸成分, y軸成分, z軸成分)[m/s],
角速度(x軸まわり, y軸まわり, z軸まわり)[rad/s]を設定する
void dBodySetForce(dBodyID body, dReal x, dReal y, dReal z);
void dBodeySetTorque(dBodyID body, dRal x, dReal y, dReal z);
void dBodyDestroy(dBodyID body);
ボディbodyを破壊するが、ボディに接続されたジョイントは機能しなくなるが破壊はされない