using System.Collections.Generic; using UnityEngine; namespace UniHumanoid { public static class AnimationClipUtility { static Dictionary TraitPropMap = new Dictionary { {"Left Thumb 1 Stretched", "LeftHand.Thumb.1 Stretched"}, {"Left Thumb Spread", "LeftHand.Thumb Spread"}, {"Left Thumb 2 Stretched", "LeftHand.Thumb.2 Stretched"}, {"Left Thumb 3 Stretched", "LeftHand.Thumb.3 Stretched"}, {"Left Index 1 Stretched", "LeftHand.Index.1 Stretched"}, {"Left Index Spread", "LeftHand.Index Spread"}, {"Left Index 2 Stretched", "LeftHand.Index.2 Stretched"}, {"Left Index 3 Stretched", "LeftHand.Index.3 Stretched"}, {"Left Middle 1 Stretched", "LeftHand.Middle.1 Stretched"}, {"Left Middle Spread", "LeftHand.Middle Spread"}, {"Left Middle 2 Stretched", "LeftHand.Middle.2 Stretched"}, {"Left Middle 3 Stretched", "LeftHand.Middle.3 Stretched"}, {"Left Ring 1 Stretched", "LeftHand.Ring.1 Stretched"}, {"Left Ring Spread", "LeftHand.Ring Spread"}, {"Left Ring 2 Stretched", "LeftHand.Ring.2 Stretched"}, {"Left Ring 3 Stretched", "LeftHand.Ring.3 Stretched"}, {"Left Little 1 Stretched", "LeftHand.Little.1 Stretched"}, {"Left Little Spread", "LeftHand.Little Spread"}, {"Left Little 2 Stretched", "LeftHand.Little.2 Stretched"}, {"Left Little 3 Stretched", "LeftHand.Little.3 Stretched"}, {"Right Thumb 1 Stretched", "RightHand.Thumb.1 Stretched"}, {"Right Thumb Spread", "RightHand.Thumb Spread"}, {"Right Thumb 2 Stretched", "RightHand.Thumb.2 Stretched"}, {"Right Thumb 3 Stretched", "RightHand.Thumb.3 Stretched"}, {"Right Index 1 Stretched", "RightHand.Index.1 Stretched"}, {"Right Index Spread", "RightHand.Index Spread"}, {"Right Index 2 Stretched", "RightHand.Index.2 Stretched"}, {"Right Index 3 Stretched", "RightHand.Index.3 Stretched"}, {"Right Middle 1 Stretched", "RightHand.Middle.1 Stretched"}, {"Right Middle Spread", "RightHand.Middle Spread"}, {"Right Middle 2 Stretched", "RightHand.Middle.2 Stretched"}, {"Right Middle 3 Stretched", "RightHand.Middle.3 Stretched"}, {"Right Ring 1 Stretched", "RightHand.Ring.1 Stretched"}, {"Right Ring Spread", "RightHand.Ring Spread"}, {"Right Ring 2 Stretched", "RightHand.Ring.2 Stretched"}, {"Right Ring 3 Stretched", "RightHand.Ring.3 Stretched"}, {"Right Little 1 Stretched", "RightHand.Little.1 Stretched"}, {"Right Little Spread", "RightHand.Little Spread"}, {"Right Little 2 Stretched", "RightHand.Little.2 Stretched"}, {"Right Little 3 Stretched", "RightHand.Little.3 Stretched"}, }; public static AnimationClip CreateAnimationClipFromHumanPose(HumanPose pose) { var clip = new AnimationClip(); // pos { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.bodyPosition.x), }); var muscle = "RootT.x"; clip.SetCurve(null, typeof(Animator), muscle, curve); } { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.bodyPosition.y), }); var muscle = "RootT.y"; clip.SetCurve(null, typeof(Animator), muscle, curve); } { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.bodyPosition.z), }); var muscle = "RootT.z"; clip.SetCurve(null, typeof(Animator), muscle, curve); } // rot { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.bodyRotation.x), }); var muscle = "RootQ.x"; clip.SetCurve(null, typeof(Animator), muscle, curve); } { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.bodyRotation.y), }); var muscle = "RootQ.y"; clip.SetCurve(null, typeof(Animator), muscle, curve); } { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.bodyRotation.z), }); var muscle = "RootQ.z"; clip.SetCurve(null, typeof(Animator), muscle, curve); } { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.bodyRotation.w), }); var muscle = "RootQ.w"; clip.SetCurve(null, typeof(Animator), muscle, curve); } // muscles for (int i = 0; i < HumanTrait.MuscleCount; ++i) { var curve = new AnimationCurve(new Keyframe[] { new Keyframe(0, pose.muscles[i]), }); var muscle = HumanTrait.MuscleName[i]; if (TraitPropMap.ContainsKey(muscle)) { muscle = TraitPropMap[muscle]; } clip.SetCurve(null, typeof(Animator), muscle, curve); } return clip; } } }