From 91d92d69bd2f3a4e1d08041ad2b61be2fa260584 Mon Sep 17 00:00:00 2001 From: march3 Date: Tue, 26 Mar 2024 22:22:37 +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 --- bodies/body.py | 2 +- sim_scenes/featured/tri_bodies_01.py | 67 ++++++++++++++++++++++++---- simulators/ursina_simulator.py | 2 +- 3 files changed, 61 insertions(+), 10 deletions(-) diff --git a/bodies/body.py b/bodies/body.py index 295808a..4c122e8 100644 --- a/bodies/body.py +++ b/bodies/body.py @@ -453,7 +453,7 @@ class Body(metaclass=ABCMeta): """ self.position = copy.deepcopy(self.init_position) self.velocity = copy.deepcopy(self.init_velocity) - + self.clear_his_position() # def kinetic_energy(self): # """ # 计算动能(千焦耳) diff --git a/sim_scenes/featured/tri_bodies_01.py b/sim_scenes/featured/tri_bodies_01.py index 9eae071..bc5da22 100644 --- a/sim_scenes/featured/tri_bodies_01.py +++ b/sim_scenes/featured/tri_bodies_01.py @@ -10,7 +10,12 @@ from bodies import Sun, Earth from common.consts import SECONDS_PER_WEEK, SECONDS_PER_YEAR, SECONDS_PER_MONTH, AU from sim_scenes.func import mayavi_run, ursina_run, create_sphere_sky from simulators.ursina.entities.body_timer import TimeData +from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent +from ursina import application, window, camera, EditorCamera +import numpy as np + +from simulators.ursina_simulator import UrsinaSimulator if __name__ == '__main__': """ @@ -27,32 +32,78 @@ if __name__ == '__main__': size_scale=5e1, texture="sun21.jpg", color=(250, 195, 47)), # 红色太阳 Sun(mass=2.5e30, init_position=[0, -8.5e8, -2000000], init_velocity=[12.0, 0, 0], size_scale=5e1, texture="sun21.jpg", color=(198, 29, 3)), # 黄色太阳 - Earth(init_position=[0, -3.5e8, 3000000], init_velocity=[13.360, 0, 0], + Earth(init_position=[0, -3.5e8, 3000000], init_velocity=[13.360, 0, 0], rotate_angle=0, size_scale=4e3, distance_scale=1), # 地球放大 4000 倍,距离保持不变 ] + + # 使用 mayavi 查看的运行效果 # mayavi_run(bodies, SECONDS_PER_WEEK, view_azimuth=0) def on_ready(): - from ursina import application, window - from ursina import camera - sky = create_sphere_sky(scale=80000, texture="bg_pan_blue.jpg") + window.borderless = False + sky = create_sphere_sky(scale=80000, texture="bg_pan_deep_blue.jpg") camera.clip_plane_near = 1 - camera.clip_plane_far = sky.scale_x*1.5 + camera.clip_plane_far = sky.scale_x * 1.5 + def on_timer_changed(time_data: TimeData): - pass + total_days = time_data.total_days + ec = UrsinaSimulator.EditorCamera + print(total_days) + if 100 < total_days < 3000: + camera.position += camera.right * 0.1 + camera.position += camera.down * 0.01 + elif 3200 < total_days < 3600: + ec.target_z -= 7.5 + elif 6000 < total_days < 7500: + camera.position += camera.right * 1 + camera.position += camera.down * 0.5 + elif 10800 < total_days < 12000: + camera.position += camera.right * 1 + # elif total_days > 10765: + elif total_days > 17000: + UrsinaEvent.on_reset() + # camera.position = UrsinaConfig.SCALE_FACTOR * np.array([10 * AU, -2 * AU, -20 * AU]), + # elif total_days > 3500: + # camera.position += camera.back * 0.1 + + def on_reset(): + reset_camera() + + + def reset_camera(): + # 参考 EditorCamera 中的 elif key == 'scroll up': + ec = UrsinaSimulator.EditorCamera + if not hasattr(ec, "original_target_z"): + ec.original_target_z = ec.target_z + camera.original_position = camera.position + else: + ec.target_z = ec.original_target_z + camera.position = camera.original_position + + UrsinaConfig.trail_type = "line" + # UrsinaConfig.trail_length = 91 + # UrsinaConfig.trail_type = "curve_line" + UrsinaConfig.trail_length = 50 + # UrsinaConfig.trail_length = 1000 + UrsinaConfig.trail_thickness_factor = 2 # 运行前会触发 on_ready UrsinaEvent.on_ready_subscription(on_ready) # 运行中,每时每刻都会触发 on_timer_changed UrsinaEvent.on_timer_changed_subscription(on_timer_changed) + UrsinaEvent.on_reset_subscription(on_reset) + # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(bodies, SECONDS_PER_YEAR / 3, cosmic_bg='', show_grid=False, - position=(20 * AU, 0, -40 * AU), + # position=(20 * AU, 0, -40 * AU), + position=(10 * AU, -2 * AU, -20 * AU), + show_camera_info=False, + show_control_info=False, show_trail=True, - timer_enabled=True) \ No newline at end of file + timer_enabled=True) diff --git a/simulators/ursina_simulator.py b/simulators/ursina_simulator.py index 65f84e2..a9fe698 100644 --- a/simulators/ursina_simulator.py +++ b/simulators/ursina_simulator.py @@ -404,7 +404,7 @@ class UrsinaSimulator(Simulator): audio = Audio(bg_music, pitch=1, loop=True, autoplay=True) audio.volume = 0.3 - EditorCamera(ignore_paused=True) + UrsinaSimulator.EditorCamera = EditorCamera(ignore_paused=True) if self.show_timer or self.timer_enabled: UrsinaEvent.on_reset() -- GitLab