void drawTracks(BallTrackData activeBallData) { List <VertexPositionColor> vertices = new List <VertexPositionColor>(); var baseTime = activeBallData.Frames.First().Time; var end = DateTime.Now.AddSeconds(1); for (DateTime t = baseTime; t < end; t = t.AddSeconds(0.01f)) { var pos = realToScreen3d(activeBallData.ProjFit.PredictPos(t).ToV3()); vertices.Add(new VertexPositionColor(pos, Color.Red)); } var varr = vertices.ToArray(); var indices = Enumerable.Range(0, varr.Length).ToArray(); lineEffect.World = Matrix.Identity; lineEffect.View = camera.View; lineEffect.Projection = camera.Projection; lineEffect.VertexColorEnabled = true; foreach (EffectPass pass in lineEffect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawUserIndexedPrimitives <VertexPositionColor>(PrimitiveType.LineStrip, varr, 0, varr.Length, indices, 0, varr.Length - 1); } }
void drawTracksFancy(BallTrackData activeBallData) { List <VertexPositionColor>[] vertices = new List <VertexPositionColor> [5]; for (int i = 0; i < vertices.Length; i++) { vertices[i] = new List <VertexPositionColor>(); } int numTrails = vertices.Length - 1; var rad = activeBallData.Frames.Last().Ball.Radius; var baseTime = activeBallData.Frames.First().Time; var end = DateTime.Now.AddSeconds(0.5); for (DateTime t = baseTime; t < end; t = t.AddSeconds(0.01f)) { var pos = realToScreen3d(activeBallData.ProjFit.PredictPos(t).ToV3()); var posNext = realToScreen3d(activeBallData.ProjFit.PredictPos(t.AddSeconds(0.01f)).ToV3()); Color c; if (t < DateTime.Now) { c = Color.LimeGreen; } else { c = Color.Red; } for (int i = 0; i < numTrails; i++) { var dir = Vector3.Normalize(posNext - pos); var u = Vector3.Normalize(Vector3.Cross(dir, Vector3.UnitY)); var v = Vector3.Normalize(Vector3.Cross(u, dir)); var theta = (2 * Math.PI / numTrails * i); var disp = (float)Math.Sin(theta) * u + (float)Math.Cos(theta) * v; var posMod = pos + disp * rad; vertices[i].Add(new VertexPositionColor(posMod, c)); } vertices[vertices.Length - 1].Add(new VertexPositionColor(pos, Color.Red)); } var indices = Enumerable.Range(0, vertices[0].Count()).ToArray(); lineEffect.World = Matrix.Identity; lineEffect.View = camera.View; lineEffect.Projection = camera.Projection; lineEffect.VertexColorEnabled = true; foreach (EffectPass pass in lineEffect.CurrentTechnique.Passes) { pass.Apply(); foreach (var verts in vertices) { var varr = verts.ToArray(); GraphicsDevice.DrawUserIndexedPrimitives <VertexPositionColor>(PrimitiveType.LineStrip, varr, 0, varr.Length, indices, 0, varr.Length - 1); } } }