// public Vector3 GetVelocity (float t) { // int i; // if (t >= 1f) { // t = 1f; // i = points.Length - 4; // } // else { // t = Mathf.Clamp01(t) * CurveCount; // i = (int)t; // t -= i; // i *= 3; // } // return Bezier.GetFirstDerivative(points[i], points[i + 1], points[i + 2], points[i + 3], t); //} //public Vector3 GetDirection (float t) { // return GetVelocity(t).normalized; //} // public void AddCurve(Vector3 firstControlPoint, Vector3 secondControlPoint, Vector3 dst) // { // Array.Resize(ref points, points.Length + 3); // points[points.Length - 3] = firstControlPoint; // points[points.Length - 2] = firstControlPoint; // points[points.Length - 1] = dst; // Array.Resize(ref modes, modes.Length + 1); // modes[modes.Length - 1] = modes[modes.Length - 2]; // EnforceMode(points.Length - 4); // if (loop) // { // points[points.Length - 1] = points[0]; // modes[modes.Length - 1] = modes[0]; // EnforceMode(0); // } // } public void AddPath(IPath walker) { var wrapper = new WalkerWrapper(walker); walkers.Add(wrapper); calculateTimeSegments(); }
/* * Expects a value between 0-1 */ public Vector3 GetPoint(float progressPercentage) { WalkerWrapper current = WalkerForTime(progressPercentage); progressPercentage = (progressPercentage - current.startTime) / (current.endTime - current.startTime); return(current.walker.GetPoint(progressPercentage)); }
private void calculateTimeSegments() { WalkerWrapper prev = walkers[0]; prev.endTime = 0f; for (int i = 0; i < walkers.Count; ++i) { var walker = walkers[i]; walker.startTime = prev.endTime; walker.endTime = walker.startTime + walker.walker.Distance / walker.walker.Speed; prev = walker; } NormalizeSegmentTimes(); }
//private void EnforceMode (int index) // { // int modeIndex = (index + 1) / 3; // BezierControlPointMode mode = modes[modeIndex]; // if (mode == BezierControlPointMode.Free || !loop && (modeIndex == 0 || modeIndex == modes.Length - 1)) { // return; // } // int middleIndex = modeIndex * 3; // int fixedIndex, enforcedIndex; // if (index <= middleIndex) { // fixedIndex = middleIndex - 1; // if (fixedIndex < 0) { // fixedIndex = points.Length - 2; // } // enforcedIndex = middleIndex + 1; // if (enforcedIndex >= points.Length) { // enforcedIndex = 1; // } // } // else { // fixedIndex = middleIndex + 1; // if (fixedIndex >= points.Length) { // fixedIndex = 1; // } // enforcedIndex = middleIndex - 1; // if (enforcedIndex < 0) { // enforcedIndex = points.Length - 2; // } // } // Vector3 middle = points[middleIndex]; // Vector3 enforcedTangent = middle - points[fixedIndex]; // if (mode == BezierControlPointMode.Aligned) { // enforcedTangent = enforcedTangent.normalized * Vector3.Distance(middle, points[enforcedIndex]); // } // points[enforcedIndex] = middle + enforcedTangent; //} private Vector3 GetPoint(WalkerWrapper walker, float relativeTime) { return(walker.walker.GetPoint(relativeTime)); }