From 2b8f6bb4b6c7c2c3a9b4fc1617ec14af177e23a1 Mon Sep 17 00:00:00 2001 From: march3 Date: Sun, 2 Jul 2023 19:00:41 +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/func.py | 6 +- sim_scenes/science/speed_of_light_3d.py | 74 +++++++++++++++++++++++ sim_scenes/science/speed_of_light_init.py | 3 + 3 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 sim_scenes/science/speed_of_light_3d.py diff --git a/sim_scenes/func.py b/sim_scenes/func.py index 27a3526..01c98f9 100644 --- a/sim_scenes/func.py +++ b/sim_scenes/func.py @@ -244,9 +244,9 @@ def create_solar_system_bodies(ignore_mass=False, init_velocity=None): # parent=sun), # 小行星群模拟(仅 ursina 模拟器支持) Jupiter(name="木星", size_scale=0.3e3), # 木星放大 300 倍,距离保持不变 Saturn(name="土星", size_scale=0.3e3), # 土星放大 300 倍,距离保持不变 - Uranus(name="天王星", size_scale=0.4e3), # 天王星放大 400 倍,距离保持不变 - Neptune(name="海王星", size_scale=1e3), # 海王星放大 800 倍,距离保持不变 - Pluto(name="冥王星", size_scale=10e3), # 冥王星放大 10000 倍,距离保持不变(从太阳系的行星中排除) + Uranus(name="天王星", size_scale=0.3e3), # 天王星放大 300 倍,距离保持不变 + Neptune(name="海王星", size_scale=0.3e3), # 海王星放大 300 倍,距离保持不变 + Pluto(name="冥王星", size_scale=0.3e3), # 冥王星放大 300 倍,距离保持不变(从太阳系的行星中排除) ] # 遍历所有天体, diff --git a/sim_scenes/science/speed_of_light_3d.py b/sim_scenes/science/speed_of_light_3d.py new file mode 100644 index 0000000..1b53960 --- /dev/null +++ b/sim_scenes/science/speed_of_light_3d.py @@ -0,0 +1,74 @@ +# -*- coding:utf-8 -*- +# title :在太阳系中以光速运行(裸眼3D) +# description :在太阳系中以光速运行(裸眼3D) +# author :Python超人 +# date :2023-07-02 +# link :https://gitcode.net/pythoncr/ +# python_version :3.8 +# ============================================================================== +from common.consts import AU +from sim_scenes.func import ursina_run, create_solar_system_bodies, create_light_ship +from common.consts import LIGHT_SPEED +from sim_scenes.science.speed_of_light_init import SpeedOfLightInit + +# TODO: 三种不同的摄像机视角 +camera_follow_light = None # 摄像机固定,不会跟随光 +camera_follow_light = 'ForwardView' # 摄像机跟随光,方向是向前看 + +# 实例化一个初始化对象(订阅事件,记录到达每个行星所需要的时间) +init = SpeedOfLightInit(camera_follow_light) + +# TODO: 注意:这里的算法是基于牛顿的万有引力(质量为0不受引力的影响在天体物理学中是不严谨) +# 创建太阳系天体(忽略质量,引力无效,初速度全部为0) +bodies = create_solar_system_bodies(ignore_mass=True, init_velocity=[0, 0, 0]) + +camera_pos = "left" +# camera_pos = "right" +camera_l2r = 0.01 * AU + +if camera_pos == "right": # 摄像机右眼 + init.light_init_position[0] += camera_l2r +elif camera_pos == "left": # 摄像机左眼 + init.light_init_position[0] -= camera_l2r + +init.light_init_position[0] = 4000000 +init.light_init_position[1] = 1000000 +# init.auto_control_speed = True + +# 从 init 对象中获取 光体的大小(light_size_scale),光体的位置(light_init_position) +# 创建一个以光速前进的天体(模拟一个光子) speed=1光速=299792.458千米/秒,注意:质量为0才能达到光速,虽然如此,但也可以试试超光速 +light_ship = create_light_ship(init.light_size_scale, init.light_init_position, speed=LIGHT_SPEED * 1) +# 增加光速天体到天体集合 +bodies.append(light_ship) + +# 运行前指定bodies、light_body并订阅事件 +init.light_ship = light_ship +init.bodies = bodies +init.event_subscription() + + +def body_arrived(body): + if body.name == "火星": + light_ship.acceleration = [0, 35, 300] + elif body.name == "木星": + light_ship.acceleration = [0, -100, 200] + elif body.name == "土星": + light_ship.acceleration = [0, 55, 200] + elif body.name == "天王星": + light_ship.acceleration = [0, -50, 200] + elif body.name == "海王星": + light_ship.acceleration = [-3, 48, 300] + print(body) + + +init.body_arrived = body_arrived + +# 使用 ursina 查看的运行效果 +# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 +# position = 左-右+、上+下-、前+后- +ursina_run(bodies, 60, + position=init.camera_position, + show_trail=init.show_trail, + show_timer=True, + view_closely=init.view_closely, + bg_music="sounds/interstellar.mp3") diff --git a/sim_scenes/science/speed_of_light_init.py b/sim_scenes/science/speed_of_light_init.py index 0dfde29..10be621 100644 --- a/sim_scenes/science/speed_of_light_init.py +++ b/sim_scenes/science/speed_of_light_init.py @@ -37,6 +37,7 @@ class SpeedOfLightInit: self.__bodies = None self.view_closely = False self.auto_control_speed = False + self.body_arrived = None if self.__camera_follow_light in ["SideView"]: # 摄像机位置 = 前-后+、上+下-、左-右+、 @@ -282,6 +283,8 @@ class SpeedOfLightInit: continue # 计算判断,如果光速天体距离到达了某个天体,就记录到“已到达天体列表”中 if self.light_ship.position[2] >= body.position[2]: + if callable(self.body_arrived): + self.body_arrived(body) self.arrived_bodies.append(body) if self.text_panel is not None: self.arrived_info += f"[{time_data.time_text}]\t到达\t[{body.name}]\n\n" -- GitLab