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)); } }
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); } }