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

Python超人-宇宙模拟器

上级 54dc0e89
...@@ -10,7 +10,7 @@ from bodies import Sun, Earth, Moon ...@@ -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 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 sim_scenes.func import mayavi_run, ursina_run, camera_look_at, two_bodies_colliding, set_camera_parent
from bodies.body import AU 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.ui.control_ui import ControlUI
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
from ursina import application, camera, Vec3 from ursina import application, camera, Vec3
...@@ -27,9 +27,8 @@ if __name__ == '__main__': ...@@ -27,9 +27,8 @@ if __name__ == '__main__':
""" """
# 地球的Y方向初始速度 # 地球的Y方向初始速度
EARTH_INIT_VELOCITY = 0 # 0km/s 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, 0], size_scale=1)
sun = Sun(init_position=[0, 0, AU], size_scale=1) earth = Earth(init_position=[0, 0, -AU],
earth = Earth(init_position=[0, 0, 0],
init_velocity=[0, EARTH_INIT_VELOCITY, 0], init_velocity=[0, EARTH_INIT_VELOCITY, 0],
size_scale=1).set_light_disable(True) size_scale=1).set_light_disable(True)
bodies = [ bodies = [
...@@ -40,29 +39,21 @@ if __name__ == '__main__': ...@@ -40,29 +39,21 @@ if __name__ == '__main__':
def on_ready(): def on_ready():
# 运行前触发 # 运行前触发
application.time_scale = 0.01 application.time_scale = 0.00001
camera.fov = 50 camera.fov = 50
def on_timer_changed(time_data): def on_timer_changed(time_data: TimeData):
if time_data.total_days < 18: camera_look_at(earth, rotation_z=0)
fov_offset = 0.1 earth_pos = earth.planet.world_position
elif time_data.total_days < 30: camera.world_position = Vec3(earth_pos[0], earth_pos[1] + 0.01, earth_pos[2] - 0.1)
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)
if two_bodies_colliding(sun, earth): if two_bodies_colliding(sun, earth):
ControlUI.current_ui.show_message("地球已到达太阳表面", close_time=-1) ControlUI.current_ui.show_message("地球已到达太阳表面", close_time=-1)
application.pause() application.pause()
# 设置计时器的最小时间单位为分钟 # 设置计时器的最小时间单位为分钟
BodyTimer().min_unit = BodyTimer.MIN_UNIT_HOURS BodyTimer().min_unit = BodyTimer.MIN_UNIT_HOURS
...@@ -76,6 +67,6 @@ if __name__ == '__main__': ...@@ -76,6 +67,6 @@ if __name__ == '__main__':
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后- # position = 左-右+、上+下-、前+后-
# position=(0, 0, 0) 的位置是站在地球视角,可以观看月相变化的过程 # 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_timer=True,
show_grid=True) show_grid=True)
...@@ -112,6 +112,8 @@ def ursina_run(bodies, ...@@ -112,6 +112,8 @@ def ursina_run(bodies,
cosmic_bg=None, cosmic_bg=None,
bg_music=None, bg_music=None,
show_grid=True, show_grid=True,
grid_position=None,
grid_scale=None,
show_trail=False, show_trail=False,
show_name=False, show_name=False,
show_timer=False, show_timer=False,
...@@ -179,6 +181,8 @@ def ursina_run(bodies, ...@@ -179,6 +181,8 @@ def ursina_run(bodies,
simulator.run(dt, simulator.run(dt,
cosmic_bg=cosmic_bg, cosmic_bg=cosmic_bg,
show_grid=show_grid, show_grid=show_grid,
grid_position=grid_position,
grid_scale=grid_scale,
show_timer=show_timer, show_timer=show_timer,
timer_enabled=timer_enabled, timer_enabled=timer_enabled,
bg_music=bg_music, bg_music=bg_music,
......
...@@ -26,11 +26,16 @@ class WorldGrid(Singleton, Entity): ...@@ -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_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) 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__() 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, 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() grid.set_light_off()
# self.draw_axises() # self.draw_axises()
......
...@@ -302,7 +302,17 @@ class UrsinaSimulator(Simulator): ...@@ -302,7 +302,17 @@ class UrsinaSimulator(Simulator):
if "show_grid" in kwargs: if "show_grid" in kwargs:
if kwargs["show_grid"]: 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: if "cosmic_bg" in kwargs:
cosmic_bg = kwargs["cosmic_bg"] cosmic_bg = kwargs["cosmic_bg"]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册