ボディ (Body)

ボディは質量、位置、姿勢の他、速度、加速度など動的な特性を有し、動力学演算の対象となります。これに形状などの静的な特性を持たせるには、ジオメトリを設定します。

ボディには、次のようなプロパティがあります。
  • 質量 (Mass)
  • 重心 (Center of mass)
  • 慣性テンソル (Inertia tensor)
  • (Force)
  • トルク (Torque)
位置、姿勢、速度、角速度の関数
  設定 取得
ポインタで取得 構造体で取得
位置 dReal dBodySetPosition dBodyGetPosition dBodyCopyPosition
姿勢 回転行列 dMatrix3 dBodySetRotation dBodyGetRotation dBodyCopyRotation
クォータニオン dQuaternion dBodySetQuaternion dBodyGetQuaternion dBodyCopyQuaternion
速度 dReal dBodySetLinearVel dBodyGetLinearVel ---
角速度 dReal dBodySetAngularVel dBodyGetAngularVel ---

ボディの作成・破棄

作成

dBodyID dBodyCreate ( dWorldID );

破棄

ボディは、それを格納するワールドが破棄されたときに自動で破棄されるため、通常は明示的に破棄する必要はありません。

void dBodyDestroy ( dBodyID );

位置 (Position)

設定

ボディの位置を絶対座標で設定します。

void dBodySetPosition ( dBodyID, dReal x, dReal y, dReal z );

取得

ボディの位置を絶対座標で取得します。

const dReal* dBodyGetPosition ( dBodyID );
void dBodyCopyPosition ( dBodyID body, dVector3 pos );
質量のパラメータで位置を移動していない限り、ボディの位置とはその重心位置を指します。

姿勢 (Orientation)

回転行列

設定

void dBodySetRotation ( dBodyID, const dMatrix3 R );

取得

const dReal* dBodyGetRotation ( dBodyID );
void dBodyCopyRotation ( dBodyID, dMatrix3 R );

クォータニオン

設定

void dBodySetQuaternion (dBodyID, const dQuaternion q );

取得

const dReal* dBodyGetQuaternion ( dBodyID );
void dBodyCopyQuaternion( dBodyID body, dQuaternion quat );

速度 (Velocity)

設定

void dBodySetLinearVel ( dBodyID, dReal x, dReal y, dReal z );

取得

const dReal* dBodyGetLinearVel ( dBodyID );

角速度 (Angular velocity)

設定

void dBodySetAngularVel ( dBodyID, dReal x, dReal y, dReal z );

取得

const dReal* dBodyGetAngularVel ( dBodyID );

最大角速度 (Max Angular Speed)

既定値はdInfinityです。この既定値はワールドの最大角速度によって設定されます。

設定

dBodySetMaxAngularSpeed( dBodyID b, dReal max_speed );

取得

dReal dBodyGetMaxAngularSpeed( dBodyID b );

質量 (Mass)

質量は、重心と慣性テンソルを含めた質量パラメータ (dMass構造体) として定義されており、ボディの質量も実体はこれになります。

設定

ボディに質量パラメータを設定します。質量パラメータは、ボディの形状に合わせて作成したものを設定します。 なお質量が0以下の値であったり、重心が原点にない場合はエラーとなります。

void dBodySetMass ( dBodyID, const dMass *mass );

取得

ボディから質量パラメータを取得します。

void dBodyGetMass ( dBodyID, dMass *mass );

力 (Force)

加算

力はベクトルで、その大きさと方向を指定します。

力ベクトルの座標系 力の作用点 力 (Force) トルク (Torque)
絶対座標 重心 dBodyAddForce dBodyAddTorque
絶対座標で指定 dBodyAddForceAtPos ---
相対座標で指定 dBodyAddForceAtRelPos ---
相対座標
(ボディの座標)
重心 dBodyAddRelForce dBodyAddRelTorque
絶対座標で指定 dBodyAddRelForceAtPos ---
相対座標で指定 dBodyAddRelForceAtRelPos ---

力はボディごとに加算されて作用します。累積された力は、シミュレーションのステップごとに0にクリアされます。

void dBodyAddForce( dBodyID,
    dReal fx, dReal fy, dReal fz ); // 力ベクトル
void dBodyAddForceAtPos( dBodyID,
    dReal fx, dReal fy, dReal fz,   // 力ベクトル
    dReal px, dReal py, dReal pz ); // 力の作用点(絶対座標)
void dBodyAddForceAtRelPos( dBodyID,
    dReal fx, dReal fy, dReal fz,   // 力ベクトル
    dReal px, dReal py, dReal pz ); // 力作用点(相対座標)

設定

ボディの重心に作用する力を設定します。これはおもにボディを有効化するときに使用します。

void dBodySetForce( dBodyID b, dReal x, dReal y, dReal z );
void dBodySetTorque( dBodyID b, dReal x, dReal y, dReal z );

取得

const dReal* dBodyGetForce( dBodyID );
const dReal* dBodyGetTorque( dBodyID );

有効化 / 無効化 (Enable/Disable)

ボディを無効化することでシミュレーションの対象から除外し、処理速度を向上できます。なお新しく作成したボディは、初期状態で有効となっています。

void dBodyEnable ( dBodyID );
void dBodyDisable ( dBodyID );

dBodyIsEnabled()で現在の状態を確認できます。1が返されれば有効で、0ならば無効です。

int dBodyIsEnabled ( dBodyID );

自動無効化 (Automatic Disabling)

ボディがアイドル状態となったときに、自動的にボディを無効にできます。

この機能を有効にするには、dBodySetAutoDisableFlag()でdo_auto_disableに0以外の値を設定します。

void dBodySetAutoDisableFlag ( dBodyID, int do_auto_disable );
int dBodyGetAutoDisableFlag ( dBodyID );

アイドル状態

アイドル状態とみなす条件を、次の関数により設定および取得します。

速度と角速度はこれを下回ったときにアイドル状態とみなされ、ステップ数とアイドル時間はこれを超えたときにアイドル状態とされます。

アイドル状態とみなす条件
種類 関数 除外※1
速度のしきい値
(LinearThreshold)
dReal dBodySetAutoDisableLinearThreshold dInfinity
dBodyGetAutoDisableLinearThreshold
角速度のしきい値
(AngularThreshold)
dReal dBodySetAutoDisableAngularThreshold dInfinity
dBodyGetAutoDisableAngularThreshold
サンプル数
(AverageSamplesCount)
int dBodySetAutoDisableAverageSamplesCount  
dBodyGetAutoDisableAverageSamplesCount
ステップ数
(Steps)
int dBodySetAutoDisableSteps 0
dBodyGetAutoDisableSteps
アイドル時間
(Time)
dReal dBodySetAutoDisableTime 0
dBodyGetAutoDisableTime
※1 この値を設定することで、アイドル状態とみなす条件から除外されます。

既定値

自動無効化の既定値は、ワールドの自動有効化/無効化で設定された値となります。また既定値に戻すには、dBodySetAutoDisableDefaults()を実行します。

void dBodySetAutoDisableDefaults ( dBodyID );

減衰 (Damping)

種類 範囲   関数
最小 最大
LinearDamping 0 1 get dBodyGetLinearDamping
set dBodySetLinearDamping
AngularDamping 0 1 get dBodyGetAngularDamping
set dBodySetAngularDamping
LinearDampingThreshold     get dBodyGetLinearDampingThreshold
set dBodySetLinearDampingThreshold
AngularDampingThreshold     get dBodyGetAngularDampingThreshold
set dBodySetAngularDampingThreshold

未設定の状態では、ワールドの減衰が既定値となります。

減衰率

速度

dReal dBodyGetLinearDamping( dBodyID b );
void dBodySetLinearDamping( dBodyID b, dReal scale );

角速度

dReal dBodyGetAngularDamping( dBodyID b );
void dBodySetAngularDamping( dBodyID b, dReal scale );

速度と角速度

void dBodySetDamping(
    dBodyID b,
    dReal linear_scale,  // 速度
    dReal angular_scale  // 角速度
    );

しきい値 (Threshold)

しきい値を超えている場合のみ、減衰は有効となります。

速度

dReal dBodyGetLinearDampingThreshold( dBodyID b );
void dBodySetLinearDampingThreshold( dBodyID b, dReal threshold );

角速度

dReal dBodyGetAngularDampingThreshold( dBodyID b );
void dBodySetAngularDampingThreshold( dBodyID b, dReal threshold );

既定値

減衰の設定を、ワールドの減衰の設定に合わせて再設定します。

void dBodySetDampingDefaults( dBodyID b );