提交 2b8f6bb4 编写于 作者: 三月三net's avatar 三月三net

Python超人-宇宙模拟器

上级 ae57da39
......@@ -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 倍,距离保持不变(从太阳系的行星中排除)
]
# 遍历所有天体,
......
# -*- 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")
......@@ -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"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册