コード例 #1
0
        public static Spline GeneratePath(Vector3 start, Vector3 finish, int numPasses = 1, float curveSpreadX = 0.5f, float curveSpreadY = 0.5f)
        {
            Vector3[] primaryCurvePoints = new Vector3[2];
            primaryCurvePoints [0] = start;
            primaryCurvePoints [1] = finish;
            Spline curve = new Spline(primaryCurvePoints);

            float length = Vector3.Distance(start, finish);

            if (length == 0f)
            {
                return(curve);
            }

            Vector3 pathNormalized = finish - start;

            pathNormalized /= length;

            float rightDot = Mathf.Abs(Vector3.Dot(pathNormalized, Vector3.right));
            float upDot    = Mathf.Abs(Vector3.Dot(pathNormalized, Vector3.up));

            Vector3 rVec = rightDot < upDot ? Vector3.right : Vector3.up;
            Vector3 fVec = Vector3.Cross(pathNormalized, rVec);

            int midPoints = 0;

            for (int i = 0; i < numPasses; i++)
            {
                midPoints += (midPoints + 1);
                int       totalPoints = midPoints + 2;
                Vector3[] newPoints   = new Vector3[totalPoints];
                newPoints [0] = start;
                newPoints [newPoints.Length - 1] = finish;

                float segmentSize = length / (float)(midPoints + 1);

                Vector2 primaryCurveSpread = new Vector2(segmentSize * curveSpreadX, segmentSize * curveSpreadY);

                for (int j = 1; j < newPoints.Length - 1; j++)
                {
                    float   pct         = j / (float)(newPoints.Length - 1);
                    Vector3 centerPoint = curve.Evaluate(pct);
                    centerPoint  += rVec * Random.Range(-primaryCurveSpread.x, primaryCurveSpread.x);
                    centerPoint  += fVec * Random.Range(-primaryCurveSpread.y, primaryCurveSpread.y);;
                    newPoints [j] = centerPoint;
                }

                curve         = new Spline(newPoints);
                curve.tension = 0.5f;
            }

            return(curve);
        }
コード例 #2
0
ファイル: SparkyTrail.cs プロジェクト: slonermike/SparkyKit
    void SetPoints()
    {
        if (pointList.Count == 0)
        {
            Debug.LogError("pointList should never have zero points!");
            return;
        }

        if (pointList.Count == 1)
        {
            lr.positionCount = 2;
            lr.SetPosition(0, pointList.First.Value);
            lr.SetPosition(1, transform.position);
        }

        lr.enabled = pointList.Count > 1;
        if (!lr.enabled)
        {
            return;
        }

        Vector3[] pList = new Vector3[pointList.Count + 1];
        pList [pointList.Count] = transform.position;
        Vector3 prevPos = transform.position;

        LinkedListNode <Vector3> lln = pointList.First;
        int index = 0;

        do
        {
            if (parentObj != null)
            {
                lln.Value += parentObj.transform.forward.normalized * idleSpeed;
            }

            pList [index] = lln.Value;
            prevPos       = lln.Value;
            index++;
            lln = lln.Next;
        } while (lln != null);

        if (splinePrecision <= 1)
        {
            lr.positionCount = pList.Length;
            lr.SetPositions(pList);
        }
        else
        {
            Slonersoft.Spline sp = new Slonersoft.Spline(pList);
            sp.tension = 0.4f;

            int totalPoints = (splinePrecision * pList.Length) + 1;
            lr.positionCount = totalPoints;
            for (int i = 0; i < totalPoints; i++)
            {
                float   t   = (float)i / (float)(totalPoints - 1);
                Vector3 pos = sp.Evaluate(t);
                lr.SetPosition(i, pos);
            }
        }
    }