public Vector3 GetPoint(float t) { int i; if (t >= 1.0f) { t = 1.0f; i = _points.Length - 4; } else { t = Mathf.Clamp01(t) * CurveCount; i = (int)t; t -= i; i *= 3; } return(transform.TransformPoint(Bezier.GetPoint(_points[i], _points[i + 1], _points[i + 2], _points[i + 3], t))); }
/// <summary> /// Get point on spline. /// </summary> /// <param name="t"> time </param> public Vector3 GetPoint(float t) { int i; if (t >= 1f) { t = 1f; i = points.Count - 4; } else { t = Mathf.Clamp01(t) * CurveCount; i = (int)t; t -= i; i *= 3; } return(transform.TransformPoint(Bezier.GetPoint(points[i], points[i + 1], points[i + 2], points[LoopIndex(i + 3)], t))); }
/// <summary> /// Get the point in the curve corresponding to the t value. /// </summary> /// <param name="t">value</param> /// <returns></returns> public Vector3 GetPoint(float t) { return(transform.TransformPoint(Bezier.GetPoint(points[0], points[1], points[2], points[3], t))); }
public List <Vector3> CalculateEvenlySpacedPoints(float spacing, float resolution = 1, int startCurve = 0, int endCurve = -1) { if (endCurve == -1) { endCurve = CurveCount; } if (endCurve < startCurve) { throw new Exception("endCurve value can't be smaller than startCurve"); } if (startCurve > CurveCount) { throw new Exception("startCurve is bigger than curvecount"); } int numControlPoints = (endCurve - startCurve) * 3 + 1; if (controlPoints.Capacity < numControlPoints) { controlPoints = new List <Vector3>(numControlPoints); } for (int i = 0; i < numControlPoints; ++i) { controlPoints.Add(GetControlPoint(i + startCurve * 3)); } float estimatedSplineLength = 0; int numCurves = endCurve - startCurve; if (curveLengths.Capacity < numCurves) { curveLengths = new List <float>(numCurves); } // Calculate estimatedSplinelength for (int i = 0; i < controlPoints.Count - 1; i += 3) { Vector3 p0 = controlPoints[i], p1 = controlPoints[i + 1], p2 = controlPoints[i + 2], p3 = controlPoints[i + 3]; float chord = Vector3.Distance(p0, p3); float controlNetLength = Vector3.Distance(p0, p1) + Vector3.Distance(p1, p2) + Vector3.Distance(p2, p3); float estimatedCurveLength = (chord + controlNetLength) / 2f; curveLengths.Add(estimatedCurveLength); estimatedSplineLength += estimatedCurveLength; } #region EvenlySpacedPoints declaration if (EvenlySpacedPoints == null || EvenlySpacedPoints.Capacity < Mathf.RoundToInt(estimatedSplineLength / spacing)) { EvenlySpacedPoints = new List <Vector3>(Mathf.RoundToInt(estimatedSplineLength / spacing)); } EvenlySpacedPoints.Clear(); EvenlySpacedPoints.Add(points[startCurve * 3]); Vector3 previousPoint = points[startCurve * 3]; #endregion float distanceSinceLastEvenPoint = 0; for (int i = 0; i < curveLengths.Count; ++i) { int j = i * 3; int divisions = Mathf.CeilToInt(curveLengths[i] * resolution * 10); float t = 0; while (t <= 1) { t += 1f / divisions; Vector3 pointOnCurve = Bezier.GetPoint(controlPoints[j], controlPoints[j + 1], controlPoints[j + 2], controlPoints[j + 3], t); distanceSinceLastEvenPoint += Vector3.Distance(previousPoint, pointOnCurve); Vector3 normalizedDir = (previousPoint - pointOnCurve).normalized; while (distanceSinceLastEvenPoint >= spacing) { float overshootDistance = distanceSinceLastEvenPoint - spacing; Vector3 newEvenlySpacedPoint = pointOnCurve + normalizedDir * overshootDistance; EvenlySpacedPoints.Add(newEvenlySpacedPoint); distanceSinceLastEvenPoint = overshootDistance; previousPoint = newEvenlySpacedPoint; } previousPoint = pointOnCurve; } } curveLengths.Clear(); controlPoints.Clear(); return(EvenlySpacedPoints); }