コード例 #1
0
        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(拘束);
        }
コード例 #2
0
        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;
                }
            }
        }
コード例 #3
0
ファイル: Bullet管理.cs プロジェクト: GnicoJP/MikuMikuFlex
 public void 剛体と剛体の間に6軸バネ拘束を追加する(六軸ジョイントにつながる剛体のペア つなぐ剛体のペア, 六軸可動制限 六軸可動制限, 六軸バネ剛性 六軸バネ)
 => this._拘束ファクトリ.剛体と剛体の間に6軸バネ拘束を追加する(つなぐ剛体のペア, 六軸可動制限, 六軸バネ);