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

Python超人-宇宙模拟器

上级 92b65ae6
...@@ -14,8 +14,9 @@ from bodies import Sun, Mercury, Venus, Earth, Mars, Asteroids, Jupiter, Saturn, ...@@ -14,8 +14,9 @@ from bodies import Sun, Mercury, Venus, Earth, Mars, Asteroids, Jupiter, Saturn,
from common.celestial_data_service import get_body_posvel, recalc_moon_position, calc_solar_acceleration, \ from common.celestial_data_service import get_body_posvel, recalc_moon_position, calc_solar_acceleration, \
set_solar_system_celestial_position, set_earth_rotation set_solar_system_celestial_position, set_earth_rotation
from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, AU from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, AU
from sim_scenes.func import ursina_run, camera_look_at from sim_scenes.func import ursina_run, camera_look_at, create_text_panel
from simulators.ursina.entities.body_timer import TimeData from simulators.ursina.entities.body_timer import TimeData
from simulators.ursina.entities.entity_utils import clear_trails
from simulators.ursina.ui.control_ui import ControlUI from simulators.ursina.ui.control_ui import ControlUI
from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_config import UrsinaConfig
from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina.ursina_event import UrsinaEvent
...@@ -28,9 +29,7 @@ class SolarSystemRealitySim: ...@@ -28,9 +29,7 @@ class SolarSystemRealitySim:
@param debug_mode: 是否为调试模式 @param debug_mode: 是否为调试模式
""" """
self.show_asteroids = False
self.clock_position_center = False self.clock_position_center = False
self.show_earth_clouds = False
self.debug_mode = False self.debug_mode = False
self.recalc_moon_pos = True self.recalc_moon_pos = True
...@@ -44,15 +43,15 @@ class SolarSystemRealitySim: ...@@ -44,15 +43,15 @@ class SolarSystemRealitySim:
# 地月缩放比例 # 地月缩放比例
# 为了更好的展示效果,需要对月球的位置重新计算(使得地月距离放大,月球相对地球方向不变),重新计算位置后,地球和月球可以放大1000倍以上 # 为了更好的展示效果,需要对月球的位置重新计算(使得地月距离放大,月球相对地球方向不变),重新计算位置后,地球和月球可以放大1000倍以上
if self.recalc_moon_pos: # 重新计算月球位置 # if self.recalc_moon_pos: # 重新计算月球位置
self.earth_size_scale = 10e3 if self.debug_mode else 1e3 # self.earth_size_scale = 10e3 if self.debug_mode else 1e3
self.sun_size_scale = 0.04e2 if self.debug_mode else 0.4e2 # self.sun_size_scale = 0.04e2 if self.debug_mode else 0.4e2
self.moon_size_scale = 2e3 # self.moon_size_scale = 2e3
else: # else:
# 不重新计算,则地月的距离相对整个太阳系会非常近,因此,月球只放大了30倍 # # 不重新计算,则地月的距离相对整个太阳系会非常近,因此,月球只放大了30倍
self.earth_size_scale = 2.5e1 # self.earth_size_scale = 2.5e1
self.moon_size_scale = 5e1 # self.moon_size_scale = 5e1
self.sun_size_scale = 1e1 # self.sun_size_scale = 1e1
self.earth_size_scale = 1 self.earth_size_scale = 1
self.moon_size_scale = 1 self.moon_size_scale = 1
...@@ -70,20 +69,22 @@ class SolarSystemRealitySim: ...@@ -70,20 +69,22 @@ class SolarSystemRealitySim:
self.earth_camera.camera_init_val = 0 self.earth_camera.camera_init_val = 0
self.moon = Moon(name="月球", size_scale=self.moon_size_scale, self.moon = Moon(name="月球", size_scale=self.moon_size_scale,
rotation_speed=0.4065) # 月球 rotation_speed=0.4065) # 月球
self.sun.show_trail = False
self.earth.trail_scale_factor = 0.2
self.moon.trail_scale_factor = 0.3
# 所有天体 # 所有天体
self.bodies = [self.sun, self.earth, self.earth_camera, self.moon] self.bodies = [self.sun, self.earth, self.earth_camera, self.moon]
def init_earth(self): # def init_earth(self):
""" # """
初始化地球 # 初始化地球
@return: # @return:
""" # """
# 让地球显示自转轴线 # # 让地球显示自转轴线
self.earth.rotate_axis_color = (255, 255, 50) # self.earth.rotate_axis_color = (255, 255, 50)
# 如果为调试模式,则太阳光对地球无效,方便查看 # # 如果为调试模式,则太阳光对地球无效,方便查看
if self.debug_mode: # if self.debug_mode:
self.earth.set_light_disable(True) # self.earth.set_light_disable(True)
def show_clock(self, dt): def show_clock(self, dt):
""" """
...@@ -119,10 +120,15 @@ class SolarSystemRealitySim: ...@@ -119,10 +120,15 @@ class SolarSystemRealitySim:
""" """
# 运行前触发 # 运行前触发
self.text_panel = create_text_panel()
self.text_panel.text = "太阳缩放:1.0\n地球缩放:1.0\n月球缩放:1.0"
# camera.rotation_z = -20 # camera.rotation_z = -20
# if self.debug_mode: # if self.debug_mode:
# camera.fov = 30 # 调试时,拉近摄像机距离 # camera.fov = 30 # 调试时,拉近摄像机距离
# camera.fov = 1 # camera.fov = 40
camera.clip_plane_near = 10
# camera.clip_plane_far = 1000000
camera.parent = self.earth_camera.planet camera.parent = self.earth_camera.planet
# camera.update = self.camera_update # camera.update = self.camera_update
...@@ -138,6 +144,7 @@ class SolarSystemRealitySim: ...@@ -138,6 +144,7 @@ class SolarSystemRealitySim:
# 设置后,可以调整鼠标键盘的控制速度 # 设置后,可以调整鼠标键盘的控制速度
application.time_scale = 2 application.time_scale = 2
# #
# def camera_update(self): # def camera_update(self):
# camera.x = -50 # 100 # camera.x = -50 # 100
...@@ -147,24 +154,83 @@ class SolarSystemRealitySim: ...@@ -147,24 +154,83 @@ class SolarSystemRealitySim:
# # 摄像机看向地球 # # 摄像机看向地球
# camera_look_at(self.earth) # camera_look_at(self.earth)
def body_show(self, body):
body.planet.enabled = True
body.show_trail = True
def body_hide(self, body):
body.planet.enabled = False
body.show_trail = False
# clear_trails(body.planet)
def body_scale(self, body, value):
body.planet.init_scale *= value
if hasattr(body.planet.main_entity, "trail_scale"):
body.planet.main_entity.trail_scale *= value
def set_camera_pos(self, time_data: TimeData): def set_camera_pos(self, time_data: TimeData):
# if time_data.total_days > 120: if time_data.total_days > 120:
# self.earth_camera.camera_init_val = +3000000 self.earth_camera.camera_init_val += 300000
# elif time_data.total_days > 90: elif time_data.total_days > 90:
# self.earth_camera.camera_init_val = +1200000 self.earth_camera.camera_init_val += 60000
# elif time_data.total_days > 90: elif time_data.total_days > 90:
# self.earth_camera.camera_init_val += 600000 self.earth_camera.camera_init_val += 20000
# elif time_data.total_days > 60: elif time_data.total_days > 30:
# self.earth_camera.camera_init_val += 100000 self.earth_camera.camera_init_val += 18000
elif time_data.total_days > 10:
self.earth_camera.camera_init_val += 4000
elif time_data.total_days > 2:
self.earth_camera.camera_init_val += 500
# if UrsinaConfig.trail_factor < 50:
# self.body_scale(1.002)
if time_data.total_days < 5:
self.earth.show_trail = False
self.moon.show_trail = False
if 30 > time_data.total_days > 5:
self.earth.show_trail = True
self.moon.show_trail = True
self.body_scale(self.moon, 1.0025)
self.body_scale(self.earth, 1.002)
elif 60 > time_data.total_days > 30:
# self.body_hide(self.moon)
self.body_scale(self.moon, 1.002)
self.body_scale(self.earth, 1.002)
self.body_scale(self.sun, 1.002)
elif 150 > time_data.total_days > 60:
self.earth.planet.init_scale = 0.01
self.earth.planet.main_entity.trail_scale = 0.03
# self.body_scale(self.earth, 0.02)
# self.body_hide(self.earth)
# self.earth.planet.init_scale = 0.01
# self.body_show(self.moon)
# self.body_scale(1.0015)
# self.sun_scale(1.0015)
# else:
# self.body_scale(1.002)
# self.sun_scale(1.0005)
print("%s,%s" % (round(self.moon.planet.body_scale, 1), time_data.total_days))
# camera.x = -300 # 100 # camera.x = -300 # 100
# camera.z = 200 # camera.z = 200
# camera.y += self.earth_camera.camera_init_val * UrsinaConfig.SCALE_FACTOR # camera.y += self.earth_camera.camera_init_val * UrsinaConfig.SCALE_FACTOR
camera.x = -60 # 100 # camera.x = -80 # 100
# camera.z = -10 # camera.z = -10
camera.y = 50 dis_au = round(camera.y / UrsinaConfig.SCALE_FACTOR / AU, 2)
if dis_au < 400:
if self.earth_camera.camera_init_val > 0:
camera.y += self.earth_camera.camera_init_val * UrsinaConfig.SCALE_FACTOR
else:
camera.y = 80
self.text_panel.text = "太阳大小缩放:%.1f\n地球大小缩放:%.1f\n月球大小缩放:%.1f\n摄像机距地球:%.2f天文单位" % \
(self.sun.planet.body_scale,
self.earth.planet.body_scale,
self.moon.planet.body_scale,
dis_au)
# UrsinaConfig.trail_factor = 3 * math.sqrt(camera.y / 250) # UrsinaConfig.trail_factor = 3 * math.sqrt(camera.y / 250)
pass pass
...@@ -183,7 +249,7 @@ class SolarSystemRealitySim: ...@@ -183,7 +249,7 @@ class SolarSystemRealitySim:
# 调整摄像机的位置 # 调整摄像机的位置
self.set_camera_pos(time_data) self.set_camera_pos(time_data)
# 摄像机看向地球 # 摄像机看向地球
camera_look_at(self.earth) camera_look_at(self.sun)
# 显示时钟 # 显示时钟
self.show_clock(dt) self.show_clock(dt)
......
...@@ -31,6 +31,15 @@ class Planet(Entity): ...@@ -31,6 +31,15 @@ class Planet(Entity):
clear_trails(self) clear_trails(self)
self.body.reset() self.body.reset()
@property
def init_scale(self):
return self.__init_scale
@init_scale.setter
def init_scale(self, val):
self.body_scale *= val / self.__init_scale
self.__init_scale = val
def __init__(self, body_view: BodyView): def __init__(self, body_view: BodyView):
self.body_view = body_view self.body_view = body_view
if hasattr(self.body, "rotation_speed"): if hasattr(self.body, "rotation_speed"):
...@@ -45,7 +54,9 @@ class Planet(Entity): ...@@ -45,7 +54,9 @@ class Planet(Entity):
else: else:
scale = self.body.size_scale * UrsinaConfig.SCALE_FACTOR scale = self.body.size_scale * UrsinaConfig.SCALE_FACTOR
self.init_scale = scale self.__init_scale = scale
self.body_scale = 1.0
if hasattr(body_view, "texture"): if hasattr(body_view, "texture"):
texture = load_texture(body_view.texture) texture = load_texture(body_view.texture)
# color.white # color.white
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册