private void NewtonianMotionStep(double deltaTime) { // Newtonian motion type: for (int i = 0; i < Bodies.Count; i++) { if (!Bodies[i].isActiveAndEnabled || Bodies[i].IsFixedPosition || Bodies[i].UseKeplerMotion && Bodies[i].IsKeplerMotion) { continue; } if (double.IsInfinity(Bodies[i].Velocity.x) || double.IsNaN(Bodies[i].Velocity.x)) { Debug.Log("SpaceGravity2D: Velocity is " + (double.IsNaN(Bodies[i].Velocity.x) ? "NaN !" : "INF !") + "\nbody: " + name); Bodies[i].Velocity = new Vector3d(); } switch (CalculationType) { case NBodyCalculationType.Euler: CelestialBodyUtils.CalcAccelerationEulerForBody(Bodies[i], deltaTime, MinAttractionRange, MaxAttractionRange, _attractorsCache); if (!Bodies[i].AdditionalVelocity.isZero) { Bodies[i].Velocity += Bodies[i].AdditionalVelocity; Bodies[i].AdditionalVelocity = Vector3d.zero; } if (double.IsInfinity(Bodies[i].Velocity.x) || double.IsNaN(Bodies[i].Velocity.x)) { Bodies[i].Velocity = new Vector3d(); } Bodies[i].Position = Bodies[i].Position + Bodies[i].Velocity * deltaTime; break; case NBodyCalculationType.Verlet: Bodies[i].Position += Bodies[i].Velocity * (deltaTime / 2d); CelestialBodyUtils.CalcAccelerationEulerForBody(Bodies[i], deltaTime, MinAttractionRange, MaxAttractionRange, _attractorsCache); if (!Bodies[i].AdditionalVelocity.isZero) { Bodies[i].Velocity += Bodies[i].AdditionalVelocity; Bodies[i].AdditionalVelocity = Vector3d.zero; } if (double.IsInfinity(Bodies[i].Velocity.x) || double.IsNaN(Bodies[i].Velocity.x)) { Bodies[i].Velocity = new Vector3d(); } Bodies[i].Position += Bodies[i].Velocity * (deltaTime / 2d); break; case NBodyCalculationType.RungeKutta: CelestialBodyUtils.CalcAccelerationRungeKuttaForBody(Bodies[i], deltaTime, MinAttractionRange, MaxAttractionRange, _attractorsCache); if (!Bodies[i].AdditionalVelocity.isZero) { Bodies[i].Velocity += Bodies[i].AdditionalVelocity; Bodies[i].AdditionalVelocity = Vector3d.zero; } if (double.IsInfinity(Bodies[i].Velocity.x) || double.IsNaN(Bodies[i].Velocity.x)) { Bodies[i].Velocity = new Vector3d(); } Bodies[i].Position += Bodies[i].Velocity * deltaTime * 0.5d; break; } Bodies[i].OrbitData.IsDirty = true; if (Bodies[i].UseKeplerMotion) { // Transit to keplerian motion at next frame. Bodies[i].IsKeplerMotion = true; } } }