void ModifyBoneProfile(ref BoneProfile boneProfile, AnimatedPair pair, float dt) { foreach (IBoneProfileModifier modifier in boneProfileModifiers) { modifier.Modify(ref boneProfile, pair, dt); } }
void ApplyMasterParameters(ref BoneProfile boneProfile) { boneProfile.positionAlpha *= _masterAlpha; boneProfile.positionDampingRatio *= _masterDampingRatio; boneProfile.rotationAlpha *= _masterAlpha; boneProfile.rotationDampingRatio *= _masterDampingRatio; }
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)); }
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); }
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) }); }
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; }