void OnDrawGizmos() { if (m_curve == null) { var bezierCurveControlPoints = new List <Point> (); m_curve = new BezierPointCurve(); m_curve.controlPoints = bezierCurveControlPoints; } m_curve.controlPoints.Clear(); foreach (var controlPoint in controlPoints) { m_curve.controlPoints.Add(Point.FromWorldTransform(controlPoint)); } curve = m_curve; if (normalize) { curve = new NormalizedPointCurve(curve); } float pointIndexToT = 1f / pointsCount; for (int i = 0; i < pointsCount; i++) { float tA = i * pointIndexToT; float tB = (i + 1) * pointIndexToT; var pointA = curve.Evaluate(tA); var pointB = curve.Evaluate(tB); Gizmos.DrawLine(pointA.position, pointB.position); Gizmos.DrawWireSphere(pointA.position, 0.01f); } }
public NormalizedPointCurve(IPointCurve m_originalCurve) { this.m_originalCurve = m_originalCurve; float totalLength = 0f; float pointIndexToT = 1f / c_approximationPointsCount; float t = 0f; Point pointB = m_originalCurve.Evaluate(0); Point pointA; // Debug.Log ("begin"); FloatSpline tNormalizerInv = new FloatSpline(); for (int i = 1; i <= c_approximationPointsCount; i++) { t = i * pointIndexToT; pointA = pointB; pointB = m_originalCurve.Evaluate(t); float distanceBetweenPoints = Vector3.Distance(pointA.position, pointB.position); float newTotalLength = totalLength + distanceBetweenPoints; tNormalizerInv.curves.Add(new LinearFloatCurve(totalLength, newTotalLength)); totalLength = newTotalLength; // Debug.Log (totalLength); } float totalLengthInv = 1f / totalLength; // float lastB = 0f; foreach (LinearFloatCurve linearCurve in tNormalizerInv.curves) { linearCurve.a *= totalLengthInv; linearCurve.b *= totalLengthInv; // lastB = linearCurve.b; } var tNormalizerValues = new float[c_approximationPointsCount + 1]; for (int i = 0; i < tNormalizerValues.Length; i++) { tNormalizerValues [i] = FloatSplineMath.FindClosest(tNormalizerInv, i * pointIndexToT); // lastB = tNormalizerValues [i]; } FloatSpline tNormalizer = new FloatSpline(); for (int i = 0; i < tNormalizerValues.Length - 1; i++) { float valA = tNormalizerValues [i]; float valB = tNormalizerValues [i + 1]; var linearCurve = new LinearFloatCurve(valA, valB); // lastB = linearCurve.b; tNormalizer.curves.Add(linearCurve); } // Debug.Log (lastB); m_tNormalizer = tNormalizer; }
void OnDrawGizmos() { var conrolPoints = new List <Point> (); m_controlPoints = new List <Transform> (); for (int i = 0; i < transform.childCount; i++) { m_controlPoints.Add(transform.GetChild(i)); } foreach (var controlPoint in m_controlPoints) { var point = Point.FromWorldTransform(controlPoint); conrolPoints.Add(point); } m_curve = CreateCurve(conrolPoints); if (normalize) { m_curve = new NormalizedPointCurve(m_curve); } float indexToT = 1f / (pointsCount - 1); List <Point> points = new List <Point>(); for (int i = 0; i < pointsCount; i++) { points.Add(m_curve.Evaluate(i * indexToT)); } Gizmos.color = Color.white; for (int i = 0; i < pointsCount - 1; i++) { var pointA = points [i]; var pointB = points[i + 1]; Gizmos.DrawLine(pointA.position, pointB.position); Gizmos.DrawWireSphere(pointA.position, 0.01f); } Gizmos.color = Color.gray; foreach (var point in conrolPoints) { Gizmos.DrawWireSphere(point.position, 0.02f); } }