public static List <Vector3> Split(Vector3 from, Vector3 to, Vector3 curve, int count) { List <Vector3> segments = new List <Vector3>(); segments.Add(from); if (count <= 0) { return(segments); } var handler = Bezier.CalcHandler(from, to, curve); for (int i = 1; i <= count; i++) { var t = (float)i / count; segments.Add(Bezier.Square(from, to, handler, t)); } return(segments); }
void HandleOnUpdateCurve( ) { var count = Mathf.Ceil(1 / curveDetail); //Build the curve var handler = Bezier.CalcHandler(startPosition, endPosition, curvePosition);; //var handler = curvePosition;// //Bezier.Control(startPosition, endPosition, curvePosition); var center = Bezier.Square(startPosition, endPosition, handler, 0.5F); //centerPosition = new Vector3 ( center.x, center.y, 0 ); var vertices = new List <Vector3>(); var triangles = new List <int>(); var uv = new List <Vector2>(); var normals = new List <Vector3>(); var tangents = new List <Vector4>(); float UVX = 0F; Vector2 I0, I1, I2, I3; for (int i = 0; i < count; i++) { var pre = Bezier.Square(startPosition, endPosition, handler, (float)(i - 1) / count); var cur = Bezier.Square(startPosition, endPosition, handler, (float)i / count); var next = Bezier.Square(startPosition, endPosition, handler, (float)(i + 1) / count); var preTegent = cur - pre; var nextTegent = next - cur; var normal = Vector3.back; var preBinormal = Vector3.zero; var nextBinormal = Vector3.zero; Vector3.OrthoNormalize(ref normal, ref preTegent, ref preBinormal); Vector3.OrthoNormalize(ref normal, ref nextTegent, ref nextBinormal); var preOffset = width * 0.5F * preBinormal; var nextOffset = width * 0.5F * nextBinormal; var p0 = pre + preOffset; // (Vector2)(pre + preOffset); var p1 = cur + preOffset; // (Vector2) (cur + preOffset); var p2 = cur + nextOffset; // (Vector2) (cur + nextOffset); var p3 = next + nextOffset; // (Vector2) (next + nextOffset); var p4 = pre - preOffset; // (Vector2) (pre - preOffset); var p5 = cur - preOffset; // (Vector2) (cur - preOffset); var p6 = cur - nextOffset; // (Vector2) (cur - nextOffset); var p7 = next - nextOffset; // (Vector2) (next - nextOffset); var preLength = Vector3.Distance(cur, pre); var nextLength = Vector3.Distance(next, cur); int size = vertices.Count; if (size != 0 && CGAlgorithm.Intersect2D_2Segments(p0, p1, p2, p3, out I0, out I1) > 0) { int interIndex = size - 2; vertices [interIndex] = I0; vertices.AddRange(new Vector3 [] { p6, I0, p3, p7 }); triangles.AddRange(new int [] { size, size + 2, size + 1, size, size + 3, size + 2, size - 1, size, interIndex }); } else if (size != 0 && CGAlgorithm.Intersect2D_2Segments(p4, p5, p6, p7, out I2, out I3) > 0) { int interIndex = size - 1; vertices [interIndex] = I2; vertices.AddRange(new Vector3 [] { I2, p2, p3, p7 }); triangles.AddRange(new int [] { size, size + 2, size + 1, size, size + 3, size + 2, interIndex, size + 1, size - 2 }); } else { vertices.AddRange(new Vector3 [] { p6, p2, p3, p7 }); triangles.AddRange(new int [] { size, size + 2, size + 1, size, size + 3, size + 2 }); } var preUVX = UVX; UVX += nextLength / width; uv.AddRange(new Vector2 [] { new Vector2(preUVX, 0), new Vector2(preUVX, 1), new Vector2(UVX, 1), new Vector2(UVX, 0) }); normals.AddRange(new Vector3 [] { Vector3.back, Vector3.back, Vector3.back, Vector3.back }); tangents.AddRange(new Vector4 [] { new Vector4(-1, 0, 0, -1), new Vector4(-1, 0, 0, -1), new Vector4(-1, 0, 0, -1), new Vector4(-1, 0, 0, -1) }); } Vertices = vertices.ToArray( ); Triangles = triangles.ToArray( ); UV = uv.ToArray( ); Normals = normals.ToArray( ); Tangents = tangents.ToArray( ); }