public static void Kinect2Mixamo(MoCapKinectFacialExpression facialExpressionKinect, float weightKinect, out MoCapMixamoFacialExpression facialExpressionMixamo, out float weightMixamo) { facialExpressionMixamo = MoCapMixamoFacialExpression.Unknown; weightMixamo = 0.00f; if (!IsValidKinectFacialExpression(facialExpressionKinect)) { return; } var min = Calibration.Calibration[(int)facialExpressionKinect].WeightMin; var max = Calibration.Calibration[(int)facialExpressionKinect].WeightMax; switch (facialExpressionKinect) { case MoCapKinectFacialExpression.JawOpen: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Jaw_Down; break; case MoCapKinectFacialExpression.LipPucker: break; case MoCapKinectFacialExpression.JawSlideRight: weightMixamo = NormalizeWeight(min, max, weightKinect); if (weightMixamo >= 0) { weightMixamo = +weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.Jaw_Right; } else { weightMixamo = -weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.Jaw_Left; } break; case MoCapKinectFacialExpression.LipStretcherRight: break; case MoCapKinectFacialExpression.LipStretcherLeft: break; case MoCapKinectFacialExpression.LipCornerPullerLeft: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Smile_Left; break; case MoCapKinectFacialExpression.LipCornerPullerRight: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Smile_Right; break; case MoCapKinectFacialExpression.LipCornerDepressorLeft: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Frown_Left; break; case MoCapKinectFacialExpression.LipCornerDepressorRight: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Frown_Right; break; case MoCapKinectFacialExpression.LeftcheekPuff: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.CheekPuff_Left; break; case MoCapKinectFacialExpression.RightcheekPuff: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.CheekPuff_Right; break; case MoCapKinectFacialExpression.LefteyeClosed: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Blink_Left; break; case MoCapKinectFacialExpression.RighteyeClosed: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Blink_Right; ; break; case MoCapKinectFacialExpression.RighteyebrowLowerer: weightMixamo = NormalizeWeight(min, max, weightKinect); if (weightMixamo >= 0) { weightMixamo = +weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsDown_Right; } else { weightMixamo = -weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsUp_Right; } break; case MoCapKinectFacialExpression.LefteyebrowLowerer: weightMixamo = NormalizeWeight(min, max, weightKinect); if (weightMixamo >= 0) { weightMixamo = +weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsDown_Left; } else { weightMixamo = -weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsUp_Left; } break; case MoCapKinectFacialExpression.LowerlipDepressorLeft: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.LowerLipDown_Left; break; case MoCapKinectFacialExpression.LowerlipDepressorRight: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.LowerLipDown_Right; break; default: throw new NotImplementedException(); } }
public static void Mixamo2Kinect(MoCapMixamoFacialExpression facialExpressionMixamo, float weightMixamo, out MoCapKinectFacialExpression facialExpressionKinect, out float weightKinect) { throw new NotImplementedException(); }
public static bool IsValidMixamoFacialExpression(MoCapMixamoFacialExpression facialExpression) { return(facialExpression != MoCapMixamoFacialExpression.Unknown && facialExpression != MoCapMixamoFacialExpression.LastBlendShape); }
private static void SetAnimationCurvesForFace(Animator animator, GameObject rootObject, KeyValuePair <float, float>[] weights, AnimationClip animationClip, MoCapMixamoFacialExpression expression) { if (animator == null) { throw new Exception("Animator can not be null!"); } if (rootObject == null) { throw new Exception("Root object can not be null!"); } if (weights == null || weights.Length == 0) { throw new Exception("Weights can not be empty!"); } if (animationClip == null) { throw new Exception("Animation clip can not be null!"); } if (!MoCapFacialExpressionMapper.IsValidMixamoFacialExpression(expression)) { throw new Exception("Invalid Mixamo facial expression!"); } var keyframes = new Keyframe[weights.Length]; for (var i = 0; i < weights.Length; i++) { keyframes[i] = new Keyframe(weights[i].Key, weights[i].Value); } var animationCurve = new AnimationCurve(keyframes); animationClip.SetCurve("Body", typeof(SkinnedMeshRenderer), string.Format("blendShape.Facial_Blends.{0}", expression), animationCurve); if (expression == MoCapMixamoFacialExpression.Blink_Left || expression == MoCapMixamoFacialExpression.Blink_Right) { animationClip.SetCurve("Eyelashes", typeof(SkinnedMeshRenderer), string.Format("blendShape.Facial_Blends.{0}", expression), animationCurve); } }
public static void Kinect2Mixamo(MoCapKinectFacialExpression facialExpressionKinect, float weightKinect, out MoCapMixamoFacialExpression facialExpressionMixamo, out float weightMixamo) { facialExpressionMixamo = MoCapMixamoFacialExpression.Unknown; weightMixamo = 0.00f; if (!IsValidKinectFacialExpression(facialExpressionKinect)) return; var min = Calibration.Calibration[(int) facialExpressionKinect].WeightMin; var max = Calibration.Calibration[(int) facialExpressionKinect].WeightMax; switch (facialExpressionKinect) { case MoCapKinectFacialExpression.JawOpen: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Jaw_Down; break; case MoCapKinectFacialExpression.LipPucker: break; case MoCapKinectFacialExpression.JawSlideRight: weightMixamo = NormalizeWeight(min, max, weightKinect); if (weightMixamo >= 0) { weightMixamo = +weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.Jaw_Right; } else { weightMixamo = -weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.Jaw_Left; } break; case MoCapKinectFacialExpression.LipStretcherRight: break; case MoCapKinectFacialExpression.LipStretcherLeft: break; case MoCapKinectFacialExpression.LipCornerPullerLeft: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Smile_Left; break; case MoCapKinectFacialExpression.LipCornerPullerRight: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Smile_Right; break; case MoCapKinectFacialExpression.LipCornerDepressorLeft: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Frown_Left; break; case MoCapKinectFacialExpression.LipCornerDepressorRight: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Frown_Right; break; case MoCapKinectFacialExpression.LeftcheekPuff: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.CheekPuff_Left; break; case MoCapKinectFacialExpression.RightcheekPuff: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.CheekPuff_Right; break; case MoCapKinectFacialExpression.LefteyeClosed: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Blink_Left; break; case MoCapKinectFacialExpression.RighteyeClosed: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.Blink_Right; ; break; case MoCapKinectFacialExpression.RighteyebrowLowerer: weightMixamo = NormalizeWeight(min, max, weightKinect); if (weightMixamo >= 0) { weightMixamo = +weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsDown_Right; } else { weightMixamo = -weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsUp_Right; } break; case MoCapKinectFacialExpression.LefteyebrowLowerer: weightMixamo = NormalizeWeight(min, max, weightKinect); if (weightMixamo >= 0) { weightMixamo = +weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsDown_Left; } else { weightMixamo = -weightMixamo; facialExpressionMixamo = MoCapMixamoFacialExpression.BrowsUp_Left; } break; case MoCapKinectFacialExpression.LowerlipDepressorLeft: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.LowerLipDown_Left; break; case MoCapKinectFacialExpression.LowerlipDepressorRight: weightMixamo = NormalizeWeight(max, weightKinect); facialExpressionMixamo = MoCapMixamoFacialExpression.LowerLipDown_Right; break; default: throw new NotImplementedException(); } }
public static bool IsValidMixamoFacialExpression(MoCapMixamoFacialExpression facialExpression) { return facialExpression != MoCapMixamoFacialExpression.Unknown && facialExpression != MoCapMixamoFacialExpression.LastBlendShape; }
private static void SetAnimationCurvesForFace(Animator animator, GameObject rootObject, KeyValuePair<float, float>[] weights, AnimationClip animationClip, MoCapMixamoFacialExpression expression) { if (animator == null) throw new Exception("Animator can not be null!"); if (rootObject == null) throw new Exception("Root object can not be null!"); if (weights == null || weights.Length == 0) throw new Exception("Weights can not be empty!"); if (animationClip == null) throw new Exception("Animation clip can not be null!"); if (!MoCapFacialExpressionMapper.IsValidMixamoFacialExpression(expression)) throw new Exception("Invalid Mixamo facial expression!"); var keyframes = new Keyframe[weights.Length]; for (var i = 0; i < weights.Length; i++) keyframes[i] = new Keyframe(weights[i].Key, weights[i].Value); var animationCurve = new AnimationCurve(keyframes); animationClip.SetCurve("Body", typeof (SkinnedMeshRenderer), string.Format("blendShape.Facial_Blends.{0}", expression), animationCurve); if (expression == MoCapMixamoFacialExpression.Blink_Left || expression == MoCapMixamoFacialExpression.Blink_Right) animationClip.SetCurve("Eyelashes", typeof (SkinnedMeshRenderer), string.Format("blendShape.Facial_Blends.{0}", expression), animationCurve); }