private void DrawHermitePrediction() { Gizmos.color = Color.cyan; Gizmos.DrawRay(_oldState.Position, _oldState.Velocity); Gizmos.DrawRay(_newState.Position, _newState.Velocity); Gizmos.color = Color.blue; int res = 32; Vector3[] points = new Vector3[res]; for (int i = 0; i < res; i++) { float t = Mathf.Lerp(_predictStart, _predictEnd, i / (float)res); Vector3 p0 = _oldState.Position; Vector3 p1 = _oldState.Position + _oldState.Velocity; Vector3 p2 = _newState.Position + _newState.Velocity * t + 0.5f * _newState.Acceleration * (t * t); Vector3 p3 = p2 - _newState.Velocity + _newState.Acceleration * t; points[i] = SplineUtil.Hermite(p0, p1, p2, p3, 1.0f); } for (int i = 0; i < points.Length - 1; i++) { Gizmos.DrawLine(points[i], points[i + 1]); } }
private void DrawHermite() { Gizmos.color = Color.cyan; Gizmos.DrawRay(_oldState.Position, _oldState.Velocity); Gizmos.DrawRay(_newState.Position, _newState.Velocity); Vector3 p0 = _oldState.Position; Vector3 p1 = _oldState.Position + _oldState.Velocity; Vector3 p2 = _newState.Position + _newState.Velocity * _predictEnd + 0.5f * _newState.Acceleration * (_predictEnd * _predictEnd); Vector3 p3 = p2 - _newState.Velocity + _newState.Acceleration * _predictEnd; Gizmos.color = Color.blue; int res = 16; for (int i = 0; i < res; i++) { float tA = i / (float)(res - 1); float tB = i / (float)(res); Vector3 pointA = SplineUtil.Hermite(p0, p1, p2, p3, tA); Vector3 pointB = SplineUtil.Hermite(p0, p1, p2, p3, tB); Gizmos.DrawLine(pointA, pointB); } }
private void RecomputeSlopes() { if (cps.Count == 3) { for (int i = 1; i < cps.Count; i++) { ms[i] = (SplineUtil.finiteDiffSlope2D(i, cps)); } } else { for (int i = 0; i < cps.Count; i++) { ms[i] = (SplineUtil.finiteDiffSlope2D(i, cps)); } } }
public SmoothBrush(Vector2 start, float size, float step, PaintableObject obj) { cps = new List <Vector2> (); ms = new List <Vector2> (); sizes = new List <float> (); dots = new List <Transform> (); this.stepSize = step; this.obj = obj; cps.Add(start); // dummy cp cps.Add(start + new Vector2(.001f, 0)); ms.Add(SplineUtil.finiteDiffSlope2D(0, cps)); ms.Add(SplineUtil.finiteDiffSlope2D(1, cps)); sizes.Add(size); sizes.Add(size); }
private void testNus2() { CadFigureNurbsSurface nfig = (CadFigureNurbsSurface)Controller.DB.NewFigure(CadFigure.Types.NURBS_SURFACE); int ucnt = 4; int vcnt = 4; VertexList vl = SplineUtil.CreateBoxControlPoints( ucnt, vcnt, Vector3d.UnitX * 20.0, Vector3d.UnitZ * 20.0, Vector3d.UnitY * -20.0); nfig.Setup(2, ucnt * 2, vcnt, vl, null, 16, 16, false, false, true, true); Controller.CurrentLayer.AddFigure(nfig); RunOnMainThread(() => { Controller.UpdateObjectTree(true); }); }
public List <Vector3> GetPath(PathNeuronNode start) { List <Vector3> path = new List <Vector3>(); path.Add(node1.transform.position); foreach (PathTendrilNode node in tendril.pathTendrilNodes) { path.Add(node.transform.position); } path.Add(node2.transform.position); if (node1 != start) { path.Reverse(); } path = SplineUtil.GenerateSpline(path, 5); // add endpoint path.Add((start == node1 ? node2: node1).transform.position); return(path); }
public void UpdateStroke() { // draw the finalized dots to the texture if (cps.Count > 3) { for (int i = numFinalDots; i < dots.Count; i++) { FreeDot(dots [i].gameObject); } TexturePainter.singleton.RenderCanvas(obj, false); TexturePainter.singleton.SaveTexture(obj); cps.RemoveAt(0); ms.RemoveAt(0); sizes.RemoveAt(0); dots.Clear(); } else { for (int i = 0; i < dots.Count; i++) { FreeDot(dots [i].gameObject); } dots.Clear(); } RecomputeSlopes(); for (int i = 0; i < cps.Count - 1; i++) { Vector2 cp0 = cps [i]; Vector2 cp1 = cps [i + 1]; Vector2 m0 = ms [i]; Vector2 m1 = ms [i + 1]; Vector2 d = cp1 - cp0; Vector2 p = cp0; float s0 = sizes [i]; float s1 = sizes [i + 1]; float ss = stepSize * Mathf.Min(s0, s1); float texScaleMult = 1F / Mathf.Min(obj.texScale.x, obj.texScale.y); int numSteps = Mathf.FloorToInt(texScaleMult * d.magnitude / ss); d = ss * d.normalized / texScaleMult; float t = 0; float dt = 1.0f / numSteps; if (i == 0) { numFinalDots = numSteps; } // first add dot at cp0 dots.Add(TexturePainter.singleton.MakeDot(obj, cp0, s0).transform); // start at 1 bc we already did cp0 for (int j = 1; j < numSteps; j++) { p += d; t += dt; Vector2 pos = SplineUtil.evalSpline2D(p, cp0, cp1, m0, m1); float size = SplineUtil.lerp1D(t, s0, s1); GameObject newDot = TexturePainter.singleton.MakeDot(obj, pos, size); dots.Add(newDot.transform); } } }
public void AddCP(Vector2 p, float size) { cps.Add(p); ms.Add(SplineUtil.finiteDiffSlope2D(cps.Count - 1, cps)); sizes.Add(size); }