public void 剛体と剛体の間に6軸バネ拘束を追加する(六軸ジョイントにつながる剛体のペア つなぐ剛体のペア, 六軸可動制限 六軸可動制限, 六軸バネ剛性 六軸バネ) { var bodyA = つなぐ剛体のペア.剛体A.剛体; var bodyB = つなぐ剛体のペア.剛体B.剛体; var frameInA = つなぐ剛体のペア.剛体A.ワールド変換行列; var frameInB = つなぐ剛体のペア.剛体B.ワールド変換行列; var 拘束 = new Generic6DofSpringConstraint(bodyA, bodyB, frameInA.ToBulletSharp(), frameInB.ToBulletSharp(), true); // 第五引数の効果は謎。どちらでも同じ様に見える……。 var c_p1 = 六軸可動制限.移動制限.移動制限1; var c_p2 = 六軸可動制限.移動制限.移動制限2; var c_r1 = 六軸可動制限.回転制限.回転制限1; var c_r2 = 六軸可動制限.回転制限.回転制限2; 拘束.LinearLowerLimit = new BulletSharp.Math.Vector3(c_p1.X, c_p1.Y, c_p1.Z); // 型はベクトルだがベクトル量ではないのでZは反転しない。 拘束.LinearUpperLimit = new BulletSharp.Math.Vector3(c_p2.X, c_p2.Y, c_p2.Z); 拘束.AngularLowerLimit = new BulletSharp.Math.Vector3(c_r1.X, c_r1.Y, c_r1.Z); 拘束.AngularUpperLimit = new BulletSharp.Math.Vector3(c_r2.X, c_r2.Y, c_r2.Z); this._拘束にある一つの自由度へのバネを設定する(六軸バネ.平行移動成分.X, 0, 拘束); this._拘束にある一つの自由度へのバネを設定する(六軸バネ.平行移動成分.Y, 1, 拘束); this._拘束にある一つの自由度へのバネを設定する(六軸バネ.平行移動成分.Z, 2, 拘束); this._拘束にある一つの自由度へのバネを設定する(六軸バネ.回転移動成分.X, 3, 拘束); this._拘束にある一つの自由度へのバネを設定する(六軸バネ.回転移動成分.Y, 4, 拘束); this._拘束にある一つの自由度へのバネを設定する(六軸バネ.回転移動成分.Z, 5, 拘束); this._DynamicsWorld.AddConstraint(拘束); }
private void _ジョイントを作成する(List <PMXFormat.ジョイント> ジョイントリスト) { foreach (var jointData in ジョイントリスト) { switch (jointData.種別) { case PMXFormat.ジョイント種別.P2P: case PMXFormat.ジョイント種別.スライダー: case PMXFormat.ジョイント種別.ヒンジ: case PMXFormat.ジョイント種別.円錐回転: case PMXFormat.ジョイント種別.基本6DOF: break; // TODO: ばね付き6DOF以外のジョイントへの対応 case PMXFormat.ジョイント種別.ばね付き6DOF: { var jointParam = (PMXFormat.ばね付き6DOFジョイントパラメータ)jointData.パラメータ; // 六軸ジョイントに繋がる剛体のペアを作成する。 var bodyA = this._Bulletの剛体リスト[jointParam.関連剛体Aのインデックス]; var bodyAworld_inv = Matrix.Invert(this._Bullet管理.物理演算結果のワールド行列を取得する(bodyA)); var bodyB = this._Bulletの剛体リスト[jointParam.関連剛体Bのインデックス]; var bodyBworld_inv = Matrix.Invert(this._Bullet管理.物理演算結果のワールド行列を取得する(bodyB)); var jointRotation = jointParam.回転rad; var jointPosition = jointParam.位置; var jointWorld = Matrix.RotationYawPitchRoll(jointRotation.Y, jointRotation.X, jointRotation.Z) * Matrix.Translation(jointPosition.X, jointPosition.Y, jointPosition.Z); var connectedBodyA = new 六軸ジョイントにつながる剛体(bodyA, jointWorld * bodyAworld_inv); var connectedBodyB = new 六軸ジョイントにつながる剛体(bodyB, jointWorld * bodyBworld_inv); var つなぐ剛体のペア = new 六軸ジョイントにつながる剛体のペア(connectedBodyA, connectedBodyB); // 六軸可動制限を作成する。 var movementRestriction = new 六軸ジョイントの移動制限(jointParam.移動制限の下限, jointParam.移動制限の上限); var rotationRestriction = new 六軸ジョイントの回転制限(jointParam.回転制限の下限rad, jointParam.回転制限の上限rad); var 六軸可動制限 = new 六軸可動制限(movementRestriction, rotationRestriction); // 六軸バネを作成する。 var 六軸バネ = new 六軸バネ剛性(jointParam.バネ移動定数, jointParam.バネ回転定数); this._Bullet管理.剛体と剛体の間に6軸バネ拘束を追加する(つなぐ剛体のペア, 六軸可動制限, 六軸バネ); } break; } } }
public void 剛体と剛体の間に6軸バネ拘束を追加する(六軸ジョイントにつながる剛体のペア つなぐ剛体のペア, 六軸可動制限 六軸可動制限, 六軸バネ剛性 六軸バネ) => this._拘束ファクトリ.剛体と剛体の間に6軸バネ拘束を追加する(つなぐ剛体のペア, 六軸可動制限, 六軸バネ);