接触ジョイントは衝突検出で使用され、その有効期間はシミュレーションの1ステップだけです。
接触時の挙動を決定するために、接触面の性質を設定する必要があります。
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構造体 );