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; } }
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); } } } }
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()); }