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); }
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; }
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(); }
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; } }
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; } }
private static void EntryBoxCollider(MmdRigidBody mmdRigidBody, GameObject obj) { var unityCollider = obj.AddComponent <BoxCollider>(); unityCollider.size = mmdRigidBody.Dimemsions * 2.0f; }
private static void EntrySphereCollider(MmdRigidBody mmdRigidBody, GameObject obj) { var unityCollider = obj.AddComponent <SphereCollider>(); unityCollider.radius = mmdRigidBody.Dimemsions.x; }