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