# -*- coding:utf-8 -*- # title :哈雷彗星场景半真实模拟共用库 # description : # author :Python超人 # date :2023-11-06 # link :https://gitcode.net/pythoncr/ # python_version :3.9 # ============================================================================== import math from dataclasses import dataclass from dataclasses import field 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 @dataclass(order=True) class HalleyCometParams: start_time: str = field(default='1983-03-20 00:00:00') init_velocity: list[float] = field(default_factory=[3.34, 0, 10.718]) init_position: list[float] = field(default_factory=[0, 0.5 * AU, -10 * AU]) def create_halley_comet(init_velocity, init_position): """ 创建哈雷彗星 @return: """ # 哈雷彗星的平均运行速度约为每小时 70,000 英里或每小时 126,000 公里 。(35公里/秒) # 每76.1年环绕太阳一周的周期彗星 halley_comet = HalleComet( # size_scale=4e7, size_scale=0.2e8, init_velocity=init_velocity, init_position=init_position) \ .set_light_disable(True) return halley_comet def create_orbit_line(center_body, body, start_time): orbital_days = int(math.ceil(body.orbital_days * 1.02)) points = get_reality_orbit_points(type(body).__name__.lower(), start_time=start_time, 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 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=0.8e3, show_trail=show_trail) self.saturn = Saturn(size_scale=0.8e3, show_trail=show_trail) self.uranus = Uranus(size_scale=3e3, show_trail=show_trail) self.neptune = Neptune(size_scale=3e3, 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)