ボディは質量、位置、姿勢の他、速度、加速度など動的な特性を有し、動力学演算の対象となります。これに形状などの静的な特性を持たせるには、ジオメトリを設定します。
|
|
型 | 設定 | 取得 | |||
---|---|---|---|---|---|
ポインタで取得 | 構造体で取得 | ||||
位置 | dReal | dBodySetPosition | dBodyGetPosition | dBodyCopyPosition | |
姿勢 | 回転行列 | dMatrix3 | dBodySetRotation | dBodyGetRotation | dBodyCopyRotation |
クォータニオン | dQuaternion | dBodySetQuaternion | dBodyGetQuaternion | dBodyCopyQuaternion | |
速度 | dReal | dBodySetLinearVel | dBodyGetLinearVel | --- | |
角速度 | dReal | dBodySetAngularVel | dBodyGetAngularVel | --- |
dBodyID dBodyCreate ( dWorldID );
ボディは、それを格納するワールドが破棄されたときに自動で破棄されるため、通常は明示的に破棄する必要はありません。
void dBodyDestroy ( dBodyID );
ボディの位置を絶対座標で設定します。
void dBodySetPosition ( dBodyID, dReal x, dReal y, dReal z );
ボディの位置を絶対座標で取得します。
const dReal* dBodyGetPosition ( dBodyID );
void dBodyCopyPosition ( dBodyID body, dVector3 pos );※質量のパラメータで位置を移動していない限り、ボディの位置とはその重心位置を指します。
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 );
void dBodySetLinearVel ( dBodyID, dReal x, dReal y, dReal z );
const dReal* dBodyGetLinearVel ( dBodyID );
void dBodySetAngularVel ( dBodyID, dReal x, dReal y, dReal z );
const dReal* dBodyGetAngularVel ( dBodyID );
既定値はdInfinityです。この既定値はワールドの最大角速度によって設定されます。
dBodySetMaxAngularSpeed( dBodyID b, dReal max_speed );
dReal dBodyGetMaxAngularSpeed( dBodyID b );
質量は、重心と慣性テンソルを含めた質量パラメータ (dMass構造体) として定義されており、ボディの質量も実体はこれになります。
ボディに質量パラメータを設定します。質量パラメータは、ボディの形状に合わせて作成したものを設定します。 なお質量が0以下の値であったり、重心が原点にない場合はエラーとなります。
void dBodySetMass ( dBodyID, const dMass *mass );
ボディから質量パラメータを取得します。
void dBodyGetMass ( dBodyID, dMass *mass );
力はベクトルで、その大きさと方向を指定します。
力ベクトルの座標系 | 力の作用点 | 力 (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 );
ボディを無効化することでシミュレーションの対象から除外し、処理速度を向上できます。なお新しく作成したボディは、初期状態で有効となっています。
void dBodyEnable ( dBodyID );
void dBodyDisable ( dBodyID );
dBodyIsEnabled()で現在の状態を確認できます。1が返されれば有効で、0ならば無効です。
int dBodyIsEnabled ( dBodyID );
ボディがアイドル状態となったときに、自動的にボディを無効にできます。
この機能を有効にするには、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 |
自動無効化の既定値は、ワールドの自動有効化/無効化で設定された値となります。また既定値に戻すには、dBodySetAutoDisableDefaults()を実行します。
void dBodySetAutoDisableDefaults ( dBodyID );
種類 | 範囲 | 関数 | ||
---|---|---|---|---|
最小 | 最大 | |||
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 // 角速度 );
しきい値を超えている場合のみ、減衰は有効となります。
dReal dBodyGetLinearDampingThreshold( dBodyID b ); void dBodySetLinearDampingThreshold( dBodyID b, dReal threshold );
dReal dBodyGetAngularDampingThreshold( dBodyID b ); void dBodySetAngularDampingThreshold( dBodyID b, dReal threshold );
減衰の設定を、ワールドの減衰の設定に合わせて再設定します。
void dBodySetDampingDefaults( dBodyID b );