You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.5 KiB
3.5 KiB
SOI Bug Fix and Dynamic Orbital Rendering (2026-01-05)
Changes Made
Core Bug Fixes
- Fixed SOI calculation bug: was using current distance instead of orbital semi_major_axis
- Caused incorrect SOI radii for eccentric orbits (e.g., comet at perihelion vs aphelion)
- Now properly uses stored orbital parameter from config file
- Added parent change tracking to headless simulation mode for debugging SOI transitions
Test Refactoring
- Refactored test to use same code path as simulation via
load_system_config()- Eliminated ~30 lines of manual body setup in test
- Ensures test and simulation behave identically
- Added
config_loader.cppto test build dependencies - Refactored verbose test output into separate functions with compile-time flag
- Added
COMET_TEST_VERBOSE_OUTPUTflag (default: 0) - Moved output to
print_orbital_snapshots()andprint_parent_changes()
- Added
Graphics Enhancements
- Implemented dynamic orbital rendering with real-time element calculation
- Orbits now update automatically when parent body changes
- Calculates orbital elements from current position/velocity relative to parent
- Added support for parabolic trajectories (e ≈ 1)
- Limited to ±86° from periapsis to avoid infinite vertices
- Added support for hyperbolic trajectories (e > 1)
- Limited to asymptotic angle to avoid infinite vertices
- Properly orients orbits in 3D space using eccentricity vector and angular momentum
Code Structure
Refactored renderer for separation of concerns:
OrbitalBasisstruct - Holds orbital reference framecalculate_orbital_basis()- Computes periapsis direction, normal, and perpendicular vectorsorbital_to_cartesian()- Transforms 2D orbital coordinates to 3D spacedraw_orbit_segment()- Handles rendering of individual line segmentsrender_elliptical_orbit()- Draws closed elliptical paths (100 segments)render_hyperbolic_orbit()- Draws open hyperbolic/parabolic paths (60 segments)
Test Configuration
Enhanced configs/test_simple.txt with diverse orbit examples:
- Parabolic object (e=1.0 at 0.5 AU, exactly at escape velocity)
- Inclined asteroid (circular orbit with 30° inclination)
- Hyperbolic visitor (e=1.5, interstellar trajectory)
Commits
89931c3Fix SOI calculation and orbit direction bugs8e21f71Refactor test to use same code path as simulation232614dRevert cross product direction in config_loader4a313f8remove extra debugging not added by claude (user commit)c613d21Refactor verbose test output to separate functions060ff40Add dynamic orbital rendering with hyperbolic/parabolic supporte1df0b4Add diverse orbit examples to test_simple config
Results
7 files changed, +209/-106 (net +103 lines)
Key Findings
- Simulation and test now show identical behavior (parent change Sun→Mars at day 1532)
- Comet enters Mars's SOI at 0.003787 AU (just within 0.003792 AU SOI radius)
- Comet is ejected from solar system after Mars encounter (ends at 58.7 AU with e=1.0)
- Renderer now correctly displays elliptical, parabolic, and hyperbolic trajectories
- Orbits update dynamically when gravitational parent changes
Test Results
All tests passing (21 assertions in 5 test cases) ✓
Outstanding Issues
- Comet remains Mars's child after leaving Mars's SOI
find_dominant_body()doesn't check if body is still within current parent's SOI- Should switch back to grandparent (Sun) when exiting child SOI
- Results in comet staying as Mars-relative even after ejection