Пример #1
0
        private static GameObject ConvertRigidbody(MmdRigidBody mmdRigidBody)
        {
            var ret = new GameObject("r" + mmdRigidBody.Name);

            ret.transform.position = mmdRigidBody.Position;
            ret.transform.rotation = Quaternion.Euler(mmdRigidBody.Rotation * Mathf.Rad2Deg);

            switch (mmdRigidBody.Shape)
            {
            case MmdRigidBody.RigidBodyShape.RigidShapeSphere:
                EntrySphereCollider(mmdRigidBody, ret);
                break;

            case MmdRigidBody.RigidBodyShape.RigidShapeBox:
                EntryBoxCollider(mmdRigidBody, ret);
                break;

            case MmdRigidBody.RigidBodyShape.RigidShapeCapsule:
                EntryCapsuleCollider(mmdRigidBody, ret);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            return(ret);
        }
Пример #2
0
        private static void EntryCapsuleCollider(MmdRigidBody mmdRigidBody, GameObject obj)
        {
            var unityCollider = obj.AddComponent <CapsuleCollider>();

            unityCollider.radius = mmdRigidBody.Dimemsions.x;
            unityCollider.height = mmdRigidBody.Dimemsions.y + mmdRigidBody.Dimemsions.x * 2.0f;
        }
Пример #3
0
        private static void ReadRigidBodies(BinaryReader reader, MmdModel model, PmxConfig pmxConfig)
        {
            var rigidBodyNum = reader.ReadInt32();

            model.Rigidbodies = new MmdRigidBody[rigidBodyNum];
            for (var i = 0; i < rigidBodyNum; ++i)
            {
                var rigidBody = new MmdRigidBody
                {
                    Name   = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding),
                    NameEn = MmdReaderUtil.ReadSizedString(reader, pmxConfig.Encoding),
                    AssociatedBoneIndex = MmdReaderUtil.ReadIndex(reader, pmxConfig.BoneIndexSize),
                    CollisionGroup      = reader.ReadByte(),
                    CollisionMask       = reader.ReadUInt16(),
                    Shape         = (MmdRigidBody.RigidBodyShape)reader.ReadByte(),
                    Dimemsions    = MmdReaderUtil.ReadVector3(reader),
                    Position      = MmdReaderUtil.ReadVector3(reader),
                    Rotation      = MmdReaderUtil.ReadVector3(reader),
                    Mass          = reader.ReadSingle(),
                    TranslateDamp = reader.ReadSingle(),
                    RotateDamp    = reader.ReadSingle(),
                    Restitution   = reader.ReadSingle(),
                    Friction      = reader.ReadSingle(),
                    Type          = (MmdRigidBody.RigidBodyType)reader.ReadByte()
                };
                model.Rigidbodies[i] = rigidBody;
            }
        }
        public PoserMotionState(Poser poser, MmdRigidBody body, Matrix bodyTransform)
        {
            _poser            = poser;
            _passive          = body.Type == MmdRigidBody.RigidBodyType.RigidTypeKinematic;
            _strict           = body.Type == MmdRigidBody.RigidBodyType.RigidTypePhysicsStrict;
            _ghost            = body.Type == MmdRigidBody.RigidBodyType.RigidTypePhysicsGhost;
            _target           = GetPoserBoneImage(poser, body.AssociatedBoneIndex);
            _bodyTransform    = bodyTransform;
            _bodyTransformInv = Matrix.Invert(bodyTransform);

            Reset();
        }
Пример #5
0
        private static void ReadRigidBodies(BinaryReader reader, MmdModel model, PmdReadContext context)
        {
            var rigidBodyNum = reader.ReadInt32();

            model.Rigidbodies = new MmdRigidBody[rigidBodyNum];
            for (var i = 0; i < rigidBodyNum; ++i)
            {
                var rigidBody = new MmdRigidBody();

                rigidBody.Name = MmdReaderUtil.ReadStringFixedLength(reader, 20, Tools.JapaneseEncoding).Trim();
                var boneIndex = reader.ReadUInt16();
                if (boneIndex < context.BoneNum)
                {
                    rigidBody.AssociatedBoneIndex = boneIndex;
                }
                else
                {
                    if (context.CenterBoneIndex == null)
                    {
                        rigidBody.AssociatedBoneIndex = 0;
                    }
                    else
                    {
                        rigidBody.AssociatedBoneIndex = context.CenterBoneIndex.Value;
                    }
                }
                rigidBody.CollisionGroup = reader.ReadSByte();
                rigidBody.CollisionMask  = reader.ReadUInt16();
                rigidBody.Shape          = (MmdRigidBody.RigidBodyShape)reader.ReadByte();
                rigidBody.Dimemsions     = MmdReaderUtil.ReadVector3(reader);
                var rbPosition = MmdReaderUtil.ReadVector3(reader);
                rigidBody.Position      = model.Bones[rigidBody.AssociatedBoneIndex].Position + rbPosition;
                rigidBody.Rotation      = MmdReaderUtil.ReadVector3(reader);
                rigidBody.Mass          = reader.ReadSingle();
                rigidBody.TranslateDamp = reader.ReadSingle();
                rigidBody.RotateDamp    = reader.ReadSingle();
                rigidBody.Restitution   = reader.ReadSingle();
                rigidBody.Friction      = reader.ReadSingle();

                var type = reader.ReadByte();
                if (boneIndex < context.BoneNum)
                {
                    rigidBody.Type = (MmdRigidBody.RigidBodyType)type;
                }
                else
                {
                    rigidBody.Type = MmdRigidBody.RigidBodyType.RigidTypePhysicsGhost;
                }
                model.Rigidbodies[i] = rigidBody;
            }
        }
Пример #6
0
        private static void UnityRigidbodySetting(MmdRigidBody mmdRigidBody, GameObject target)
        {
            var unityRigidBody = target.GetComponent <Rigidbody>();

            if (null != unityRigidBody)
            {
                unityRigidBody.mass       += mmdRigidBody.Mass;
                unityRigidBody.drag        = (unityRigidBody.drag + mmdRigidBody.TranslateDamp) * 0.5f;
                unityRigidBody.angularDrag = (unityRigidBody.angularDrag + mmdRigidBody.RotateDamp) * 0.5f;
            }
            else
            {
                unityRigidBody             = target.AddComponent <Rigidbody>();
                unityRigidBody.isKinematic = MmdRigidBody.RigidBodyType.RigidTypeKinematic == mmdRigidBody.Type;
                unityRigidBody.mass        = Mathf.Max(float.Epsilon, mmdRigidBody.Mass);
                unityRigidBody.drag        = mmdRigidBody.TranslateDamp;
                unityRigidBody.angularDrag = mmdRigidBody.RotateDamp;
            }
        }
Пример #7
0
        private static void EntryBoxCollider(MmdRigidBody mmdRigidBody, GameObject obj)
        {
            var unityCollider = obj.AddComponent <BoxCollider>();

            unityCollider.size = mmdRigidBody.Dimemsions * 2.0f;
        }
Пример #8
0
        private static void EntrySphereCollider(MmdRigidBody mmdRigidBody, GameObject obj)
        {
            var unityCollider = obj.AddComponent <SphereCollider>();

            unityCollider.radius = mmdRigidBody.Dimemsions.x;
        }