Пример #1
0
 void ModifyBoneProfile(ref BoneProfile boneProfile, AnimatedPair pair, float dt)
 {
     foreach (IBoneProfileModifier modifier in boneProfileModifiers)
     {
         modifier.Modify(ref boneProfile, pair, dt);
     }
 }
Пример #2
0
        void ApplyMasterParameters(ref BoneProfile boneProfile)
        {
            boneProfile.positionAlpha        *= _masterAlpha;
            boneProfile.positionDampingRatio *= _masterDampingRatio;

            boneProfile.rotationAlpha        *= _masterAlpha;
            boneProfile.rotationDampingRatio *= _masterDampingRatio;
        }
Пример #3
0
        BoneProfile GetBoneProfile(BoneName bone)
        {
            bool isRoot = Bindings.Definition.IsRoot(bone);

            BoneProfile previous = previousProfile.GetBoneProfile(bone, isRoot);
            BoneProfile current  = currentProfile.GetBoneProfile(bone, isRoot);

            return(BoneProfile.Blend(previous, current, profileTransitioner.Value));
        }
Пример #4
0
        void DoPoweredAnimationMatching(AnimatedPair pair, float dt)
        {
            BoneProfile boneProfile = GetBoneProfile(pair.Name);

            ModifyBoneProfile(ref boneProfile, pair, dt);
            ApplyMasterParameters(ref boneProfile);

            DoPoweredPositionMatching(pair, boneProfile, dt);
            DoPoweredRotationMatching(pair, boneProfile, dt);
        }
Пример #5
0
        void DoPoweredRotationMatching(AnimatedPair pair, BoneProfile boneProfile, float dt)
        {
            RagdollBone bone = pair.RagdollBone;

            Rigidbody rigidbody    = bone.Rigidbody;
            float     alpha        = boneProfile.rotationAlpha;
            float     dampingRatio = boneProfile.rotationDampingRatio;

            SetTargetRotation(pair);
            SetTargetAngularVelocityLocal(bone.Joint, pair.poseAngularVelocity, pair.RagdollBone.StartingJointRotation);
            bone.Joint.slerpDrive = AnimationMatching.GetRotationMatchingJointDrive(alpha, dampingRatio, rigidbody.mass, dt, boneProfile.maxAngularAcceleration);
        }
Пример #6
0
        public static BoneProfile Blend(BoneProfile a, BoneProfile b, float t)
        {
            return(new BoneProfile
            {
                positionAlpha = BlendAlpha(a.positionAlpha, b.positionAlpha, t),
                positionDampingRatio = Mathf.Lerp(a.positionDampingRatio, b.positionDampingRatio, t),
                maxLinearAcceleration = BlendMaxAcceleration(a.maxLinearAcceleration, b.maxLinearAcceleration, t),

                rotationAlpha = BlendAlpha(a.rotationAlpha, b.rotationAlpha, t),
                rotationDampingRatio = Mathf.Lerp(a.rotationDampingRatio, b.rotationDampingRatio, t),
                maxAngularAcceleration = BlendMaxAcceleration(a.maxAngularAcceleration, b.maxAngularAcceleration, t)
            });
        }
Пример #7
0
        void DoPoweredPositionMatching(AnimatedPair pair, BoneProfile boneProfile, float dt)
        {
            float alpha        = boneProfile.positionAlpha;
            float dampingRatio = boneProfile.positionDampingRatio;

            Rigidbody    rigidbody  = pair.RagdollBone.Rigidbody;
            AnimatedPose targetPose = pair.currentPose;

            Vector3 acceleration = AnimationMatching.GetAccelerationFromPositionSpring(rigidbody.position, targetPose.worldPosition,
                                                                                       rigidbody.velocity, pair.poseLinearVelocity, alpha, dampingRatio, rigidbody.mass, dt);

            LimitAcceleration(ref acceleration, boneProfile.maxLinearAcceleration);

            rigidbody.AddForce(acceleration, ForceMode.Acceleration);
        }
        void BuildOverridenBoneProfiles()
        {
            overridenProfiles = new Dictionary <BoneName, BoneProfile>();

            foreach (BoneProfileOverride posOverride in positionMatchingOverrides)
            {
                BoneProfile profile = DefaultBoneProfile;
                posOverride.ApplyToPositionMatching(ref profile);
                overridenProfiles[posOverride.bone] = profile;
            }

            foreach (BoneProfileOverride rotOverride in rotationMatchingOverrides)
            {
                if (!overridenProfiles.TryGetValue(rotOverride.bone, out BoneProfile profile))
                {
                    profile = DefaultBoneProfile;
                }

                rotOverride.ApplyToRotationMatching(ref profile);
                overridenProfiles[rotOverride.bone] = profile;
            }
        }
 internal void ApplyToRotationMatching(ref BoneProfile boneProfile)
 {
     boneProfile.rotationAlpha        = alpha;
     boneProfile.rotationDampingRatio = dampingRatio;
 }