Example #1
0
        void DoKinematicAnimationMatching(AnimatedPair pair)
        {
            Rigidbody rigidbody = pair.RagdollBone.Rigidbody;

            rigidbody.MovePosition(pair.currentPose.worldPosition);
            rigidbody.MoveRotation(pair.currentPose.worldRotation);
        }
Example #2
0
 void ModifyBoneProfile(ref BoneProfile boneProfile, AnimatedPair pair, float dt)
 {
     foreach (IBoneProfileModifier modifier in boneProfileModifiers)
     {
         modifier.Modify(ref boneProfile, pair, dt);
     }
 }
Example #3
0
 void SetUnpoweredJointDrive(AnimatedPair pair)
 {
     pair.RagdollBone.Joint.slerpDrive = new JointDrive()
     {
         maximumForce   = 0,
         positionDamper = 0,
         positionSpring = 0
     };
 }
Example #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);
        }
Example #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);
        }
Example #6
0
        void CreateAnimatedPairs(IReadOnlyCollection <RagdollBoneTargetBonePair> bonePairs)
        {
            animatedPairs = new AnimatedPair[bonePairs.Count];

            int i = 0;

            foreach (RagdollBoneTargetBonePair bonePair in bonePairs)
            {
                animatedPairs[i] = new AnimatedPair(bonePair);
                i++;
            }
        }
Example #7
0
        void SetTargetRotation(AnimatedPair pair)
        {
            ConfigurableJoint joint = pair.RagdollBone.Joint;

            if (joint.configuredInWorldSpace)
            {
                joint.SetTargetRotation(pair.currentPose.worldRotation, pair.RagdollBone.StartingJointRotation);
            }
            else
            {
                joint.SetTargetRotationLocal(pair.currentPose.localRotation, pair.RagdollBone.StartingJointRotation);
            }
        }
Example #8
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);
        }