implement density calculation and HUD gauge

This commit is contained in:
yuni 2024-11-28 03:15:59 +01:00
parent 9cc6d7ea1f
commit b348b3524a
5 changed files with 45 additions and 4 deletions

View file

@ -44,8 +44,10 @@
## Jupiter ## Jupiter
- SRC1: [Thermal structure of Jupiter's atmosphere near the edge of a 5µm hot spot in the north equatorial belt](https://doi.org/10.1029/98JE01766) - SRC1: [Thermal structure of Jupiter's atmosphere near the edge of a 5µm hot spot in the north equatorial belt](https://doi.org/10.1029/98JE01766)
- SRC2: [NASA Jupiter Fact Sheet](https://nssdc.gsfc.nasa.gov/planetary/factsheet/jupiterfact.html)
- SRC3: ["THE INTERIORS OF JUPITER AND SATURN" by Ravit Helled](https://arxiv.org/pdf/1812.07436)
Based on Table 8 from SRC1: Based on Table 8 from SRC1, with additional values for altitude=0 from SRC2 and interior density values from SRC3:
| Altitude (km) | Pressure (bar) | Temperature (K) | Density (kg/m³) | | Altitude (km) | Pressure (bar) | Temperature (K) | Density (kg/m³) |
| ------------- | -------------- | --------------- | --------------- | | ------------- | -------------- | --------------- | --------------- |
@ -101,7 +103,10 @@ Based on Table 8 from SRC1:
| 60 | 4.37E-02 | 122.6 | 0.009915 | | 60 | 4.37E-02 | 122.6 | 0.009915 |
| 40 | 1.36E-01 | 113.2 | 0.03335 | | 40 | 1.36E-01 | 113.2 | 0.03335 |
| 23.3 | 3.52E-01 | 122.9 | 0.07945 | | 23.3 | 3.52E-01 | 122.9 | 0.07945 |
| 0 | 1 | | | | 0 | 1 | 165 | 0.16 |
| -62000 | ? | ? | 4500 |
| -62500 | ? | ? | 20000 |
| -70000 | ? | ? | 25000 |
### Regression analysis ### Regression analysis
@ -112,12 +117,20 @@ Pressure:
- 0km-200km: `p[bar](x[m]) = exp(-0.0020248515 - 0.0000454102 * x)` - 0km-200km: `p[bar](x[m]) = exp(-0.0020248515 - 0.0000454102 * x)`
- <0km: `p[bar](x[m]) = -(1.45773e-16) * x^3 + 1` (low-effort cubic regression on `[(-70000km, 50Mbar), (0m, 1bar)]`) - <0km: `p[bar](x[m]) = -(1.45773e-16) * x^3 + 1` (low-effort cubic regression on `[(-70000km, 50Mbar), (0m, 1bar)]`)
Density:
- 500km-1029.2km: `rho[kg/m³](x[m]) = exp(-15.98781474626208 - 0.00000816092074*x)`
- 200km-500km: `rho[kg/m³](x[m]) = exp(-4.22487505187567 - 0.00003251947782*x)`
- 0km-200km: `rho[kg/m³](x[m]) = exp(-1.83275074106303 - 0.00004486861245*x)`
- -62000km-0km: `rho[kg/m³](x[m]) = -0.0725781*x + 0.16` (linear regression)
- -70000km-62000km: `rho[kg/m³](x[m]) = 25000.0 / (1 + exp(0.00580528 * x + 361.44394)))` (logistic regression)
### Designing the in-game atmosphere ### Designing the in-game atmosphere
New mechanics: New mechanics:
- [ ] Ambient Pressure - [X] Ambient Pressure
- [ ] Depends on altitude - [X] Depends on altitude
- [ ] Temperature - [ ] Temperature
- [ ] Ambient temperature - [ ] Ambient temperature
- [ ] Space suit temperature - [ ] Space suit temperature
@ -142,6 +155,7 @@ Relations between mechanics:
- [ ] Death at pressure of ~400 bar through implosion (depending on vehicle) - [ ] Death at pressure of ~400 bar through implosion (depending on vehicle)
- [ ] Death at high temperatures through continuous damage when temperature exceeds 60°C - [ ] Death at high temperatures through continuous damage when temperature exceeds 60°C
- [ ] Hydrogen + Oxygen = Water, used for evaporative cooling (works only at right pressure/temperature) - [ ] Hydrogen + Oxygen = Water, used for evaporative cooling (works only at right pressure/temperature)
- [ ] Refill Hydrogen inside Jupiter's atmosphere
## Io ## Io

View file

@ -1166,8 +1166,10 @@ fn handle_atmosphere(
} }
if player.is_some() { if player.is_some() {
let density = nature::jupiter_altitude_to_density(distance);
settings.atmo_pressure = Some(pressure); settings.atmo_pressure = Some(pressure);
settings.atmo_altitude = Some(distance - nature::JUPITER_RADIUS); settings.atmo_altitude = Some(distance - nature::JUPITER_RADIUS);
settings.atmo_density = Some(density);
reset_player_gauges = false; reset_player_gauges = false;
} }
@ -1187,5 +1189,6 @@ fn handle_atmosphere(
if reset_player_gauges { if reset_player_gauges {
settings.atmo_pressure = None; settings.atmo_pressure = None;
settings.atmo_altitude = None; settings.atmo_altitude = None;
settings.atmo_density = None;
} }
} }

View file

@ -877,6 +877,9 @@ fn update_speedometer(
if let Ok(mut speed_text) = q_node_speed.get_single_mut() { if let Ok(mut speed_text) = q_node_speed.get_single_mut() {
// Atmospheric conditions // Atmospheric conditions
let mut atmo = String::new(); let mut atmo = String::new();
if let Some(val) = settings.atmo_density {
atmo += format!("dens: {}g/m³\n", nature::readable_si(val*1000.0)).as_str();
}
if let Some(val) = settings.atmo_altitude { if let Some(val) = settings.atmo_altitude {
atmo += format!("alt: {}m\n", nature::readable_si(val)).as_str(); atmo += format!("alt: {}m\n", nature::readable_si(val)).as_str();
} }

View file

@ -297,6 +297,7 @@ pub fn format_seconds_to_hour_min(seconds: f64) -> String {
} }
pub fn jupiter_altitude_to_pressure(altitude: f64) -> f64 { pub fn jupiter_altitude_to_pressure(altitude: f64) -> f64 {
// Units: meter (relative to 1-bar "surface") -> bar
// See doc/research.md // See doc/research.md
let x = altitude - JUPITER_RADIUS; let x = altitude - JUPITER_RADIUS;
if x >= 1030e3 { if x >= 1030e3 {
@ -310,3 +311,21 @@ pub fn jupiter_altitude_to_pressure(altitude: f64) -> f64 {
} }
return -(1.45773e-16) * x.powf(3.0) + 1.0; return -(1.45773e-16) * x.powf(3.0) + 1.0;
} }
pub fn jupiter_altitude_to_density(altitude: f64) -> f64 {
// Units: meter (relative to 1-bar "surface") -> kg/(m^3)
// See doc/research.md
let x = altitude - JUPITER_RADIUS;
if x >= 1030e3 {
return 0.0;
} else if x >= 500e3 {
return (-15.98781474626208 - 0.00000816092074 * x).exp();
} else if x >= 200e3 {
return (-4.22487505187567 - 0.00003251947782 * x).exp();
} else if x >= 0.0 {
return (-1.83275074106303 - 0.00004486861245 * x).exp();
} else if x >= -62000e3 {
return -0.0725781 * x + 0.16;
}
return 25000.0 / (1.0 + (0.00580528 * x + 361.44394)).exp();
}

View file

@ -53,6 +53,7 @@ pub struct Settings {
pub zoom_fov: f32, pub zoom_fov: f32,
pub zoom_sensitivity_factor: f32, pub zoom_sensitivity_factor: f32,
pub atmo_pressure: Option<f64>, pub atmo_pressure: Option<f64>,
pub atmo_density: Option<f64>,
pub atmo_altitude: Option<f64>, pub atmo_altitude: Option<f64>,
pub font_size_hud: f32, pub font_size_hud: f32,
pub font_size_fps: f32, pub font_size_fps: f32,
@ -203,6 +204,7 @@ impl Default for Settings {
zoom_fov: 15.0, zoom_fov: 15.0,
zoom_sensitivity_factor: 0.25, zoom_sensitivity_factor: 0.25,
atmo_pressure: None, atmo_pressure: None,
atmo_density: None,
atmo_altitude: None, atmo_altitude: None,
font_size_hud: 24.0, font_size_hud: 24.0,
font_size_fps: 14.0, font_size_fps: 14.0,