render starmap based on HYG dataset [http://www.astronexus.com/hyg]
This commit is contained in:
parent
2786129499
commit
6b0f9c671a
|
@ -4,6 +4,7 @@ mod world;
|
||||||
mod settings;
|
mod settings;
|
||||||
mod hud;
|
mod hud;
|
||||||
mod actor;
|
mod actor;
|
||||||
|
mod starchart;
|
||||||
|
|
||||||
use bevy::window::{Window, WindowMode, PrimaryWindow, CursorGrabMode};
|
use bevy::window::{Window, WindowMode, PrimaryWindow, CursorGrabMode};
|
||||||
use bevy::diagnostic::FrameTimeDiagnosticsPlugin;
|
use bevy::diagnostic::FrameTimeDiagnosticsPlugin;
|
||||||
|
|
15550
src/starchart.rs
Normal file
15550
src/starchart.rs
Normal file
File diff suppressed because it is too large
Load diff
45
src/world.rs
45
src/world.rs
|
@ -1,4 +1,4 @@
|
||||||
use crate::{actor, camera};
|
use crate::{actor, camera, starchart};
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
//use bevy::core_pipeline::Skybox;
|
//use bevy::core_pipeline::Skybox;
|
||||||
//use bevy::asset::LoadState;
|
//use bevy::asset::LoadState;
|
||||||
|
@ -10,10 +10,8 @@ use std::f32::consts::PI;
|
||||||
const ASTEROID_SIZE: f32 = 100.0;
|
const ASTEROID_SIZE: f32 = 100.0;
|
||||||
const MOON_SIZE: f32 = 50.0;
|
const MOON_SIZE: f32 = 50.0;
|
||||||
const MARS_SIZE: f32 = 10.0;
|
const MARS_SIZE: f32 = 10.0;
|
||||||
const SUN_SIZE: f32 = 5000.0;
|
|
||||||
const ASTRONAUT_SIZE: f32 = 5.0;
|
const ASTRONAUT_SIZE: f32 = 5.0;
|
||||||
|
|
||||||
const SUN_BRIGHTNESS: f32 = 1e5;
|
|
||||||
//const SKYBOX_BRIGHTNESS: f32 = 300.0;
|
//const SKYBOX_BRIGHTNESS: f32 = 300.0;
|
||||||
//const SKYBOX_BRIGHTNESS_AR: f32 = 100.0;
|
//const SKYBOX_BRIGHTNESS_AR: f32 = 100.0;
|
||||||
|
|
||||||
|
@ -31,6 +29,9 @@ impl Plugin for WorldPlugin {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct Star;
|
||||||
|
|
||||||
//#[derive(Resource)]
|
//#[derive(Resource)]
|
||||||
//pub struct WorldState {
|
//pub struct WorldState {
|
||||||
// is_loaded: bool,
|
// is_loaded: bool,
|
||||||
|
@ -140,11 +141,12 @@ pub fn setup(
|
||||||
perceptual_roughness: 1.0,
|
perceptual_roughness: 1.0,
|
||||||
..default()
|
..default()
|
||||||
});
|
});
|
||||||
for i in -12..12 {
|
let maxdist = 10;
|
||||||
for j in -13..13 {
|
for i in -maxdist..maxdist {
|
||||||
for k in -14..14 {
|
for j in -maxdist..maxdist {
|
||||||
|
for k in -maxdist..maxdist {
|
||||||
let offset = 500.0;
|
let offset = 500.0;
|
||||||
let dist = 18000.0;
|
let dist = 3e4;
|
||||||
let wobble = dist/2.0;
|
let wobble = dist/2.0;
|
||||||
let (i, j, k) = (i as f32, j as f32, k as f32);
|
let (i, j, k) = (i as f32, j as f32, k as f32);
|
||||||
commands.spawn((
|
commands.spawn((
|
||||||
|
@ -164,21 +166,30 @@ pub fn setup(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add THE SUN
|
// Generate starmap
|
||||||
let hydrogenfusion_handle = materials.add(StandardMaterial {
|
for star in starchart::STARS {
|
||||||
emissive: Color::rgb_linear(SUN_BRIGHTNESS, 0.9 * SUN_BRIGHTNESS, SUN_BRIGHTNESS),
|
let brightness = star[3] * 2000.0;
|
||||||
|
let star_color_handle = materials.add(StandardMaterial {
|
||||||
|
base_color: Color::rgb(0.0, 0.0, 0.0),
|
||||||
|
emissive: Color::rgb_linear(brightness, 0.9 * brightness, brightness),
|
||||||
..default()
|
..default()
|
||||||
});
|
});
|
||||||
commands.spawn(PbrBundle {
|
let dist = 1e6;
|
||||||
|
commands.spawn((
|
||||||
|
Star,
|
||||||
|
PbrBundle {
|
||||||
mesh: sphere_handle.clone(),
|
mesh: sphere_handle.clone(),
|
||||||
material: hydrogenfusion_handle.clone(),
|
material: star_color_handle.clone(),
|
||||||
transform: Transform::from_xyz(
|
transform: Transform::from_xyz(
|
||||||
0.0,
|
dist * star[0],
|
||||||
30000.0,
|
dist * star[1],
|
||||||
-500000.0,
|
dist * star[2],
|
||||||
).with_scale(Vec3::splat(SUN_SIZE)),
|
)
|
||||||
|
.with_scale(Vec3::splat((1000.0*star[3]).clamp(500.0, 2000.0))),
|
||||||
..default()
|
..default()
|
||||||
});
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// Add alien
|
// Add alien
|
||||||
commands.spawn(SceneBundle {
|
commands.spawn(SceneBundle {
|
||||||
|
|
66
tools/generate_starchart.py
Executable file
66
tools/generate_starchart.py
Executable file
|
@ -0,0 +1,66 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# This script requires the following file in the current directory:
|
||||||
|
# https://github.com/astronexus/HYG-Database/blob/cbd21013d2bb89732b893be357a6f41836dbe614/hyg/CURRENT/hygdata_v41.csv
|
||||||
|
|
||||||
|
import csv
|
||||||
|
import sys
|
||||||
|
import math
|
||||||
|
|
||||||
|
# Lower apparent magnitude = brighter.
|
||||||
|
# Sun = -26.7
|
||||||
|
# Sirius = -1.44
|
||||||
|
# Betelgeuse = 0.45
|
||||||
|
# Polaris (north star) = 1.97
|
||||||
|
# Meissa (orion's head, 8th brightest star in orion) = 3.33
|
||||||
|
MAX_APPARENT_MAGNITUDE = 7.0
|
||||||
|
|
||||||
|
print("// This file was autogenerated by 'genrate_starchart.py' using data from")
|
||||||
|
print("// the 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("")
|
||||||
|
print("pub const STARS: &[[f32; 5]] = &[")
|
||||||
|
|
||||||
|
|
||||||
|
def render(ra, dec, mag, proper):
|
||||||
|
ra = float(ra)
|
||||||
|
dec = float(dec)
|
||||||
|
mag = float(mag)
|
||||||
|
|
||||||
|
distance = 1.0
|
||||||
|
ra_radians = math.radians(ra * 15) # ra is in [0, 24], multiplying by 15 gives degrees in [0, 360]
|
||||||
|
dec_radians = math.radians(dec)
|
||||||
|
#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)
|
||||||
|
y = distance * math.cos(dec_radians) * math.sin(-ra_radians)
|
||||||
|
z = distance * math.sin(dec_radians)
|
||||||
|
|
||||||
|
# Correct for differences in coordinate system axes
|
||||||
|
x, y, z = x, z, y
|
||||||
|
|
||||||
|
comment = f" // {proper}" if proper else ""
|
||||||
|
|
||||||
|
brightness = 2.512 ** (0 - mag)
|
||||||
|
|
||||||
|
print(f" [{x:.04}, {y:.04}, {z:.04}, {brightness:.04}, {ci}],{comment}")
|
||||||
|
|
||||||
|
|
||||||
|
total = 0
|
||||||
|
count = 0
|
||||||
|
with open("hygdata_v41.csv", "r", encoding="utf-8") as f:
|
||||||
|
for entry in csv.DictReader(f):
|
||||||
|
total += 1
|
||||||
|
ra = entry['ra']
|
||||||
|
dec = entry['dec']
|
||||||
|
mag = entry['mag']
|
||||||
|
ci = entry['ci']
|
||||||
|
proper = entry['proper']
|
||||||
|
proper = "".join([c for c in proper if c.isalnum() or c in ' -_'])
|
||||||
|
if not all([ra, dec, mag, ci]):
|
||||||
|
continue
|
||||||
|
if float(mag) > MAX_APPARENT_MAGNITUDE:
|
||||||
|
continue
|
||||||
|
render(ra, dec, mag, proper)
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
print("];")
|
||||||
|
print(f"Wrote {count} stars (total={total}).", file=sys.stderr)
|
Loading…
Reference in a new issue