質量の設定
物体に質量を設定する方法について説明します。
質量パラメータ
質量は、次のdMass構造体で定義されています。
struct dMass {
dReal mass; // 剛体の全質量
dVector4 c; // 重心(x,y,z)
dMatrix3 I; // 3x3慣性テンソル
};
3x3慣性テンソルは、物体がその場所に止まろうとする力に影響を与えます。
ここでは、数学的な話しはとばします。
ここでは、数学的な話しはとばします。
ODEでは、これらパラメータを直接触ることはなくて用意されたAPIによって制御できます。
質量を与える方法として次の3通りあります。
- 形状と質量密度から質量を与える (dMassSetXXX)
- 形状と剛体の全質量で与える (dMassSetXXXTotal)
- パラメータを直接制御する (dMassSetParameters)
普通3はやらないので、選択肢としては1もしくは2になります。
設定された質量は、次のAPIにより剛体に設定されます。
void dBodySetMass (dBodyID, const dMass *mass);
void dBodyGetMass (dBodyID, dMass *mass);
質量設定
Boxに質量を与える
void dMassSetBox (dMass *, dReal density, dReal lx, dReal ly, dReal lz);
void dMassSetBoxTotal (dMass *, dReal total_mass, dReal lx, dReal ly, dReal lz);
- density : 密度
- lx, ly, lz : サイズ(x, y, z)
- total_mass : 剛体全体での質量
Sphere(球体)に質量を与える
void dMassSetSphere (dMass *, dReal density, dReal radius);
void dMassSetSphereTotal (dMass *, dReal total_mass, dReal radius);
- density : 密度
- radius : サイズ(半径)
- total_mass : 剛体全体での質量
Cylinderに質量を与える
void dMassSetCylinder (dMass *, dReal density, int direction, dReal radius, dReal length);
void dMassSetCylinderTotal (dMass *, dReal total_mass, int direction, dReal radius, dReal length);
- density : 密度
- direction : 軸の方向(1=x,2=y,3=y)
- radius : サイズ(半径)
- length : サイズ(永さ)
- total_mass : 剛体全体での質量
Calsuleに質量を与える
void dMassSetCapsule (dMass *, dReal density, int direction, dReal radius, dReal length);
void dMassSetCapsuleTotal (dMass *, dReal total_mass, int direction, dReal radius, dReal length);
- density : 密度
- direction : 軸の方向(1=x,2=y,3=y)
- radius : サイズ(半径)
- length : サイズ(永さ)
- total_mass : 剛体全体での質量
Trimeshでの質量設定
void dMassSetTrimesh (dMass *, dReal density, dGeomID g)
- density : 密度
その他
void dMassAdjust (dMass *, dReal newmass);
質量を調整。
すでに密度で与えられたdMassに対して全質量を再度与えるのに有用。
すでに密度で与えられたdMassに対して全質量を再度与えるのに有用。
void dMassTranslate (dMass *, dReal x, dReal y, dReal z);
大きさの調整。
void dMassRotate (dMass *, const dMatrix3 R);
回転の調整。
void dMassAdd (dMass *a, const dMass *b);
aにbを加算。
メモ
以下に球体に質量を設定する例を示します。
dReal radius = 1.0;
dReal density = 1.0;
dBodyID b_sphere = dBodyCreate( world );
dMass sphere_mass;
sphere_mass.setSphere( density, radius ); // 密度指定 -> 質量等計算
dBodySetMass( b_sphere, &sphere_mass ); // 球体に質量を設定
質量を設定する場合には、密度を与えて設定します。
ここでは密度densityに1.0を与えています。
ここでは密度densityに1.0を与えています。
もし、半径r=1.0の球体の質量weightを10.0と設定したい場合には、密度densityは次のように計算。
weight = 3/4 * 3.14 * r * r * r * density density = weight / (3/4 * 3.14 * r * r * r)
以上の計算からdensityは4.2に設定すればよいことになります。
直接質量を設定するにはadjust関数を使えばよいでしょう。
dMass構造体(全体)
struct dMass {
dReal mass;
dVector4 c;
dMatrix3 I;
dMass();
void setZero();
void setParameters (dReal themass, dReal cgx, dReal cgy, dReal cgz,
dReal I11, dReal I22, dReal I33,
dReal I12, dReal I13, dReal I23);
void setSphere (dReal density, dReal radius);
void setCapsule (dReal density, int direction, dReal a, dReal b);
void setCappedCylinder (dReal density, int direction, dReal a, dReal b);
void setBox (dReal density, dReal lx, dReal ly, dReal lz);
void adjust (dReal newmass);
void translate (dReal x, dReal y, dReal z);
void rotate (const dMatrix3 R);
void add (const dMass *b);
}
- dMassパラメータを直接制御する
void dMassSetParameters (dMass *, dReal themass, dReal cgx, dReal cgy, dReal cgz, dReal I11, dReal I22, dReal I33, dReal I12, dReal I13, dReal I23);
エラーについて
dMassSetBodyを使って、質量をしたとき、次のようなエラーが出たとき。
ODE INTERNAL ERROR 2: Bad argument(s) in dBodySetMass()
もしかすると、コンパイルオプションに「-DdDOUBLE」がないためかもしれません。
付けて、再度コンパイルしなおしてみてください。
例)
付けて、再度コンパイルしなおしてみてください。
例)
g++ -c -I/usr/ode_path/ode -DdDOUBLE test.cpp g++ -o run.x test.o -L/usr/ode_path/lib -lode
以上