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 六軸可動制限(六軸ジョイントの移動制限 移動制限, 六軸ジョイントの回転制限 回転制限) { this.移動制限 = 移動制限; this.回転制限 = 回転制限; }