134 lines
5.2 KiB
C#
134 lines
5.2 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace UniHumanoid
|
|
{
|
|
public static class AnimationClipUtility
|
|
{
|
|
static Dictionary<string, string> TraitPropMap = new Dictionary<string, string>
|
|
{
|
|
{"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;
|
|
}
|
|
}
|
|
}
|