コード例 #1
0
        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();
            }
        }
コード例 #2
0
 public static void Mixamo2Kinect(MoCapMixamoFacialExpression facialExpressionMixamo, float weightMixamo,
                                  out MoCapKinectFacialExpression facialExpressionKinect, out float weightKinect)
 {
     throw new NotImplementedException();
 }
コード例 #3
0
 public static bool IsValidMixamoFacialExpression(MoCapMixamoFacialExpression facialExpression)
 {
     return(facialExpression != MoCapMixamoFacialExpression.Unknown &&
            facialExpression != MoCapMixamoFacialExpression.LastBlendShape);
 }
コード例 #4
0
    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);
        }
    }
コード例 #5
0
        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();
            }
        }
コード例 #6
0
 public static bool IsValidMixamoFacialExpression(MoCapMixamoFacialExpression facialExpression)
 {
     return facialExpression != MoCapMixamoFacialExpression.Unknown &&
            facialExpression != MoCapMixamoFacialExpression.LastBlendShape;
 }
コード例 #7
0
 public static void Mixamo2Kinect(MoCapMixamoFacialExpression facialExpressionMixamo, float weightMixamo,
     out MoCapKinectFacialExpression facialExpressionKinect, out float weightKinect)
 {
     throw new NotImplementedException();
 }
コード例 #8
0
    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);
    }