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

Python超人-宇宙模拟器

上级 3558bb8c
......@@ -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)
......@@ -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):
"""
事件绑定后,模拟器运行前会触发
......
......@@ -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()
......
......@@ -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):
"""
事件绑定后,模拟器运行前会触发
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册