/// <summary> /// Add a key point at a specified index /// </summary> /// <param name="index">The index at which the key point will be added</param> /// <returns>The new key point</returns> public BezierPoint3D AddKeyPointAt(int index) { BezierPoint3D newPoint = new GameObject("Point " + this.KeyPoints.Count, typeof(BezierPoint3D)).GetComponent <BezierPoint3D>(); newPoint.Curve = this; newPoint.transform.parent = this.transform; newPoint.transform.localRotation = Quaternion.identity; if (this.KeyPointsCount == 0 || this.KeyPointsCount == 1) { newPoint.LocalPosition = Vector3.zero; } else { if (index == 0) { newPoint.Position = (this.KeyPoints[0].Position - this.KeyPoints[1].Position).normalized + this.KeyPoints[0].Position; } else if (index == this.KeyPointsCount) { newPoint.Position = (this.KeyPoints[index - 1].Position - this.KeyPoints[index - 2].Position).normalized + this.KeyPoints[index - 1].Position; } else { newPoint.Position = BezierCurve3D.GetPointOnCubicCurve(0.5f, this.KeyPoints[index - 1], this.KeyPoints[index]); } } this.KeyPoints.Insert(index, newPoint); return(newPoint); }
/// <summary> /// Evaluates a position along the curve at a specified normalized time [0, 1] /// </summary> /// <param name="time">The normalized length at which we want to get a position [0, 1]</param> /// <returns>The evaluated Vector3 position</returns> public Vector3 GetPoint(float time) { // The evaluated points is between these two points BezierPoint3D startPoint; BezierPoint3D endPoint; float timeRelativeToSegment; this.GetCubicSegment(time, out startPoint, out endPoint, out timeRelativeToSegment); return(BezierCurve3D.GetPointOnCubicCurve(timeRelativeToSegment, startPoint, endPoint)); }
private static BezierPoint3D AddKeyPointAt(BezierCurve3D curve, int index) { BezierPoint3D newPoint = new GameObject("Point " + curve.KeyPointsCount, typeof(BezierPoint3D)).GetComponent <BezierPoint3D>(); newPoint.transform.parent = curve.transform; newPoint.transform.localRotation = Quaternion.identity; newPoint.Curve = curve; if (curve.KeyPointsCount == 0 || curve.KeyPointsCount == 1) { newPoint.LocalPosition = Vector3.zero; } else { if (index == 0) { newPoint.Position = (curve.KeyPoints[0].Position - curve.KeyPoints[1].Position).normalized + curve.KeyPoints[0].Position; } else if (index == curve.KeyPointsCount) { newPoint.Position = (curve.KeyPoints[index - 1].Position - curve.KeyPoints[index - 2].Position).normalized + curve.KeyPoints[index - 1].Position; } else { newPoint.Position = BezierCurve3D.GetPointOnCubicCurve(0.5f, curve.KeyPoints[index - 1], curve.KeyPoints[index]); } } Undo.IncrementCurrentGroup(); Undo.RegisterCreatedObjectUndo(newPoint.gameObject, "Create Point"); Undo.RegisterCompleteObjectUndo(curve, "Save Curve"); curve.KeyPoints.Insert(index, newPoint); RenamePoints(curve); //Undo.RegisterCompleteObjectUndo(curve, "Save Curve"); return(newPoint); }