place stars at their actual xyz coordinate. (try zooming out in map 🤯)

This commit is contained in:
yuni 2024-04-19 00:42:39 +02:00
parent fca8251f27
commit ea26711806
3 changed files with 15579 additions and 15590 deletions

View file

@ -34,33 +34,34 @@ MAX_APPARENT_MAGNITUDE = 7.0
print("// This file was autogenerated by \"genrate_starchart.py\" using data from the") print("// This file was autogenerated by \"genrate_starchart.py\" using data from the")
print("// HYG database: https://github.com/astronexus/HYG-Database/tree/main/hyg") print("// HYG database: https://github.com/astronexus/HYG-Database/tree/main/hyg")
print("// License: CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/") print("// License: CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/")
print("// Each star's values: (x, y, z, magnitude, color index, distance, name)") print("// Each star's values: (x, y, z, magnitude, absolute magnitude, color index, name)")
print("[") print("[")
def render(ra, dec, mag, ci, dist, name): def render(x, y, z, ra, dec, mag, absmag, ci, dist, name):
# Takes ra/deg in degrees # Takes ra/deg in degrees
ra = float(ra) ra = float(ra)
dec = float(dec) dec = float(dec)
mag = float(mag) mag = float(mag)
x, y, z = float(x), float(y), float(z)
name = re.sub(r'\s+', ' ', name) name = re.sub(r'\s+', ' ', name)
if name == 'Sol': if name == 'Sol':
return return
distance = 1.0 # distance = 1.0
ra_radians = math.radians(ra * 15) # ra is in [0, 24], multiplying by 15 gives degrees in [0, 360] # ra_radians = math.radians(ra * 15) # ra is in [0, 24], multiplying by 15 gives degrees in [0, 360]
dec_radians = math.radians(dec) # dec_radians = math.radians(dec)
#print(f"ra_radians={ra_radians}, dec_radians={dec_radians}, dec={dec}, ra={ra}", file=sys.stderr) # #print(f"ra_radians={ra_radians}, dec_radians={dec_radians}, dec={dec}, ra={ra}", file=sys.stderr)
x = distance * math.cos(dec_radians) * math.cos(-ra_radians) # x = distance * math.cos(dec_radians) * math.cos(-ra_radians)
y = distance * math.cos(dec_radians) * math.sin(-ra_radians) # y = distance * math.cos(dec_radians) * math.sin(-ra_radians)
z = distance * math.sin(dec_radians) # z = distance * math.sin(dec_radians)
#
# Correct for differences in coordinate system axes # # Correct for differences in coordinate system axes
x, y, z = x, z, y # x, y, z = x, z, y
#brightness = 2.512 ** (0 - mag) #brightness = 2.512 ** (0 - mag)
print(f'({x:.04},{y:.04},{z:.04},{mag:.04},{ci},{dist},"{name}"),') print(f'({x:.04},{y:.04},{z:.04},{mag:.04},{absmag:.04},{ci},"{name}"),')
def clean_name(string): def clean_name(string):
@ -81,7 +82,11 @@ for entry in entries:
total += 1 total += 1
ra = entry['ra'] ra = entry['ra']
dec = entry['dec'] dec = entry['dec']
x = entry['x']
y = entry['y']
z = entry['z']
mag = entry['mag'] mag = entry['mag']
absmag = entry['absmag']
ci = entry['ci'] ci = entry['ci']
dist = entry['dist'] dist = entry['dist']
name = clean_name(entry['proper']) name = clean_name(entry['proper'])
@ -94,7 +99,7 @@ for entry in entries:
continue continue
if float(mag) > MAX_APPARENT_MAGNITUDE: if float(mag) > MAX_APPARENT_MAGNITUDE:
continue continue
render(ra, dec, mag, ci, dist, name) render(x, y, z, ra, dec, mag, absmag, ci, dist, name)
count += 1 count += 1
#for entry in CUSTOM_ENTRIES: #for entry in CUSTOM_ENTRIES:
# render(entry[0], entry[1], entry[2], entry[3], entry[4]) # render(entry[0], entry[1], entry[2], entry[3], entry[4])

File diff suppressed because it is too large Load diff

View file

@ -113,70 +113,54 @@ pub fn setup(
commands.insert_resource(AsteroidModel2(asset_server.load(ASSET_ASTEROID2))); commands.insert_resource(AsteroidModel2(asset_server.load(ASSET_ASTEROID2)));
// Generate starmap // Generate starmap
let sphere_handle = meshes.add(Circle::new(1.0)); let sphere_handle = meshes.add(Sphere::new(1.0).mesh().uv(16, 16));
let mut starcount = 0; let mut starcount = 0;
for star in nature::STARS { for star in nature::STARS {
let mag = star.3; let (x, y, z, mag, absmag, color_index, name) = *star;
if mag > STARS_MAX_MAGNITUDE { if mag > STARS_MAX_MAGNITUDE {
continue; continue;
} }
let is_sun = mag < -20.0;
let mag = mag.min(6.0); let mag = mag.min(6.0);
let scale_color = {|color: f32| let scale_color = {|color: f32|
if is_sun { color * (0.0659663 * mag * mag - 1.09862 * mag + 4.3)
color * 13.0f32
} else {
color * (0.0659663 * mag * mag - 1.09862 * mag + 4.3)
}
}; };
let scale_size = {|mag: f32| let (r, g, b) = nature::star_color_index_to_rgb(color_index);
if is_sun {
40000.0f32
} else {
1000.0 * (0.230299 * mag * mag - 3.09013 * mag + 15.1782)
} * 1e11
};
let (r, g, b) = nature::star_color_index_to_rgb(star.4);
let star_color_handle = materials.add(StandardMaterial { let star_color_handle = materials.add(StandardMaterial {
base_color: Color::rgb(scale_color(r), scale_color(g), scale_color(b)), base_color: Color::rgb(scale_color(r), scale_color(g), scale_color(b)),
unlit: true, unlit: true,
..default() ..default()
}); });
let mesh_distance = 1e18;
let starchart_distance = if is_sun {
Some(nature::DIST_JUPTER_SUN)
} else if star.5 >= 100000.0 {
None
} else {
Some(nature::PARSEC2METER * star.5 as f64)
};
let name = if star.6.is_empty() { let name = if star.6.is_empty() {
"Uncharted Star".to_string() "Uncharted Star".to_string()
} else { } else {
star.6.to_string() star.6.to_string()
}; };
let translation = Vec3::new( let translation = Vec3::new(
mesh_distance * star.0, nature::PARSEC2METER as f32 * x,
mesh_distance * star.1, nature::PARSEC2METER as f32 * z,
mesh_distance * star.2, nature::PARSEC2METER as f32 * -y,
); );
let rotation = Quat::from_rotation_arc(Vec3::Z, (-translation).normalize()); //let rotation = Quat::from_rotation_arc(Vec3::Z, (-translation).normalize());
let scale = translation.length().powf(0.85);
commands.spawn(( commands.spawn((
Star, Star,
hud::IsClickable { hud::IsClickable {
name: Some(name), name: Some(name),
distance: starchart_distance, distance: None,
}, },
PbrBundle { PbrBundle {
mesh: sphere_handle.clone(), mesh: sphere_handle.clone(),
material: star_color_handle, material: star_color_handle,
transform: Transform { transform: Transform {
translation, translation,
rotation, scale: Vec3::splat(scale),
scale: Vec3::splat(scale_size(mag)), ..default()
}, },
..default() ..default()
} },
Position::new(translation.as_dvec3()),
)); ));
starcount += 1; starcount += 1;
} }