Пример #1
0
        private void _剛体を作成する(List <PMXFormat.剛体> 剛体リスト)
        {
            this._剛体キャッシュリスト   = new List <剛体キャッシュ>(剛体リスト.Count);
            this._Bulletの剛体リスト = new List <RigidBody>(剛体リスト.Count);

            foreach (var 剛体 in 剛体リスト)
            {
                var 一時剛体 = new 剛体キャッシュ(剛体);
                var 初期行列 = 一時剛体.初期姿勢行列;

                _剛体キャッシュリスト.Add(一時剛体);

                CollisionShape bullet形状;
                switch (剛体.形状)
                {
                case PMXFormat.剛体形状.球:
                    bullet形状 = new SphereShape(剛体.サイズ.X);
                    break;

                case PMXFormat.剛体形状.箱:
                    bullet形状 = new BoxShape(剛体.サイズ.X, 剛体.サイズ.Y, 剛体.サイズ.Z);
                    break;

                case PMXFormat.剛体形状.カプセル:
                    bullet形状 = new CapsuleShape(剛体.サイズ.X, 剛体.サイズ.Y);
                    break;

                default:
                    throw new Exception("未知の剛体形状です。");
                }

                var 剛体プロパティ = new 剛体物性(剛体.質量, 剛体.反発力, 剛体.摩擦力, 剛体.移動減衰, 剛体.回転減衰);

                var 超越プロパティ = new 物理演算を超越した特性(
                    物理演算の影響を受けないKinematic剛体である: (剛体.物理演算 == PMXFormat.剛体の物理演算.ボーン追従),
                    自身の衝突グループ番号: (CollisionFilterGroups)(1 << 剛体.グループ),
                    自身と衝突する他の衝突グループ番号: (CollisionFilterGroups)剛体.非衝突グループフラグ);

                var bullet剛体 = this._Bullet管理.剛体を作成する(bullet形状, 初期行列, 剛体プロパティ, 超越プロパティ);

                this._Bulletの剛体リスト.Add(bullet剛体);
            }
        }
Пример #2
0
        public RigidBody 剛体を作成して返す(CollisionShape 剛体の形, Matrix 剛体のワールド変換行列, 剛体物性 剛体の物性, 物理演算を超越した特性 物理演算を超越した特性)
        {
            var mass = (物理演算を超越した特性.物理演算の影響を受けないKinematic剛体である) ? 0 : 剛体の物性.質量;

            this._CollisionShapes.Add(剛体の形);

            var localInertia = new BulletSharp.Math.Vector3(0, 0, 0);

            if (mass != 0)
            {
                剛体の形.CalculateLocalInertia(mass, out localInertia);
            }

            var motionState = new DefaultMotionState(剛体のワールド変換行列.ToBulletSharp());
            var rbInfo      = new RigidBodyConstructionInfo(mass, motionState, 剛体の形, localInertia);

            var body = new RigidBody(rbInfo)
            {
                Restitution = 剛体の物性.反発係数,
                Friction    = 剛体の物性.摩擦係数,
            };

            body.SetDamping(剛体の物性.移動減衰係数, 剛体の物性.回転減衰係数);

            float linearDamp  = body.LinearDamping;
            float angularDamp = body.AngularDamping;

            if (物理演算を超越した特性.物理演算の影響を受けないKinematic剛体である)
            {
                body.CollisionFlags = body.CollisionFlags | CollisionFlags.KinematicObject;
            }

            body.ActivationState = ActivationState.DisableDeactivation;

            this._DynamicsWorld.AddRigidBody(body, 物理演算を超越した特性.自身の衝突グループ番号, 物理演算を超越した特性.自身と衝突する他の衝突グループ番号);

            return(body);
        }
Пример #3
0
 public RigidBody 剛体を作成する(CollisionShape 剛体の形, Matrix 剛体のワールド行列, 剛体物性 剛体の物性, 物理演算を超越した特性 物理演算を超越した特性)
 => this._剛体ファクトリ.剛体を作成して返す(剛体の形, 剛体のワールド行列, 剛体の物性, 物理演算を超越した特性);