private void SyncIKFromPose() { var selectedTransform = Selection.transforms; var stream = new AnimationStream(); if (m_Animator.OpenAnimationStream(ref stream)) { AnimationHumanStream humanStream = stream.AsHuman(); // don't sync if transform is currently selected if (!Array.Exists(selectedTransform, tr => tr == m_LeftFootEffector.transform)) { m_LeftFootEffector.transform.position = humanStream.GetGoalPositionFromPose(AvatarIKGoal.LeftFoot); m_LeftFootEffector.transform.rotation = humanStream.GetGoalRotationFromPose(AvatarIKGoal.LeftFoot); } if (!Array.Exists(selectedTransform, tr => tr == m_RightFootEffector.transform)) { m_RightFootEffector.transform.position = humanStream.GetGoalPositionFromPose(AvatarIKGoal.RightFoot); m_RightFootEffector.transform.rotation = humanStream.GetGoalRotationFromPose(AvatarIKGoal.RightFoot); } if (!Array.Exists(selectedTransform, tr => tr == m_LeftHandEffector.transform)) { m_LeftHandEffector.transform.position = humanStream.GetGoalPositionFromPose(AvatarIKGoal.LeftHand); m_LeftHandEffector.transform.rotation = humanStream.GetGoalRotationFromPose(AvatarIKGoal.LeftHand); } if (!Array.Exists(selectedTransform, tr => tr == m_RightHandEffector.transform)) { m_RightHandEffector.transform.position = humanStream.GetGoalPositionFromPose(AvatarIKGoal.RightHand); m_RightHandEffector.transform.rotation = humanStream.GetGoalRotationFromPose(AvatarIKGoal.RightHand); } if (!Array.Exists(selectedTransform, tr => tr == m_LeftKneeHintEffector.transform)) { m_LeftKneeHintEffector.transform.position = humanStream.GetHintPosition(AvatarIKHint.LeftKnee); } if (!Array.Exists(selectedTransform, tr => tr == m_RightKneeHintEffector.transform)) { m_RightKneeHintEffector.transform.position = humanStream.GetHintPosition(AvatarIKHint.RightKnee); } if (!Array.Exists(selectedTransform, tr => tr == m_LeftElbowHintEffector.transform)) { m_LeftElbowHintEffector.transform.position = humanStream.GetHintPosition(AvatarIKHint.LeftElbow); } if (!Array.Exists(selectedTransform, tr => tr == m_RightElbowHintEffector.transform)) { m_RightElbowHintEffector.transform.position = humanStream.GetHintPosition(AvatarIKHint.RightElbow); } if (!Array.Exists(selectedTransform, tr => tr == m_BodyRotationEffector.transform)) { m_BodyRotationEffector.transform.position = humanStream.bodyPosition; m_BodyRotationEffector.transform.rotation = humanStream.bodyRotation; } m_Animator.CloseAnimationStream(ref stream); } }
private void Solve(AnimationStream stream) { AnimationHumanStream humanStream = stream.AsHuman(); Vector3 bodyPosition = humanStream.bodyPosition; Vector3 bodyPositionDelta = Vector3.zero; float sumWeight = 0; for (int goalIter = 0; goalIter < 4; goalIter++) { float weight = humanStream.GetGoalWeightPosition((AvatarIKGoal)goalIter); weight = Mathf.Clamp01(weight); bodyPositionDelta += (humanStream.GetGoalPosition((AvatarIKGoal)goalIter) - humanStream.GetGoalPositionFromPose((AvatarIKGoal)goalIter)) * weight; sumWeight += weight; } if (sumWeight > 1) { bodyPositionDelta /= sumWeight; } bodyPosition += bodyPositionDelta; humanStream.bodyPosition = bodyPosition; if (bodyEffector.body.IsValid(stream)) { bodyEffector.body.SetPosition(stream, bodyPosition); } humanStream.SolveIK(); }