public void SetTangentVector(int fencepostIndex, Vector3 positiveTangentVector) { if (fencepostIndex < 0 || fencepostIndex > curves.Count) { Debug.LogErrorFormat("ERROR: fencepostIndex {0} must be in the inclusive range [0, {1}].", fencepostIndex, curves.Count ); } if (fencepostIndex < 1) { BezierCurve3D startCurve = curves[0]; startCurve.p1 = startCurve.p0 + positiveTangentVector; curves[0] = startCurve; } else if (1 <= fencepostIndex && fencepostIndex < curves.Count) { BezierCurve3D preCurve = curves[fencepostIndex - 1]; BezierCurve3D postCurve = curves[fencepostIndex]; preCurve.p2 = preCurve.p3 - positiveTangentVector; postCurve.p1 = postCurve.p0 + positiveTangentVector; curves[fencepostIndex - 1] = preCurve; curves[fencepostIndex] = postCurve; } else { BezierCurve3D endCurve = curves[fencepostIndex]; endCurve.p2 = endCurve.p3 - positiveTangentVector; curves[fencepostIndex] = endCurve; } }
public static BezierCurve3D Lerp(BezierCurve3D a, BezierCurve3D b, float t) { return(new BezierCurve3D( Vector3.Lerp(a.p0, b.p0, t), Vector3.Lerp(a.p1, b.p1, t), Vector3.Lerp(a.p2, b.p2, t), Vector3.Lerp(a.p3, b.p3, t) )); }
// TODO: implement subdivide/upres public static void Lerp(BezierChain3D a, BezierChain3D b, float t, ref BezierChain3D dst) { if (a.curves.Count != b.curves.Count) { Debug.LogErrorFormat("Currently cannot lerp 2 chains of different curveCount. A curveCount: {0}, B curveCount: {1} ", a.curves.Count, b.curves.Count ); return; } dst.curves.Clear(); int cCount = a.curves.Count; for (int i = 0; i < cCount; i++) { var aCurve = a.curves[i]; var bCurve = a.curves[i]; dst.curves.Add(BezierCurve3D.Lerp(aCurve, bCurve, t)); } }