From b811bd66a07bedc2076d281ec4adbf7676eafcfc Mon Sep 17 00:00:00 2001 From: march3 Date: Sat, 28 Oct 2023 21:03:46 +0800 Subject: [PATCH] =?UTF-8?q?Python=E8=B6=85=E4=BA=BA-=E5=AE=87=E5=AE=99?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solar_system/halley_comet_sim_03.py | 65 ++++++++++++------- simulators/simulator.py | 2 +- simulators/ursina/entities/planet.py | 5 ++ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/sim_scenes/solar_system/halley_comet_sim_03.py b/sim_scenes/solar_system/halley_comet_sim_03.py index 3dbf2f5..240fa14 100644 --- a/sim_scenes/solar_system/halley_comet_sim_03.py +++ b/sim_scenes/solar_system/halley_comet_sim_03.py @@ -1,6 +1,6 @@ # -*- coding:utf-8 -*- -# title :哈雷彗星场景模拟 -# description :哈雷彗星场景模拟 +# title :哈雷彗星场景半真实模拟 +# description :哈雷彗星运行轨道使用了万有引力,其他天体使用 astropy 包的真实数据 # author :Python超人 # date :2023-10-28 # link :https://gitcode.net/pythoncr/ @@ -25,6 +25,15 @@ 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 +from dataclasses import dataclass +from dataclasses import field + + +@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]) class HalleyCometSim: @@ -32,13 +41,17 @@ class HalleyCometSim: 哈雷彗星场景模拟 """ - def __init__(self, start_time=None): - if start_time is None: - self.start_time = Time.now() - elif isinstance(start_time, str): - self.start_time = conv_to_astropy_time(start_time) + def __init__(self, params=None): + if params is None: + self.params = HalleyCometParams() + else: + self.params = params + + if isinstance(params.start_time, str): + self.start_time = conv_to_astropy_time(params.start_time) else: - self.start_time = start_time + self.start_time = params.start_time + # print("北京时间:", dt.to_datetime(timezone=pytz.timezone('Asia/Shanghai'))) def build_solar_system(self): @@ -46,9 +59,9 @@ class HalleyCometSim: 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=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.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) @@ -96,13 +109,9 @@ class HalleyCometSim: # 哈雷彗星的平均运行速度约为每小时 70,000 英里或每小时 126,000 公里 。(35公里/秒) # 每76.1年环绕太阳一周的周期彗星 self.halley_comet = HalleComet( # size_scale=4e7, - size_scale=0.2e8, - # [3.34, 0, 10.7] 2060-4- - # [3.34, 0, 10.712] 2061-5 - # [3.34, 0, 10.715] 2061-6-24 - # [3.34, 0, 10.718] 2061-8 - init_velocity=[3.34, 0, 10.718], - init_position=[0, 0.5 * AU, -10 * AU]) \ + size_scale=0.4e8, + init_velocity=self.params.init_velocity, + init_position=self.params.init_position) \ .set_light_disable(True) self.bodies.append(self.halley_comet) @@ -125,10 +134,10 @@ class HalleyCometSim: @return: """ # 创建天空 - UrsinaConfig.trail_type = "line" - UrsinaConfig.trail_length = 91 - # UrsinaConfig.trail_length = 1000 - UrsinaConfig.trail_thickness_factor = 3 + # UrsinaConfig.trail_type = "line" + # UrsinaConfig.trail_thickness_factor = 3 + # UrsinaConfig.trail_length = 91 + UrsinaConfig.trail_length = 200 # camera.clip_plane_near = 0.1 camera.clip_plane_far = 1000000 create_sphere_sky(scale=200000) @@ -187,6 +196,7 @@ class HalleyCometSim: self.text_panel.text = "哈雷彗星距离太阳:%.3f AU" % (d / AU) self.set_bodies_position(time_data) + self.show_clock(dt) for i, orbit_line in enumerate(self.orbit_lines): @@ -201,7 +211,16 @@ if __name__ == '__main__': # 上次通过近日点: 1986年2月9日 # 下次通过近日点: 2061年7月28日 # 远日点 35.1 AU 2023年12月9日 - sim = HalleyCometSim(start_time='1983-03-20 00:00:00') + # [3.34, 0, 10.7] 2060-4- + # [3.34, 0, 10.712] 2061-5 + # [3.34, 0, 10.715] 2061-6-24 + # [3.34, 0, 10.718] 2061-8 + params = HalleyCometParams( + start_time='1983-03-20 00:00:00', + init_velocity=[3.34, 0, 10.718], + init_position=[0, 0.5 * AU, -10 * AU] + ) + sim = HalleyCometSim(params) sim.build() # 订阅事件后,上面2个函数功能才会起作用 diff --git a/simulators/simulator.py b/simulators/simulator.py index 404bc54..a1f1d54 100644 --- a/simulators/simulator.py +++ b/simulators/simulator.py @@ -48,7 +48,7 @@ class Simulator(metaclass=ABCMeta): for idx, view in enumerate(self.body_views): body = self.bodies_sys.bodies[idx] - body.start_time = dt + body.dt = dt view.appeared = body.appeared if not view.appeared: view.disappear() diff --git a/simulators/ursina/entities/planet.py b/simulators/ursina/entities/planet.py index 904fda5..8bdd8d0 100644 --- a/simulators/ursina/entities/planet.py +++ b/simulators/ursina/entities/planet.py @@ -227,6 +227,11 @@ class Planet(Entity): self.rotate_axis_init_scale = self.rotate_axis_line.scale self.rotate_axis_line.scale = self.rotate_axis_init_scale * UrsinaConfig.body_size_factor + # def self_rotate(self, dt): + # rotspeed = self.rotation_speed * (dt / 3600) / 2.4 * \ + # UrsinaConfig.ROTATION_SPEED_FACTOR * UrsinaConfig.body_spin_factor + # self.rotation_y -= rotspeed + def update(self): self.change_body_scale() -- GitLab