bambooflow Note

質量の設定

最終更新:

bambooflow

- view
メンバー限定 登録/ログイン

質量の設定



物体に質量を設定する方法について説明します。

質量パラメータ


質量は、次のdMass構造体で定義されています。

struct dMass { 
  dReal mass;    // 剛体の全質量
  dVector4 c;    // 重心(x,y,z)
  dMatrix3 I;    // 3x3慣性テンソル
};
 

3x3慣性テンソルは、物体がその場所に止まろうとする力に影響を与えます。
ここでは、数学的な話しはとばします。

ODEでは、これらパラメータを直接触ることはなくて用意されたAPIによって制御できます。


質量を与える方法として次の3通りあります。
  1. 形状と質量密度から質量を与える (dMassSetXXX)
  2. 形状と剛体の全質量で与える (dMassSetXXXTotal)
  3. パラメータを直接制御する (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に対して全質量を再度与えるのに有用。


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を与えています。

もし、半径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


以上

タグ:

ODE
記事メニュー
目安箱バナー