From 15270931f6f2ba3df829bcca90ed2aa30266ed8b Mon Sep 17 00:00:00 2001 From: march3 Date: Fri, 23 Jun 2023 20:43:40 +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 --- sim_scenes/fiction/earth_orbit_stopped.py | 29 ++++++++--------------- sim_scenes/func.py | 4 ++++ simulators/ursina/entities/world_grid.py | 11 ++++++--- simulators/ursina_simulator.py | 12 +++++++++- 4 files changed, 33 insertions(+), 23 deletions(-) diff --git a/sim_scenes/fiction/earth_orbit_stopped.py b/sim_scenes/fiction/earth_orbit_stopped.py index c4d3076..248f61e 100644 --- a/sim_scenes/fiction/earth_orbit_stopped.py +++ b/sim_scenes/fiction/earth_orbit_stopped.py @@ -10,7 +10,7 @@ from bodies import Sun, Earth, Moon from common.consts import SECONDS_PER_HOUR, SECONDS_PER_HALF_DAY, SECONDS_PER_DAY, SECONDS_PER_WEEK, SECONDS_PER_MONTH from sim_scenes.func import mayavi_run, ursina_run, camera_look_at, two_bodies_colliding, set_camera_parent from bodies.body import AU -from simulators.ursina.entities.body_timer import BodyTimer +from simulators.ursina.entities.body_timer import BodyTimer, TimeData from simulators.ursina.ui.control_ui import ControlUI from simulators.ursina.ursina_event import UrsinaEvent from ursina import application, camera, Vec3 @@ -27,9 +27,8 @@ if __name__ == '__main__': """ # 地球的Y方向初始速度 EARTH_INIT_VELOCITY = 0 # 0km/s - sun = Sun(init_position=[AU/math.sqrt(2),0, AU/math.sqrt(2)], size_scale=1) - sun = Sun(init_position=[0, 0, AU], size_scale=1) - earth = Earth(init_position=[0, 0, 0], + sun = Sun(init_position=[0, 0, 0], size_scale=1) + earth = Earth(init_position=[0, 0, -AU], init_velocity=[0, EARTH_INIT_VELOCITY, 0], size_scale=1).set_light_disable(True) bodies = [ @@ -40,29 +39,21 @@ if __name__ == '__main__': def on_ready(): # 运行前触发 - application.time_scale = 0.01 + application.time_scale = 0.00001 camera.fov = 50 - def on_timer_changed(time_data): + def on_timer_changed(time_data: TimeData): - if time_data.total_days < 18: - fov_offset = 0.1 - elif time_data.total_days < 30: - fov_offset = 0.04 - elif time_data.total_days < 40: - fov_offset = 0.02 - else: - fov_offset = 0 - - if time_data.total_minutes % 3 == 0 and camera.fov > 1.5: - camera.fov -= fov_offset - camera_look_at(earth,rotation_z=0) + camera_look_at(earth, rotation_z=0) + earth_pos = earth.planet.world_position + camera.world_position = Vec3(earth_pos[0], earth_pos[1] + 0.01, earth_pos[2] - 0.1) if two_bodies_colliding(sun, earth): ControlUI.current_ui.show_message("地球已到达太阳表面", close_time=-1) application.pause() + # 设置计时器的最小时间单位为分钟 BodyTimer().min_unit = BodyTimer.MIN_UNIT_HOURS @@ -76,6 +67,6 @@ if __name__ == '__main__': # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- # position=(0, 0, 0) 的位置是站在地球视角,可以观看月相变化的过程 - ursina_run(bodies, SECONDS_PER_DAY, position=(0, 0.002 * AU, -0.002 * AU), + ursina_run(bodies, SECONDS_PER_DAY, position=(0, 0.0001 * AU, -0.002 * AU), show_timer=True, show_grid=True) diff --git a/sim_scenes/func.py b/sim_scenes/func.py index 7600024..c445fb6 100644 --- a/sim_scenes/func.py +++ b/sim_scenes/func.py @@ -112,6 +112,8 @@ def ursina_run(bodies, cosmic_bg=None, bg_music=None, show_grid=True, + grid_position=None, + grid_scale=None, show_trail=False, show_name=False, show_timer=False, @@ -179,6 +181,8 @@ def ursina_run(bodies, simulator.run(dt, cosmic_bg=cosmic_bg, show_grid=show_grid, + grid_position=grid_position, + grid_scale=grid_scale, show_timer=show_timer, timer_enabled=timer_enabled, bg_music=bg_music, diff --git a/simulators/ursina/entities/world_grid.py b/simulators/ursina/entities/world_grid.py index 66ce53d..8938cb7 100644 --- a/simulators/ursina/entities/world_grid.py +++ b/simulators/ursina/entities/world_grid.py @@ -26,11 +26,16 @@ class WorldGrid(Singleton, Entity): arrow_y, line_y, text_y = create_arrow_line((0, 0, 0), (0, 10, 0), label="Y", color=color.green) arrow_z, line_z, text_z = create_arrow_line((0, 0, 0), (0, 0, 10), label="Z", color=color.yellow) - def __init__(self): + def __init__(self, position=None, scale=None): super().__init__() - s = 120 + if scale is None: + s = 120 + else: + s = scale + if position is None: + position = (0, -80, 0) grid = Entity(model=Grid(s, s), scale=s * 60, color=color.rgba(255, 255, 255, 20), rotation_x=90, - position=(0, -80, 0)) + position=position) grid.set_light_off() # self.draw_axises() diff --git a/simulators/ursina_simulator.py b/simulators/ursina_simulator.py index 7fdc378..6952078 100644 --- a/simulators/ursina_simulator.py +++ b/simulators/ursina_simulator.py @@ -302,7 +302,17 @@ class UrsinaSimulator(Simulator): if "show_grid" in kwargs: if kwargs["show_grid"]: - WorldGrid() + if "grid_scale" in kwargs: + grid_scale = kwargs["grid_scale"] + else: + grid_scale = None + + if "grid_position" in kwargs: + grid_position = kwargs["grid_position"] + else: + grid_position = None + + WorldGrid(grid_position, grid_scale) if "cosmic_bg" in kwargs: cosmic_bg = kwargs["cosmic_bg"] -- GitLab