void Update() { if (Input.GetKeyDown(KeyCode.KeypadPlus)) { var maxSteps = closestApproaches.Count + 1; var ca = PhysicsUtils.ClosestApproach( new PhysicalState { Position = fromVector3(Subject.position), Velocity = subjectVelocity, Acceleration = subjectAcceleration }, new PhysicalState { Position = fromVector3(Target.position), Velocity = targetVelocity, Acceleration = targetAcceleration }, 1.0f, maxSteps ); var dist = ca.x; var tti = ca.y; var fSubject = PhysicsUtils.PredictFutureState(new PhysicalState() { Position = Subject.position, Velocity = subjectVelocity, Acceleration = subjectAcceleration }, tti).Position; var fTarget = PhysicsUtils.PredictFutureState(new PhysicalState() { Position = Target.position, Velocity = targetVelocity, Acceleration = targetAcceleration }, tti).Position; var diffDist = math.distance(fSubject, fTarget); closestApproaches.Add(new ClosestApproachResult() { distance = dist, tti = tti, subjectPosition = fSubject, targetPosition = fTarget, distCheck = diffDist }); Text.text += "\nCD: " + dist + " / DD: " + diffDist; } if (Input.GetKeyDown(KeyCode.Space)) { var lastTti = -1f; for (var maxSteps = 1; maxSteps < 10; maxSteps++) { var intercept = PhysicsUtils.AccelerationToIntercept( new PhysicalState { Position = fromVector3(Subject.position), Velocity = subjectVelocity, Acceleration = subjectAcceleration }, new PhysicalState { Position = fromVector3(Target.position), Velocity = targetVelocity, Acceleration = targetAcceleration }, maxAccMag, 1.0f, maxSteps ); // if (intercept.TimeToIntercept - lastTti < float.Epsilon) break; lastTti = intercept.TimeToIntercept; intercepts.Add(intercept); } } if (Input.GetKeyDown(KeyCode.Return)) { intercepts.Clear(); closestApproaches.Clear(); Text.text = ""; } }