public static CubismMotionPoint LerpPoints(CubismMotionPoint a, CubismMotionPoint b, double t) { CubismMotionPoint result; result.Time = a.Time + ((b.Time - a.Time) * t); result.Value = a.Value + ((b.Value - a.Value) * t); return(result); }
public override double Evaluate(double time) { double t = (time - Points[0].Time) / (Points[3].Time - Points[0].Time); t = Math.Max(t, 0.0); CubismMotionPoint p01 = LerpPoints(Points[0], Points[1], t); CubismMotionPoint p12 = LerpPoints(Points[1], Points[2], t); CubismMotionPoint p23 = LerpPoints(Points[2], Points[3], t); CubismMotionPoint p012 = LerpPoints(p01, p12, t); CubismMotionPoint p123 = LerpPoints(p12, p23, t); return(LerpPoints(p012, p123, t).Value); }
public CubismMotionLinearSegment() { Points = new CubismMotionPoint[2]; }
public CubismMotionInverseSteppedSegment() { Points = new CubismMotionPoint[2]; }
public CubismMotionBezierSegment() { Points = new CubismMotionPoint[4]; }
private static CubismMotionCurve ParseCurve(CubismMotionJson.CurveItem item, CubismModel model) { CubismMotionCurve curve = new CubismMotionCurve(); if (item.Target == "Model") { curve.Target = CubismMotionCurve.TargetType.Model; curve.Effect = new CubismId(item.Id); } else if (item.Target == "Parameter") { curve.Target = CubismMotionCurve.TargetType.Parameter; curve.Parameter = model.GetParameter(item.Id); if (curve.Parameter == null) { return(null); } } else if (item.Target == "PartOpacity") { curve.Target = CubismMotionCurve.TargetType.PartOpacity; curve.Part = model.GetPart(item.Id); if (curve.Part == null) { return(null); } } else { return(null); } curve.FadeInTime = item.FadeInTime; curve.FadeOutTime = item.FadeOutTime; // 制御点を読み込む // 初めの2アイテムは最初の制御点を示す var segment_item = item.Segments; int segment_count = item.Segments.Length; CubismMotionPoint last_point = new CubismMotionPoint(segment_item[0], segment_item[1]); // 以降の制御点を読み込む var segments = new List <ICubismMotionSegment>(); for (int segment_index = 2; segment_index < segment_count;) { switch ((CubismMotionSegmentType)segment_item[segment_index]) { case CubismMotionSegmentType.Linear: { var segment = new CubismMotionLinearSegment(); segment.Points[0] = last_point; segment.Points[1] = new CubismMotionPoint(segment_item[segment_index + 1], segment_item[segment_index + 2]); segments.Add(segment); last_point = segment.Points[1]; segment_index += 3; break; } case CubismMotionSegmentType.Bezier: { var segment = new CubismMotionBezierSegment(); segment.Points[0] = last_point; segment.Points[1] = new CubismMotionPoint(segment_item[segment_index + 1], segment_item[segment_index + 2]); segment.Points[2] = new CubismMotionPoint(segment_item[segment_index + 3], segment_item[segment_index + 4]); segment.Points[3] = new CubismMotionPoint(segment_item[segment_index + 5], segment_item[segment_index + 6]); segments.Add(segment); last_point = segment.Points[3]; segment_index += 7; break; } case CubismMotionSegmentType.Stepped: { var segment = new CubismMotionSteppedSegment(); segment.Points[0] = last_point; segment.Points[1] = new CubismMotionPoint(segment_item[segment_index + 1], segment_item[segment_index + 2]); segments.Add(segment); last_point = segment.Points[1]; segment_index += 3; break; } case CubismMotionSegmentType.InverseStepped: { var segment = new CubismMotionInverseSteppedSegment(); segment.Points[0] = last_point; segment.Points[1] = new CubismMotionPoint(segment_item[segment_index + 1], segment_item[segment_index + 2]); segments.Add(segment); last_point = segment.Points[1]; segment_index += 3; break; } default: throw new ArgumentOutOfRangeException(); } } curve.Segments = segments.ToArray(); return(curve); }