Esempio n. 1
0
    private void AddKey(AnimationCurve curve, LabelClip clip, int begin, int end, int size)
    {
        char[] labels   = clip.Label.ToCharArray();
        float  duration = 1.0f / labels.Length;

        if (curve.length == 2)
        {
            curve.AddKey(new Keyframe(duration * begin, 0, 0, 0));
        }
        else
        {
            curve.AddKey(new Keyframe(duration * begin, clip.Min, 0, 0));
        }

        curve.AddKey(new Keyframe(duration * begin + duration * 0.5f, clip.Max, 0, 0));

        if (size > 1)
        {
            curve.AddKey(new Keyframe(duration * (begin + size) - duration * 0.5f, clip.Max, 0, 0));
        }

        if (end < labels.Length - 1)
        {
            curve.AddKey(new Keyframe(duration * (begin + size), clip.Min, 0, 0));
        }
    }
Esempio n. 2
0
    private void GenerateBlendShape()
    {
        var clips = AiueoTrack.GetClips();

        foreach (var clip in clips)
        {
            LabelClip        clipAsset = clip.asset as LabelClip;
            char[]           labels    = clipAsset.Label.ToCharArray();
            AnimationCurve[] curves    = new AnimationCurve[0];

            for (int i = 0; i < 5; i++)
            {
                ArrayExtensions.Add(ref curves, AnimationCurveExtensions.ZeroCurve());
            }

            int begin = 0;
            int size  = 1;
            for (int end = 0; end < labels.Length; end++)
            {
                if (end < labels.Length - 1 && labels[end] == labels[end + 1])
                {
                    size++;
                }
                else
                {
                    switch (labels[end])
                    {
                    case 'a':
                    case 'A':
                        AddKey(curves[0], clipAsset, begin, end, size);
                        break;

                    case 'i':
                    case 'I':
                        AddKey(curves[1], clipAsset, begin, end, size);
                        break;

                    case 'u':
                    case 'U':
                        AddKey(curves[2], clipAsset, begin, end, size);
                        break;

                    case 'e':
                    case 'E':
                        AddKey(curves[3], clipAsset, begin, end, size);
                        break;

                    case 'o':
                    case 'O':
                        AddKey(curves[4], clipAsset, begin, end, size);
                        break;
                    }
                    begin = end + 1;
                    size  = 1;
                }
            }

            float min = clipAsset.Min;
            for (int i = 0; i < curves.Length; i++)
            {
                PostProcess(ref curves[i], min);
            }

            AddBlendShapeClip(clip.start, clip.duration, AiueoShapeTrack, curves);
            AddBlendShapeClip(clip.start, clip.duration, UpperTeethShapeTracK, curves);
            AddBlendShapeClip(clip.start, clip.duration, ButtomTeethShapeTracK, curves);
        }

        clips = BlinkTrack.GetClips();
        foreach (var clip in clips)
        {
            LabelClip        clipAsset = clip.asset as LabelClip;
            AnimationCurve[] curves    = new AnimationCurve[1] {
                AnimationCurveExtensions.UCurve(0.5f, 0.0f, clipAsset.Min, clipAsset.Max)
            };
            AddBlendShapeClip(clip.start, clip.duration, BlinkShapeTrack, curves);
        }
    }