void DisplayCatmullRomSpline(int pos) { //Clamp to allow looping Vector3[] pnt = { points[ClampListPos(pos - 1)].position, points[pos].position, points[ClampListPos(pos + 1)].position, points[ClampListPos(pos + 2)].position }; //Just assign a tmp value to this Vector3 lastPos = Vector3.zero; //t is always between 0 and 1 and determines the resolution of the spline //0 is always at p1 for (float t = 0; t < 1; t += 0.1f) { //Find the coordinates between the control points with a Catmull-Rom spline CatmullRomSpline spline = new CatmullRomSpline(); Vector3 newPos = spline.GetPoint(t, pnt); //Cant display anything the first iteration if (t == 0) { lastPos = newPos; continue; } Gizmos.DrawLine(lastPos, newPos); lastPos = newPos; } //Also draw the last line since it is always less than 1, so we will always miss it Gizmos.DrawLine(lastPos, pnt[2]); }
// Use this for initialization void Start() { Mesh mesh = new Mesh(); CatmullRomSpline spline = new CatmullRomSpline(); Vector3[] pos = new Vector3[points.Count]; Quaternion[] rot = new Quaternion[points.Count]; for (int i = 0; i < points.Count; i++) { pos[i] = points[i].transform.position; rot[i] = points[i].transform.rotation; } Vector3 tangent; for (int i = 0; i < points.Count; i++) { tangent = Vector3.Cross(spline.GetTangent(i, pos), Vector3.forward); if (tangent.magnitude == 0) { tangent = Vector3.Cross(spline.GetTangent(i, pos), Vector3.up); } points[i].transform.rotation = Quaternion.Euler(tangent); } OrientedPoint[] oPoints = new OrientedPoint[(int)(1 / resolution)]; for (float i = 0f; i < 1.0f; i += resolution) { if (i != 0f || i != 1f) { oPoints[(int)i * 10].position = spline.GetPoint(i, pos); tangent = Vector3.Cross(spline.GetTangent(i, pos), Vector3.forward); if (tangent.magnitude == 0) { tangent = Vector3.Cross(spline.GetTangent(i, pos), Vector3.up); } oPoints[(int)i * 10].rotation = Quaternion.Euler(tangent); } } Vector2[] verts = { new Vector2(0, 0), new Vector2(1, 0) }; Vector2[] normals = { new Vector2(0, 1), new Vector2(0, 1) }; int[] lines = { 0, 1 }; Shape shape = new Shape(verts, normals, lines); Extrude extrusao = new Extrude(ref mesh, shape, oPoints); this.GetComponent <MeshFilter>().sharedMesh = mesh; }
private Vector3 ShowPoint(int index) { Vector3 point = t.TransformPoint(spline.GetPoint(index)); float firstPoint = index == 0 ? 2f : 1f; if (Handles.Button(point, q, 0.2f * firstPoint, 0.6f, Handles.DotCap)) { selectedIndex = index; } Handles.color = Color.gray; if (selectedIndex == index) { EditorGUI.BeginChangeCheck(); point = Handles.DoPositionHandle(point, q); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(spline, "CatmullRom Moved"); EditorUtility.SetDirty(spline); spline.SetPoint(index, t.InverseTransformPoint(point)); } } return(point); }
public static Vector3 SmoothTravel(this Vector3[] points, float t) { return(CatmullRomSpline.GetPoint(points, t, false)); }
public void OnSceneGUI() { spline = target as CatmullRomSpline; t = spline.transform; q = Tools.pivotRotation == PivotRotation.Local ? t.rotation : Quaternion.identity; /* Draw control points for each curve */ for (int i = 0; i < spline.Curves; i += 3) { Vector3 point0 = ShowPoint(i); Vector3 point1 = ShowPoint(i + 1); Vector3 point2 = ShowPoint(i + 2); Vector3 point3 = ShowPoint(i + 3); Handles.color = Color.gray; Handles.DrawLine(point0, point1); Handles.DrawLine(point1, point2); Handles.DrawLine(point2, point3); } /* Draw the curve */ for (int i = 0; i < spline.ControlPointsCount; ++i) { if ((i == 0 || i >= spline.ControlPointsCount - 2) && !spline.Loop) { continue; } else { int iMinusOne = i - 1, iPlusOne = i + 1, iPlusTwo = i + 2, points = spline.ControlPointsCount; /* We only care on negative values */ if (i == 0) { iMinusOne = spline.ControlPointsCount - 1; } /* Handle the overflow by modding around the array */ iPlusOne = (i + 1) % points; iPlusTwo = (i + 2) % points; Vector3 p0 = t.TransformPoint(spline.GetPoint(iMinusOne)); Vector3 p1 = t.TransformPoint(spline.GetPoint(i)); Vector3 p2 = t.TransformPoint(spline.GetPoint(iPlusOne)); Vector3 p3 = t.TransformPoint(spline.GetPoint(iPlusTwo)); Vector3 startPoint = t.TransformPoint(spline.GetPoint(i)); Handles.color = Color.green; Vector3 endPoint; for (int j = 0; j < steps; ++j) { float norm = j / (float)steps; endPoint = spline.GetCurvePoint(norm, p0, p1, p2, p3); Handles.DrawLine(startPoint, endPoint); startPoint = endPoint; } endPoint = spline.GetCurvePoint(1, p0, p1, p2, p3); Handles.DrawLine(startPoint, endPoint); } } }