接触ジョイントは衝突検出で使用され、その有効期間はシミュレーションの1ステップだけです。
![参考[OPEN DYNAMICS ENGINE V0.5 USER GUIDE]](images/contact.jpg)
接触時の挙動を決定するために、接触面の性質を設定する必要があります。
struct dContact {
dSurfaceParameters surface; // 接触面の性質を定義するdSurfaceParameters構造体
dContactGeom geom; // 衝突検出の関数で設定されるdContactGeom構造体
dVector3 fdir1; // 摩擦方向1のベクトル (first friction direction)
};
引数のgeom (dContactGeom構造体) は衝突検出の関数 (dCollide) で初期化します。一方surfaceは次に示すdSurfaceParameters構造体です。
struct dSurfaceParameters {
/* must always be defined */
int mode; // 表面の性質
dReal mu; // 摩擦係数(摩擦方向1)
/* only defined if the corresponding flag is set in mode */
dReal mu2; // 摩擦係数(摩擦方向2)
dReal bounce; // 反発係数
dReal bounce_vel; // 反発に必要な最小速度
dReal soft_erp; // ERPの値
dReal soft_cfm; // CFMの値
dReal motion1, motion2, motionN; // 表面速度
dReal slip1, slip2; // FDS (force-dependent-slip) 係数の値
};
| 変数名 | 説明 | 最小 | 最大 |
|---|---|---|---|
| mode | 表面の性質 (接触フラグ) | ||
| mu | 摩擦係数 (摩擦方向1) | 0 | dInfinity |
| mu2 | 摩擦係数 (摩擦方向2) | 0 | dInfinity |
| bounce | 反発係数 | 0 | 1 |
| bounce_vel | 反発に必要な最小速度 (衝突速度がこの値を下回るときbounceの値は0とみなされ、まったく反発しない) |
||
| soft_erp | ERPの値 | ||
| soft_cfm | CFMの値 | ||
| motion1 | 表面速度 | ||
| motion2 | |||
| motionN | |||
| slip1 | FDS (force-dependent-slip) 係数の値 | ||
| slip2 |
摩擦係数のmu以外の指定を有効とするには、modeで以下の値を1つまたは複数組み合わせて指定する必要があります。
| 定数 | 説明 | 関連するプロパティ |
|---|---|---|
| dContactMu2 | 摩擦方向2 (mu2) を有効とする。 | mu2 |
| dContactFDir1 | dContact構造体のfdir1を摩擦方向1とする。 | fdir1 |
| dContactBounce | 反発係数 (bounce) を有効とし、弾力性を持たせる。 | bounce |
| bounce_vel | ||
| dContactSoftERP | ERPの指定を有効とする。 | soft_erp |
| dContactSoftCFM | CFMの指定を有効とする。 | soft_cfm |
| dContactMotion1 | ボディの動きとは無関係に、表面を移動させる。 | motion1 |
| dContactMotion2 | motion2 | |
| dContactMotionN | motionN | |
| dContactSlip1 | FDS (force-dependent-slip) の指定を有効とする。 | slip1 |
| dContactSlip2 | slip2 | |
| dContactApprox0 | 摩擦モデルにfriction pyramid approximationを適用する。これを設定しない場合には、constant force limit approximationとなる。 | なし |
| dContactApprox1_1 | ||
| dContactApprox1_2 | ||
| dContactApprox1 |
接触面をdContact構造体で定義した後、それを引数としてdJointCreateContact()関数で作成します。
複数の接触ジョイントをまとめて処理するにはジョイント グループを作成し、それを引数に与えます。さもなくば0を指定します。
dJointID dJointCreateContact (
dWorldID, // ジョイントが格納されるワールド
dJointGroupID, // 複数のジョイントをまとめるジョイント グループ
const dContact * // 接触面を定義するdContact構造体
);