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)));
        }
Пример #3
0
 /// <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);
        }