提交 fb3cb10c 编写于 作者: 三月三net's avatar 三月三net

Python超人-宇宙模拟器

上级 3558bb8c
...@@ -10,7 +10,9 @@ import math ...@@ -10,7 +10,9 @@ import math
from dataclasses import dataclass from dataclasses import dataclass
from dataclasses import field 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 common.consts import AU
from objs import HalleComet from objs import HalleComet
from simulators.ursina.ursina_mesh import create_orbit_by_points from simulators.ursina.ursina_mesh import create_orbit_by_points
...@@ -46,3 +48,55 @@ def create_orbit_line(center_body, body, start_time): ...@@ -46,3 +48,55 @@ def create_orbit_line(center_body, body, start_time):
# print(points) # print(points)
orbit_line = create_orbit_by_points(center_body.position, points, line_color=body.trail_color) orbit_line = create_orbit_by_points(center_body.position, points, line_color=body.trail_color)
return orbit_line 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)
...@@ -6,37 +6,33 @@ ...@@ -6,37 +6,33 @@
# link :https://gitcode.net/pythoncr/ # link :https://gitcode.net/pythoncr/
# python_version :3.9 # python_version :3.9
# ============================================================================== # ==============================================================================
import math
from astropy.time import Time
from ursina import camera, application 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, conv_to_astropy_time, \
from common.celestial_data_service import init_bodies_reality_pos_vels, get_reality_orbit_points, \ set_solar_system_celestial_position
conv_to_astropy_time, set_solar_system_celestial_position
from common.color_utils import trail_color_brightest
from common.consts import SECONDS_PER_YEAR, AU from common.consts import SECONDS_PER_YEAR, AU
from common.func import calculate_distance from common.func import calculate_distance
from objs import HalleComet from objs import HalleComet
from sim_scenes.func import create_text_panel from sim_scenes.func import create_text_panel
from sim_scenes.func import ursina_run, create_sphere_sky 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.body_timer import TimeData
from simulators.ursina.entities.entity_utils import get_value_direction_vectors from simulators.ursina.entities.entity_utils import get_value_direction_vectors
from simulators.ursina.ui.control_ui import ControlUI from simulators.ursina.ui.control_ui import ControlUI
from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_config import UrsinaConfig
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
from simulators.ursina.ursina_mesh import create_orbit_by_points, create_label from simulators.ursina.ursina_mesh import create_label
from dataclasses import dataclass
from dataclasses import field
class HalleyCometSim: class HalleyCometSim(HalleyCometSimBase):
""" """
哈雷彗星场景模拟 哈雷彗星场景模拟
""" """
def __init__(self, params=None): def __init__(self, params=None):
super(HalleyCometSim, self).__init__()
if params is None: if params is None:
self.params = HalleyCometParams() self.params = HalleyCometParams()
else: else:
...@@ -49,58 +45,18 @@ class HalleyCometSim: ...@@ -49,58 +45,18 @@ class HalleyCometSim:
# print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai'))) # print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai')))
def build_solar_system(self): def build(self):
# region 构建太阳系 self.build_solar_system(ignore_gravity=True, start_time=self.start_time)
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, # 冥王星
]
# self.bodies = [ # self.bodies = [
# self.sun, # 太阳 # self.sun, # 太阳
# self.mars, # 火星 # self.mars, # 火星
# self.neptune, # 海王星 # 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.halley_comet = create_halley_comet(self.params.init_velocity, self.params.init_position)
self.bodies.append(self.halley_comet) self.bodies.append(self.halley_comet)
def build(self):
self.build_solar_system()
self.build_halley_comet()
def on_ready(self): def on_ready(self):
""" """
事件绑定后,模拟器运行前会触发 事件绑定后,模拟器运行前会触发
......
...@@ -6,96 +6,48 @@ ...@@ -6,96 +6,48 @@
# link :https://gitcode.net/pythoncr/ # link :https://gitcode.net/pythoncr/
# python_version :3.9 # python_version :3.9
# ============================================================================== # ==============================================================================
import math
from astropy.time import Time from astropy.time import Time
from ursina import camera, application 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, conv_to_astropy_time
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.consts import SECONDS_PER_YEAR, AU from common.consts import SECONDS_PER_YEAR, AU
from common.func import calculate_distance from common.func import calculate_distance
from objs import HalleComet from objs import HalleComet
from sim_scenes.func import create_text_panel from sim_scenes.func import create_text_panel
from sim_scenes.func import ursina_run, create_sphere_sky 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_config import UrsinaConfig
from simulators.ursina.ursina_event import UrsinaEvent 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): def __init__(self, start_time=None):
if dt is None: super(HalleyCometSim, self).__init__()
self.dt = Time.now()
elif isinstance(dt, str): if start_time is None:
self.dt = conv_to_astropy_time(dt) self.start_time = Time.now()
elif isinstance(start_time, str):
self.start_time = conv_to_astropy_time(start_time)
else: else:
self.dt = dt self.start_time = start_time
# print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai'))) # print("北京时间:", start_time.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, # 冥王星
]
def build(self):
self.build_solar_system(start_time=self.start_time)
# self.bodies = [ # self.bodies = [
# self.sun, # 太阳 # self.sun, # 太阳
# self.mars, # 火星 # self.mars, # 火星
# self.neptune, # 海王星 # 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.halley_comet = create_halley_comet([-2.836, 4.705, 8.85], [0, -5 * AU, -10 * AU])
self.bodies.append(self.halley_comet) 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): def on_ready(self):
""" """
事件绑定后,模拟器运行前会触发 事件绑定后,模拟器运行前会触发
...@@ -119,7 +71,7 @@ class HalleyCometSim: ...@@ -119,7 +71,7 @@ class HalleyCometSim:
for body in self.bodies[1:]: for body in self.bodies[1:]:
if isinstance(body, HalleComet): if isinstance(body, HalleComet):
continue 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.orbit_lines.append(orbit_line)
self.text_panel = create_text_panel() self.text_panel = create_text_panel()
......
...@@ -6,72 +6,31 @@ ...@@ -6,72 +6,31 @@
# link :https://gitcode.net/pythoncr/ # link :https://gitcode.net/pythoncr/
# python_version :3.9 # python_version :3.9
# ============================================================================== # ==============================================================================
import time
from ursina import camera, application 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_pos_vels
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.consts import SECONDS_PER_YEAR, AU from common.consts import SECONDS_PER_YEAR, AU
from common.func import calculate_distance from common.func import calculate_distance
from objs import HalleComet, Obj from objs import HalleComet
from sim_scenes.func import camera_look_at, two_bodies_colliding, create_text_panel from sim_scenes.func import create_text_panel
from sim_scenes.func import ursina_run, create_sphere_sky 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_config import UrsinaConfig
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
from simulators.ursina.ursina_mesh import create_orbit_line 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.halley_comet = create_halley_comet([-3.34, 3, 10.718], [0, -2 * AU, -10 * AU])
self.bodies.append(self.halley_comet) self.bodies.append(self.halley_comet)
def build(self):
self.build_solar_system()
self.build_halley_comet()
def on_ready(self): def on_ready(self):
""" """
事件绑定后,模拟器运行前会触发 事件绑定后,模拟器运行前会触发
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册