1 changed files with 74 additions and 0 deletions
@ -0,0 +1,74 @@ |
|||||||
|
# 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.cpp` to test build dependencies |
||||||
|
- Refactored verbose test output into separate functions with compile-time flag |
||||||
|
- Added `COMET_TEST_VERBOSE_OUTPUT` flag (default: 0) |
||||||
|
- Moved output to `print_orbital_snapshots()` and `print_parent_changes()` |
||||||
|
|
||||||
|
### 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: |
||||||
|
- `OrbitalBasis` struct - Holds orbital reference frame |
||||||
|
- `calculate_orbital_basis()` - Computes periapsis direction, normal, and perpendicular vectors |
||||||
|
- `orbital_to_cartesian()` - Transforms 2D orbital coordinates to 3D space |
||||||
|
- `draw_orbit_segment()` - Handles rendering of individual line segments |
||||||
|
- `render_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 |
||||||
|
|
||||||
|
- `89931c3` Fix SOI calculation and orbit direction bugs |
||||||
|
- `8e21f71` Refactor test to use same code path as simulation |
||||||
|
- `232614d` Revert cross product direction in config_loader |
||||||
|
- `4a313f8` remove extra debugging not added by claude (user commit) |
||||||
|
- `c613d21` Refactor verbose test output to separate functions |
||||||
|
- `060ff40` Add dynamic orbital rendering with hyperbolic/parabolic support |
||||||
|
- `e1df0b4` Add 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 |
||||||
Loading…
Reference in new issue