4.8 KiB
Here’s a design plan for a Bevy-based Solar System sim with all major planets + major moons (Earth, Mars, Jupiter, Saturn), no asteroids, stable at all time scales, and using a good fixed timestep choice for the fastest orbits.
1. Simulation Scope
Bodies included:
-
Planets: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
-
Moons:
- Earth: Moon
- Mars: Phobos, Deimos
- Jupiter: Io, Europa, Ganymede, Callisto
- Saturn: Titan, Rhea, Iapetus, Dione, Tethys, Enceladus, Mimas (Total ~22 bodies)
No asteroids, no small irregular moons — keeps N small enough for exact N-body.
2. Coordinate & Unit System
Units:
- Distance: AU
- Time: days
- Mass: solar masses
- Constant: G = 2.9591220828559093e-4 AU³ / (M☉·day²)
Precision:
- Simulation:
f64for all positions/velocities. - Rendering:
f32with floating origin.
Reference frame:
- Start in barycentric J2000 ecliptic frame.
- Planets initialized with orbital elements from NASA/JPL Horizons.
- Moons initialized relative to parent planet, then converted to barycentric coordinates.
3. Time Integration Strategy
Base timestep choice
Fastest orbital period in scope:
- Mimas (moon of Saturn) → ~0.942 days per orbit. To get ≥300 steps/orbit for stability:
dt_base = 0.003 days(~4.32 minutes per step)
This works for:
- Mimas: ~314 steps/orbit
- Mercury: ~29,323 steps/orbit
- Outer planets: many more → extremely stable.
Decoupled simulation loop
- Always integrate at
dt_base = 0.003 days. - Convert time scale (days per real second) into number of steps to take per frame.
- At slow speeds: possibly fewer than 1 step/frame (interpolate positions for rendering).
- At high speeds: multiple steps/frame (batched substepping).
4. ECS Structure
Components:
Body: mass, visual radius, color, parent body index (if a moon)State: current position & velocity in AU/dayRenderProxy: used for floating-origin transforms
Resources:
SimParams: G constant, time scale, base dt, paused flagFloatingOrigin: current origin in AU
5. Physics Pipeline (per frame)
-
Determine number of substeps:
sim_days_to_advance = time_scale × real_delta_secondssteps_needed = sim_days_to_advance / dt_base- Loop substeps until all sim_days_to_advance consumed.
-
N-body force calculation:
- O(N²) summation — still trivial for ~22 bodies.
- Double precision for all math.
-
Integrator:
- Symplectic leapfrog (kick–drift–kick).
- Fixed
dt_basein all cases.
-
Floating origin adjustment:
- Choose tracked target (e.g., Earth or camera target).
- Subtract target’s AU position from all bodies before converting to f32 for rendering.
6. Rendering Pipeline
-
Distance compression:
- Use a scale factor (e.g.,
1 AU → 10,000 km visual) so planets aren’t microscopic.
- Use a scale factor (e.g.,
-
Planet size exaggeration:
- Apply large visual radius multiplier for visibility.
-
Orbit trails:
- Store sampled positions in a circular buffer for each body.
-
Lighting:
- One directional light from Sun position.
7. Time Controls
-
Pause/Resume (spacebar)
-
Speed up / Slow down (
[/]) — adjusttime_scale -
Preset speeds:
- 1 min = 1 year
- 1 sec = 1 day (slow motion)
- 1 sec = 10 years (fast forward)
-
Reverse time (optional) — simply invert
time_scale
8. Initialization Plan
-
Gather J2000 orbital elements for all planets and moons (NASA/JPL Horizons).
-
For moons:
- Convert orbital elements relative to parent into Cartesian coordinates (AU, AU/day).
- Add parent planet’s barycentric position/velocity to get barycentric moon state.
-
Store these as starting states in your ECS.
9. Performance Considerations
-
N=22 bodies → no optimization needed beyond O(N²) CPU.
-
At fastest speed (e.g., 1 sec = 1000 years):
- Steps per second =
(1000 × 365.25 days) / 0.003 days≈ 121,750 steps/sec - Must batch steps in a loop inside one Bevy system per frame.
- Limit display FPS to avoid CPU overload (physics can run faster than rendering).
- Steps per second =
10. Validation & Testing
-
Check orbital periods:
- Measure period for Mercury, Earth, Moon, Mimas.
-
Energy drift check:
- Track total system energy & angular momentum over 1,000 years of sim time.
-
Visual comparison:
- Compare planet positions to JPL Horizons output for 10-year window to confirm accuracy.