diff --git a/sim_scenes/solar_system/halley_comet_lib.py b/sim_scenes/solar_system/halley_comet_lib.py index fc6262b6ea58beee09c55a99b325a946e1c0377e..6796d5e5a884e4ca2a0cbe4a338fb09633ea391b 100644 --- a/sim_scenes/solar_system/halley_comet_lib.py +++ b/sim_scenes/solar_system/halley_comet_lib.py @@ -10,7 +10,9 @@ import math from dataclasses import dataclass from dataclasses import field -from common.celestial_data_service import get_reality_orbit_points +from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto +from common.celestial_data_service import get_reality_orbit_points, init_bodies_reality_pos_vels, init_bodies_pos_vels +from common.color_utils import trail_color_brightest from common.consts import AU from objs import HalleComet from simulators.ursina.ursina_mesh import create_orbit_by_points @@ -46,3 +48,55 @@ def create_orbit_line(center_body, body, start_time): # print(points) orbit_line = create_orbit_by_points(center_body.position, points, line_color=body.trail_color) return orbit_line + + +class HalleyCometSimBase: + + def __init__(self): + self.mercury = None + self.sun = None + self.venus = None + self.earth = None + self.mars = None + self.jupiter = None + self.saturn = None + self.uranus = None + self.neptune = None + self.pluto = None + self.bodies = [] + + def build_solar_system(self, ignore_gravity=False, start_time=None): + # region 构建太阳系 + show_trail = False + self.sun = Sun(size_scale=0.6e2, show_trail=show_trail) + self.mercury = Mercury(size_scale=5e3, show_trail=show_trail) + self.venus = Venus(size_scale=3e3, show_trail=show_trail) + self.earth = Earth(size_scale=3e3, rotate_angle=0, show_trail=show_trail) + self.mars = Mars(size_scale=4e3, show_trail=show_trail) + self.jupiter = Jupiter(size_scale=2.5e3, show_trail=show_trail) + self.saturn = Saturn(size_scale=2.5e3, show_trail=show_trail) + self.uranus = Uranus(size_scale=6e3, show_trail=show_trail) + self.neptune = Neptune(size_scale=6e3, show_trail=show_trail) + self.pluto = Pluto(size_scale=1e5, show_trail=show_trail) + self.bodies = [ + self.sun, # 太阳 + self.mercury, # 水星 + self.venus, # 金星 + self.earth, # 地球 + self.mars, # 火星 + self.jupiter, # 木星 + self.saturn, # 土星 + self.uranus, # 天王星 + self.neptune, # 海王星 + # self.pluto, # 冥王星 + ] + trail_color_brightest(self.bodies) + if ignore_gravity: + for body in self.bodies[1:]: + body.init_velocity = [0, 0, 0] + body.set_ignore_gravity(True) + + if start_time is not None: + init_bodies_reality_pos_vels(self.bodies, start_time) + else: + init_bodies_pos_vels(self.bodies) diff --git a/sim_scenes/solar_system/halley_comet_sim.py b/sim_scenes/solar_system/halley_comet_sim.py index 884538bfa073463e2e7d6404f1dc7ff8d21f1eae..bd25ba888d83428df0c25ae0fb0e3517327b497e 100644 --- a/sim_scenes/solar_system/halley_comet_sim.py +++ b/sim_scenes/solar_system/halley_comet_sim.py @@ -6,37 +6,33 @@ # link :https://gitcode.net/pythoncr/ # python_version :3.9 # ============================================================================== -import math -from astropy.time import Time from ursina import camera, application -from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto -from common.celestial_data_service import init_bodies_reality_pos_vels, get_reality_orbit_points, \ - conv_to_astropy_time, set_solar_system_celestial_position -from common.color_utils import trail_color_brightest +from common.celestial_data_service import init_bodies_reality_pos_vels, conv_to_astropy_time, \ + set_solar_system_celestial_position from common.consts import SECONDS_PER_YEAR, AU from common.func import calculate_distance from objs import HalleComet from sim_scenes.func import create_text_panel from sim_scenes.func import ursina_run, create_sphere_sky -from sim_scenes.solar_system.halley_comet_lib import HalleyCometParams, create_halley_comet, create_orbit_line +from sim_scenes.solar_system.halley_comet_lib import HalleyCometSimBase, HalleyCometParams, \ + create_halley_comet, create_orbit_line from simulators.ursina.entities.body_timer import TimeData from simulators.ursina.entities.entity_utils import get_value_direction_vectors from simulators.ursina.ui.control_ui import ControlUI from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent -from simulators.ursina.ursina_mesh import create_orbit_by_points, create_label -from dataclasses import dataclass -from dataclasses import field +from simulators.ursina.ursina_mesh import create_label -class HalleyCometSim: +class HalleyCometSim(HalleyCometSimBase): """ 哈雷彗星场景模拟 """ def __init__(self, params=None): + super(HalleyCometSim, self).__init__() if params is None: self.params = HalleyCometParams() else: @@ -49,58 +45,18 @@ class HalleyCometSim: # print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai'))) - def build_solar_system(self): - # region 构建太阳系 - show_trail = False - self.sun = Sun(size_scale=0.6e2, show_trail=show_trail) - self.mercury = Mercury(size_scale=5e3, show_trail=show_trail) - self.venus = Venus(size_scale=3e3, show_trail=show_trail) - self.earth = Earth(size_scale=3e3, rotate_angle=0, show_trail=show_trail) - self.mars = Mars(size_scale=4e3, show_trail=show_trail) - self.jupiter = Jupiter(size_scale=2.5e3, show_trail=show_trail) - self.saturn = Saturn(size_scale=2.5e3, show_trail=show_trail) - self.uranus = Uranus(size_scale=6e3, show_trail=show_trail) - self.neptune = Neptune(size_scale=6e3, show_trail=show_trail) - self.pluto = Pluto(size_scale=1e5, show_trail=show_trail) - self.bodies = [ - self.sun, # 太阳 - self.mercury, # 水星 - self.venus, # 金星 - self.earth, # 地球 - self.mars, # 火星 - self.jupiter, # 木星 - self.saturn, # 土星 - self.uranus, # 天王星 - self.neptune, # 海王星 - # self.pluto, # 冥王星 - ] - + def build(self): + self.build_solar_system(ignore_gravity=True, start_time=self.start_time) # self.bodies = [ # self.sun, # 太阳 # self.mars, # 火星 # self.neptune, # 海王星 # ] - # endregion - trail_color_brightest(self.bodies) - for body in self.bodies[1:]: - body.init_velocity = [0, 0, 0] - body.set_ignore_gravity(True) - init_bodies_reality_pos_vels(self.bodies, self.start_time) - - def build_halley_comet(self): - """ - 创建哈雷彗星 - @return: - """ + # 创建哈雷彗星创建哈雷彗星 self.halley_comet = create_halley_comet(self.params.init_velocity, self.params.init_position) self.bodies.append(self.halley_comet) - def build(self): - self.build_solar_system() - self.build_halley_comet() - - def on_ready(self): """ 事件绑定后,模拟器运行前会触发 diff --git a/sim_scenes/solar_system/halley_comet_sim_02.py b/sim_scenes/solar_system/halley_comet_sim_02.py index 7882345fa32b1537d9d31745a78d2d7ff59e3195..55e3a1a24e5c62aa40be40bd17a02e20200f75b7 100644 --- a/sim_scenes/solar_system/halley_comet_sim_02.py +++ b/sim_scenes/solar_system/halley_comet_sim_02.py @@ -6,96 +6,48 @@ # link :https://gitcode.net/pythoncr/ # python_version :3.9 # ============================================================================== -import math from astropy.time import Time from ursina import camera, application -from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto -from common.celestial_data_service import init_bodies_reality_pos_vels, get_reality_orbit_points, \ - conv_to_astropy_time -from common.color_utils import trail_color_brightest +from common.celestial_data_service import init_bodies_reality_pos_vels, conv_to_astropy_time from common.consts import SECONDS_PER_YEAR, AU from common.func import calculate_distance from objs import HalleComet from sim_scenes.func import create_text_panel from sim_scenes.func import ursina_run, create_sphere_sky -from sim_scenes.solar_system.halley_comet_lib import create_halley_comet, create_orbit_line +from sim_scenes.solar_system.halley_comet_lib import HalleyCometSimBase, create_halley_comet, create_orbit_line from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent -from simulators.ursina.ursina_mesh import create_orbit_by_points -class HalleyCometSim: +class HalleyCometSim(HalleyCometSimBase): """ 哈雷彗星场景模拟 """ - def __init__(self, dt=None): - if dt is None: - self.dt = Time.now() - elif isinstance(dt, str): - self.dt = conv_to_astropy_time(dt) + def __init__(self, start_time=None): + super(HalleyCometSim, self).__init__() + + if start_time is None: + self.start_time = Time.now() + elif isinstance(start_time, str): + self.start_time = conv_to_astropy_time(start_time) else: - self.dt = dt - # print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai'))) - - def build_solar_system(self): - # region 构建太阳系 - show_trail = False - self.sun = Sun(size_scale=0.8e2, show_trail=show_trail) - self.mercury = Mercury(size_scale=5e3, show_trail=show_trail) - self.venus = Venus(size_scale=5e3, show_trail=show_trail) - self.earth = Earth(size_scale=5e3, rotate_angle=0, show_trail=show_trail) - self.mars = Mars(size_scale=5e3, show_trail=show_trail) - self.jupiter = Jupiter(size_scale=2.5e3, show_trail=show_trail) - self.saturn = Saturn(size_scale=2.5e3, show_trail=show_trail) - self.uranus = Uranus(size_scale=6e3, show_trail=show_trail) - self.neptune = Neptune(size_scale=6e3, show_trail=show_trail) - self.pluto = Pluto(size_scale=1e5, show_trail=show_trail) - self.bodies = [ - self.sun, # 太阳 - self.mercury, # 水星 - self.venus, # 金星 - self.earth, # 地球 - self.mars, # 火星 - self.jupiter, # 木星 - self.saturn, # 土星 - self.uranus, # 天王星 - self.neptune, # 海王星 - # self.pluto, # 冥王星 - ] + self.start_time = start_time + # print("北京时间:", start_time.to_datetime(timezone=pytz.timezone('Asia/Shanghai'))) + def build(self): + self.build_solar_system(start_time=self.start_time) # self.bodies = [ # self.sun, # 太阳 # self.mars, # 火星 # self.neptune, # 海王星 # ] - # endregion - trail_color_brightest(self.bodies) - - init_bodies_reality_pos_vels(self.bodies, self.dt) - def build_halley_comet(self): - """ - 创建哈雷彗星 - @return: - """ self.halley_comet = create_halley_comet([-2.836, 4.705, 8.85], [0, -5 * AU, -10 * AU]) self.bodies.append(self.halley_comet) - def build(self): - self.build_solar_system() - self.build_halley_comet() - - # def create_orbit_line(self, center_body, body): - # orbital_days = int(math.ceil(body.orbital_days * 1.02)) - # points = get_reality_orbit_points(type(body).__name__.lower(), start_time=self.dt, days=orbital_days, - # segments=100) - # # print(points) - # orbit_line = create_orbit_by_points(center_body.position, points, line_color=body.trail_color) - # return orbit_line - def on_ready(self): """ 事件绑定后,模拟器运行前会触发 @@ -119,7 +71,7 @@ class HalleyCometSim: for body in self.bodies[1:]: if isinstance(body, HalleComet): continue - orbit_line = create_orbit_line(self.sun, body, self.dt) + orbit_line = create_orbit_line(self.sun, body, self.start_time) self.orbit_lines.append(orbit_line) self.text_panel = create_text_panel() diff --git a/sim_scenes/solar_system/halley_comet_sim_03.py b/sim_scenes/solar_system/halley_comet_sim_03.py index f3e3543d82a278f8c3a29109098bcb278ce7d7a6..e233692b48848fb7728a1fa925239aa6b2df3fb5 100644 --- a/sim_scenes/solar_system/halley_comet_sim_03.py +++ b/sim_scenes/solar_system/halley_comet_sim_03.py @@ -6,72 +6,31 @@ # link :https://gitcode.net/pythoncr/ # python_version :3.9 # ============================================================================== -import time from ursina import camera, application -from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto -from common.celestial_data_service import get_init_pos_vels, init_bodies_pos_vels -from common.color_utils import brightest, trail_color_brightest +from common.celestial_data_service import init_bodies_pos_vels from common.consts import SECONDS_PER_YEAR, AU from common.func import calculate_distance -from objs import HalleComet, Obj -from sim_scenes.func import camera_look_at, two_bodies_colliding, create_text_panel +from objs import HalleComet +from sim_scenes.func import create_text_panel from sim_scenes.func import ursina_run, create_sphere_sky -from sim_scenes.solar_system.halley_comet_lib import create_halley_comet +from sim_scenes.solar_system.halley_comet_lib import HalleyCometSimBase, create_halley_comet from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_mesh import create_orbit_line -class HalleyCometSim: +class HalleyCometSim(HalleyCometSimBase): """ 哈雷彗星场景模拟 """ + def build(self): + self.build_solar_system() - def __init__(self): - pass - - def build_solar_system(self): - # region 构建太阳系 - self.sun = Sun(size_scale=0.8e2, show_trail=False) - self.mercury = Mercury(size_scale=5e3, show_trail=False) - self.venus = Venus(size_scale=5e3, show_trail=False) - self.earth = Earth(size_scale=5e3, rotate_angle=0, show_trail=False) - self.mars = Mars(size_scale=5e3, show_trail=False) - self.jupiter = Jupiter(size_scale=2.5e3, show_trail=False) - self.saturn = Saturn(size_scale=2.5e3, show_trail=False) - self.uranus = Uranus(size_scale=6e3, show_trail=False) - self.neptune = Neptune(size_scale=6e3, show_trail=False) - self.pluto = Pluto(size_scale=1e5, show_trail=False) - self.bodies = [ - self.sun, # 太阳 - self.mercury, # 水星 - self.venus, # 金星 - self.earth, # 地球 - self.mars, # 火星 - self.jupiter, # 木星 - self.saturn, # 土星 - self.uranus, # 天王星 - self.neptune, # 海王星 - self.pluto, # 冥王星 - ] - # endregion - trail_color_brightest(self.bodies) - init_bodies_pos_vels(self.bodies) - - def build_halley_comet(self): - """ - 创建哈雷彗星 - @return: - """ self.halley_comet = create_halley_comet([-3.34, 3, 10.718], [0, -2 * AU, -10 * AU]) self.bodies.append(self.halley_comet) - def build(self): - self.build_solar_system() - self.build_halley_comet() - def on_ready(self): """ 事件绑定后,模拟器运行前会触发