@ -54,6 +54,10 @@ OrbitTracker* create_orbit_tracker(int body_index) {
tracker - > orbit_completed = false ;
tracker - > orbit_completed = false ;
tracker - > time_at_completion = 0.0 ;
tracker - > time_at_completion = 0.0 ;
tracker - > min_time_days = 100.0 ;
tracker - > min_time_days = 100.0 ;
tracker - > inclination = 0.0 ;
tracker - > longitude_of_ascending_node = 0.0 ;
tracker - > argument_of_periapsis = 0.0 ;
tracker - > has_orbital_elements = false ;
return tracker ;
return tracker ;
}
}
@ -66,6 +70,21 @@ OrbitTracker* create_orbit_tracker_with_min_time(int body_index, double min_time
tracker - > orbit_completed = false ;
tracker - > orbit_completed = false ;
tracker - > time_at_completion = 0.0 ;
tracker - > time_at_completion = 0.0 ;
tracker - > min_time_days = min_time_days ;
tracker - > min_time_days = min_time_days ;
tracker - > inclination = 0.0 ;
tracker - > longitude_of_ascending_node = 0.0 ;
tracker - > argument_of_periapsis = 0.0 ;
tracker - > has_orbital_elements = false ;
return tracker ;
}
OrbitTracker * create_orbit_tracker_3d ( int body_index , double min_time_days ,
double inclination , double lon_ascending_node ,
double argument_of_periapsis ) {
OrbitTracker * tracker = create_orbit_tracker_with_min_time ( body_index , min_time_days ) ;
tracker - > inclination = inclination ;
tracker - > longitude_of_ascending_node = lon_ascending_node ;
tracker - > argument_of_periapsis = argument_of_periapsis ;
tracker - > has_orbital_elements = true ;
return tracker ;
return tracker ;
}
}
@ -81,7 +100,21 @@ void update_orbit_tracker(OrbitTracker* tracker, CelestialBody* body, CelestialB
if ( tracker - > orbit_completed ) return ;
if ( tracker - > orbit_completed ) return ;
Vec3 relative_pos = vec3_sub ( body - > global_position , parent - > global_position ) ;
Vec3 relative_pos = vec3_sub ( body - > global_position , parent - > global_position ) ;
double current_angle = atan2 ( relative_pos . y , relative_pos . x ) ;
double current_angle ;
if ( tracker - > has_orbital_elements ) {
Mat3 rotation = mat3_rotation_orbital ( tracker - > argument_of_periapsis ,
tracker - > inclination ,
tracker - > longitude_of_ascending_node ) ;
// Transpose to get inverse rotation (back to orbital plane)
Mat3 rotation_T = { rotation . m00 , rotation . m10 , rotation . m20 ,
rotation . m01 , rotation . m11 , rotation . m21 ,
rotation . m02 , rotation . m12 , rotation . m22 } ;
Vec3 pos_orbital = mat3_multiply_vec3 ( rotation_T , relative_pos ) ;
current_angle = atan2 ( pos_orbital . y , pos_orbital . x ) ;
} else {
current_angle = atan2 ( relative_pos . y , relative_pos . x ) ;
}
if ( tracker - > quadrant_transitions = = 0 ) {
if ( tracker - > quadrant_transitions = = 0 ) {
tracker - > initial_angle = current_angle ;
tracker - > initial_angle = current_angle ;