接触ジョイント (Contact joint)

接触ジョイントは衝突検出で使用され、その有効期間はシミュレーションの1ステップだけです。

接触面の定義 (dContact)

接触時の挙動を決定するために、接触面の性質を設定する必要があります。

dContact構造体

struct dContact {
    dSurfaceParameters surface;  // 接触面の性質を定義するdSurfaceParameters構造体
    dContactGeom geom;           // 衝突検出の関数で設定されるdContactGeom構造体
    dVector3 fdir1;              // 摩擦方向1のベクトル (first friction direction)
};

引数のgeom (dContactGeom構造体) は衝突検出の関数 (dCollide) で初期化します。一方surfaceは次に示すdSurfaceParameters構造体です。

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) 係数の値
};
dSurfaceParameters構造体のメンバ
変数名 説明 最小 最大
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

接触フラグ (contact flag)

摩擦係数のmu以外の指定を有効とするには、modeで以下の値を1つまたは複数組み合わせて指定する必要があります。

dSurfaceParametersのmodeの値
定数 説明 関連するプロパティ
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

作成 (dJointCreateContact)

接触面をdContact構造体で定義した後、それを引数としてdJointCreateContact()関数で作成します。

複数の接触ジョイントをまとめて処理するにはジョイント グループを作成し、それを引数に与えます。さもなくば0を指定します。

dJointID dJointCreateContact (
    dWorldID,          // ジョイントが格納されるワールド
    dJointGroupID,     // 複数のジョイントをまとめるジョイント グループ
    const dContact *   // 接触面を定義するdContact構造体
    );