private void BezierQuadraticTest(MyVector3 posA, MyVector3 posB, MyVector3 handle) { //Store the interpolated values so we later can display them List <Vector3> interpolatedValues = new List <Vector3>(); //Loop between 0 and 1 in steps, where 1 step is minimum //So if steps is 5 then the line will be cut in 5 sections int steps = 10; float stepSize = 1f / (float)steps; float t = 0f; //+1 becuase wa also have to include the first point for (int i = 0; i < steps + 1; i++) { //Debug.Log(t); MyVector3 interpolatedValue = BezierQuadratic.GetPosition(posA, posB, handle, t); interpolatedValues.Add(interpolatedValue.ToVector3()); t += stepSize; } //Display the curve DisplayInterpolation.DisplayCurve(interpolatedValues, useRandomColor: true); //Display the start and end values and the handle points DisplayInterpolation.DisplayHandle(handle.ToVector3(), posA.ToVector3()); DisplayInterpolation.DisplayHandle(handle.ToVector3(), posB.ToVector3()); //Display other related data //Get the forwrd dir of the point at t and display it MyVector3 forwardDir = BezierQuadratic.GetTangent(posA, posB, handle, tSliderValue); MyVector3 slidePos = BezierQuadratic.GetPosition(posA, posB, handle, tSliderValue); Gizmos.color = Color.blue; Gizmos.DrawRay(slidePos.ToVector3(), forwardDir.ToVector3()); Gizmos.color = Color.red; Gizmos.DrawWireSphere(slidePos.ToVector3(), 0.15f); }
private void BezierQuadraticTest_EqualSteps(MyVector3 posA, MyVector3 posB, MyVector3 handle) { //Create a curve which is the data structure used in the following calculations BezierQuadratic bezierQuadratic = new BezierQuadratic(posA, posB, handle); //Step 1. Calculate the length of the entire curve //This is needed to so we know how long we should walk each step float lengthNaive = InterpolationHelpMethods.GetLength_Naive(bezierQuadratic, steps: 20, tEnd: 1f); float lengthExact = InterpolationHelpMethods.GetLength_SimpsonsRule(bezierQuadratic, tStart: 0f, tEnd: 1f); //Debug.Log("Naive length: " + lengthNaive + " Exact length: " + lengthExact); //Step 2. Convert the t's to be percentage along the curve //Save the accurate t at each position on the curve List <float> accurateTs = new List <float>(); int steps = 5; //Important not to confuse this with the step size we use to iterate t //This step size is distance in m float length = lengthNaive; float lengthStepSize = length / (float)steps; float stepSize = 1f / (float)steps; float t = 0f; float distanceTravelled = 0f; for (int i = 0; i < steps + 1; i++) { //MyVector3 inaccuratePos = bezierCubic.GetInterpolatedValue(t); //Calculate t to get to this distance //Method 1 //float accurateT = InterpolationHelpMethods.Find_t_FromDistance_Iterative(bezierQuadratic, distanceTravelled, length); //Method 2 float accurateT = InterpolationHelpMethods.Find_t_FromDistance_Lookup(bezierQuadratic, distanceTravelled, accumulatedDistances: null); accurateTs.Add(accurateT); //Test that the derivative calculations are working //float dEst = InterpolationHelpMethods.EstimateDerivative(bezierQuadratic, t); //float dAct = bezierQuadratic.GetDerivative(t); //Debug.Log("Estimated derivative: " + dEst + " Actual derivative: " + dAct); //Debug.Log("Distance " + distanceTravelled); //Move on to next iteration distanceTravelled += lengthStepSize; t += stepSize; } //Get the data we want from the curve //Store the interpolated values so we later can display them List <Vector3> actualPositions = new List <Vector3>(); // List <Vector3> tangents = new List <Vector3>(); //Orientation, which includes the tangent and position List <InterpolationTransform> orientations = new List <InterpolationTransform>(); for (int i = 0; i < accurateTs.Count; i++) { float accurateT = accurateTs[i]; MyVector3 actualPos = bezierQuadratic.GetPosition(accurateT); actualPositions.Add(actualPos.ToVector3()); MyVector3 tangent = bezierQuadratic.GetTangent(accurateT); tangents.Add(tangent.ToVector3()); //Orientation, which includes both position and tangent InterpolationTransform orientation = InterpolationTransform.GetTransform_UpRef(bezierQuadratic, accurateT, MyVector3.Up); orientations.Add(orientation); } //Display //Unity doesnt have a built-in method to display an accurate Qudratic bezier, so we have to create our own //DisplayInterpolation.DisplayBezierQuadratic(bezierQuadratic, Color.black); DisplayInterpolation.DisplayCurve(bezierQuadratic, Color.black); //DisplayInterpolation.DisplayCurve(actualPositions, useRandomColor: true); DisplayInterpolation.DisplayCurve(actualPositions, Color.gray); //Display the start and end values and the handle points DisplayInterpolation.DisplayHandle(handle.ToVector3(), posA.ToVector3()); DisplayInterpolation.DisplayHandle(handle.ToVector3(), posB.ToVector3()); //Stuff on the curve //DisplayInterpolation.DisplayDirections(actualPositions, tangents, 1f, Color.red); DisplayInterpolation.DisplayOrientations(orientations, 1f); }