Example #1
0
    void ReCalcBezier()
    {
        BezierCreater bc = target as BezierCreater;

        bc.points.Clear();
        bc.length = 0;
        List <Vector3> plist = new List <Vector3>();
        Vector3        prevPos;

        for (int i = 0; i < bc.bcList.Count - 1; i++)
        {
            BezierCreater.PointPart pp = new BezierCreater.PointPart();
            plist.Clear();
            //plist.Add(bc.bcList[i].point + bc.bcList[i].lp);
            plist.Add(bc.bcList[i].point);
            if (bc.bcList[i].rp != Vector3.zero)
            {
                plist.Add(bc.bcList[i].point + bc.bcList[i].rp);
            }

            if (bc.bcList[i + 1].lp != Vector3.zero)
            {
                plist.Add(bc.bcList[i + 1].point + bc.bcList[i + 1].lp);
            }
            plist.Add(bc.bcList[i + 1].point);
            //plist.Add(bc.bcList[i + 1].point + bc.bcList[i + 1].rp);

            CalcBeizer(plist, pp);
            bc.points.Add(pp);
            bc.length += pp.length;
        }
    }
Example #2
0
 void OnDrawGizmos()
 {
     Gizmos.color = Color.blue;
     if (points.Count >= 1)
     {
         Handles.color = Color.blue;
         for (int i = 0; i < points.Count; i++)
         {
             BezierCreater.PointPart pp = points[i];
             for (int j = 0; j < pp.points.Count - 1; j++)
             {
                 Vector3 pos0 = WorldPoint(pp.points[j]);
                 Vector3 pos1 = WorldPoint(pp.points[j + 1]);
                 Handles.DrawLine(pos0, pos1);
             }
         }
     }
 }
Example #3
0
    Vector3[] CalcBeizer(List <Vector3> plist, BezierCreater.PointPart part)
    {
        int n = 0;

        if ((n = plist.Count) < 2)
        {
            return(null);
        }
        float step = _srate / (float)n;

        List <Vector3> ret = new List <Vector3>();

        float[] xarray = new float[n - 1];
        float[] yarray = new float[n - 1];
        float[] zarray = new float[n - 1];
        float   x      = plist[0].x;
        float   y      = plist[0].y;
        float   z      = plist[0].z;
        Vector3 npos   = Vector3.zero;

        for (float t = 0.0f; t <= 1; t += step) // 调整参数t,计算贝塞尔曲线上的点的坐标,t即为上述u
        {
            for (int i = 1; i < n; ++i)
            {
                for (int j = 0; j < n - i; ++j)
                {
                    if (i == 1) // i==1时,第一次迭代,由已知控制点计算
                    {
                        xarray[j] = plist[j].x * (1 - t) + plist[j + 1].x * t;
                        yarray[j] = plist[j].y * (1 - t) + plist[j + 1].y * t;
                        zarray[j] = plist[j].z * (1 - t) + plist[j + 1].z * t;
                        continue;
                    }
                    // i != 1时,通过上一次迭代的结果计算
                    xarray[j] = xarray[j] * (1 - t) + xarray[j + 1] * t;
                    yarray[j] = yarray[j] * (1 - t) + yarray[j + 1] * t;
                    zarray[j] = zarray[j] * (1 - t) + zarray[j + 1] * t;
                }
            }

            x    = xarray[0];
            y    = yarray[0];
            z    = zarray[0];
            npos = new Vector3(x, y, z);
            ret.Add(npos);
            if (part != null)
            {
                if (part.points.Count > 0)
                {
                    part.length += Vector3.Distance(part.points[part.points.Count - 1], npos);
                }
                part.points.Add(npos);
            }
        }
        if (npos != plist[plist.Count - 1])
        {
            npos = plist[plist.Count - 1];
            ret.Add(npos);
            if (part != null)
            {
                if (part.points.Count > 0)
                {
                    part.length += Vector3.Distance(part.points[part.points.Count - 1], npos);
                }
                part.points.Add(npos);
            }
        }

        // 优化掉过路点
        if (part.points.Count > 2)
        {
            Vector3        prevDir      = Vector3.zero;
            List <Vector3> removePoints = new List <Vector3>();
            for (int i = 1; i < part.points.Count; i++)
            {
                Vector3 p0  = part.points[i - 1];
                Vector3 p1  = part.points[i];
                Vector3 dir = p1 - p0;
                if (dir != prevDir)
                {
                    prevDir = dir;
                }
                else
                {
                    removePoints.Add(p0);
                }
            }
            foreach (var p in removePoints)
            {
                part.points.Remove(p);
            }
        }

        return(ret.ToArray());
    }