Ejemplo n.º 1
0
    void Start()
    {
        limitersNum = (int)Mathf.Floor(1 / timeBetweenLimiters);
        limiters    = new GameObject[path.anchor.Count * limitersNum * 2];

        for (int a = 0; a < path.anchor.Count; a++)
        {
            float t = 0;

            for (int i = 0; i < limitersNum; i++)
            {
                Vector3 pos = Bezier.Cubic(path.anchor[a], path.following[a], path.previous[path.LoopIndex(a + 1)], path.anchor[path.LoopIndex(a + 1)], t);
                Vector3 dir = (Bezier.Cubic(path.anchor[a], path.following[a], path.previous[path.LoopIndex(a + 1)], path.anchor[path.LoopIndex(a + 1)], t + .01f) - pos).normalized;

                limiters[a * limitersNum + i] = Instantiate(circuitLimiter, pos + new Vector3(-dir.z, 0, dir.x) * width, Quaternion.identity);
                limiters[path.anchor.Count * limitersNum + a * limitersNum + i] = Instantiate(circuitLimiter, pos + new Vector3(dir.z, 0, -dir.x) * width, Quaternion.identity);

                limiters[a * limitersNum + i].GetComponent <KeepPosition>().PositionToMaintain = pos + new Vector3(-dir.z, 0, dir.x) * width;
                limiters[path.anchor.Count * limitersNum + a * limitersNum + i].GetComponent <KeepPosition>().PositionToMaintain = pos + new Vector3(dir.z, 0, -dir.x) * width;

                t += timeBetweenLimiters;
            }
        }
    }
Ejemplo n.º 2
0
    // 计算平均分割曲线的点
    public Vector2[] CalEvenSpacedPoints(float spacing, float resolution = 1)
    {
        List <Vector2> evenlySpacedPoints = new List <Vector2>();

        evenlySpacedPoints.Add(points[0]);
        Vector2 previousPoint         = points[0];
        float   dstSinceLastEvenPoint = 0;

        for (int segmentIndex = 0; segmentIndex < NumSegments; segmentIndex++)
        {
            Vector2[] p = GetPointsInSegment(segmentIndex);
            float     controlNetLength     = Vector2.Distance(p[0], p[1]) + Vector2.Distance(p[1], p[2]) + Vector2.Distance(p[2], p[3]);
            float     estimatedCurveLength = Vector2.Distance(p[0], p[3]) + controlNetLength / 2f;
            int       divisions            = Mathf.CeilToInt(estimatedCurveLength * resolution * 10);
            float     t = 0;
            while (t <= 1)
            {
                t += 1f / divisions;
                Vector2 pointOnCurve = Bezier.Cubic(p[0], p[1], p[2], p[3], t);
                dstSinceLastEvenPoint += Vector2.Distance(previousPoint, pointOnCurve);

                while (dstSinceLastEvenPoint >= spacing)
                {
                    float   overshootDst         = dstSinceLastEvenPoint - spacing;
                    Vector2 newEvenlySpacedPoint = pointOnCurve + (previousPoint - pointOnCurve).normalized * overshootDst;
                    evenlySpacedPoints.Add(newEvenlySpacedPoint);
                    dstSinceLastEvenPoint = overshootDst;
                    previousPoint         = newEvenlySpacedPoint;
                }

                previousPoint = pointOnCurve;
            }
        }

        return(evenlySpacedPoints.ToArray());
    }