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

Python超人-宇宙模拟器

上级 7ff01617
...@@ -363,6 +363,45 @@ def get_init_pos_vels(): ...@@ -363,6 +363,45 @@ def get_init_pos_vels():
return init_pos_vels return init_pos_vels
def get_init_pos_vels_2():
init_pos_vels = {}
init_pos_vels['sun'] = {}
init_pos_vels['sun']['pos'] = [-8885067.0000, 0.0000, 2311787.7500]
init_pos_vels['sun']['vel'] = [-0.0304, 0.0000, -0.0016]
init_pos_vels['mercury'] = {}
init_pos_vels['mercury']['pos'] = [-62266848.0000, 0.0000, -24917024.0000]
init_pos_vels['mercury']['vel'] = [16.2605, 0.0000, -43.2059]
init_pos_vels['venus'] = {}
init_pos_vels['venus']['pos'] = [72525272.0000, 0.0000, 83115816.0000]
init_pos_vels['venus']['vel'] = [-23.0332, 0.0000, 23.5375]
init_pos_vels['earth'] = {}
init_pos_vels['earth']['pos'] = [93683544.0000, 0.0000, -103641144.0000]
init_pos_vels['earth']['vel'] = [22.8265, 0.0000, 19.8364]
init_pos_vels['mars'] = {}
init_pos_vels['mars']['pos'] = [-74898024.0000, 0.0000, -211774608.0000]
init_pos_vels['mars']['vel'] = [23.1957, 0.0000, -7.7939]
init_pos_vels['asteroids'] = {}
init_pos_vels['asteroids']['pos'] = [0.0000, 0.0000, 0.0000]
init_pos_vels['asteroids']['vel'] = [0.0000, 0.0000, 0.0000]
init_pos_vels['jupiter'] = {}
init_pos_vels['jupiter']['pos'] = [-2776470.5000, 0.0000, -768231616.0000]
init_pos_vels['jupiter']['vel'] = [13.1263, 0.0000, 0.0694]
init_pos_vels['saturn'] = {}
init_pos_vels['saturn']['pos'] = [907136000.0000, 0.0000, -1055790848.0000]
init_pos_vels['saturn']['vel'] = [7.4217, 0.0000, 6.3457]
init_pos_vels['uranus'] = {}
init_pos_vels['uranus']['pos'] = [-2782867968.0000, 0.0000, 714746048.0000]
init_pos_vels['uranus']['vel'] = [-1.6953, 0.0000, -6.5996]
init_pos_vels['neptune'] = {}
init_pos_vels['neptune']['pos'] = [-2812751104.0000, 0.0000, 3651367424.0000]
init_pos_vels['neptune']['vel'] = [-4.3237, 0.0000, -3.2580]
init_pos_vels['pluto'] = {}
init_pos_vels['pluto']['pos'] = [-2529432576.0000, 0.0000, 5336828928.0000]
init_pos_vels['pluto']['vel'] = [-4.2408, 0.0000, -2.0510]
return init_pos_vels
def init_bodies_pos_vels(bodies): def init_bodies_pos_vels(bodies):
# 获取模拟的初始位置和速度 # 获取模拟的初始位置和速度
init_pos_vels = get_init_pos_vels() init_pos_vels = get_init_pos_vels()
......
...@@ -278,8 +278,8 @@ if __name__ == '__main__': ...@@ -278,8 +278,8 @@ if __name__ == '__main__':
# init_pos_vels['sun']['vel'] = [0.0093, 0.0037, 0.0014] # init_pos_vels['sun']['vel'] = [0.0093, 0.0037, 0.0014]
# print(b.planet.position, b.three_dim.planet.position) # print(b.planet.position, b.three_dim.planet.position)
# print("----------------------------------------------") print("----------------------------------------------")
# print(init_pos_vels_info) print(init_pos_vels_info)
# 订阅事件后,上面2个函数功能才会起作用 # 订阅事件后,上面2个函数功能才会起作用
......
...@@ -233,7 +233,7 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes): ...@@ -233,7 +233,7 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes):
exit() exit()
self.text_panel.text = colliding_info self.text_panel.text = colliding_info
self.camera_move(time_data) # self.camera_move(time_data)
def camera_move(self, time_data): def camera_move(self, time_data):
from ursina import camera from ursina import camera
......
...@@ -40,18 +40,20 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -40,18 +40,20 @@ class TwoWayFoilSim(UniverseSimScenes):
# region 构建太阳系 # region 构建太阳系
show_trail = True show_trail = True
self.sun = Sun(size_scale=0.6e2, show_trail=show_trail, self.sun = Sun(size_scale=0.8e2, show_trail=show_trail,
# color=(255, 250, 245), # color=(255, 250, 245),
# texture="", # texture="",
texture="sun_light.jpg" texture="sun_light.jpg"
) )
self.mercury = Mercury(size_scale=2e3, distance_scale=1.5, show_trail=show_trail) self.sun.glows = (24, 1.008, 0.04)
self.sun.set_resolution(200)
self.mercury = Mercury(size_scale=2e3, distance_scale=1.6, show_trail=show_trail)
self.venus = Venus(size_scale=2e3, distance_scale=1.5, show_trail=show_trail) self.venus = Venus(size_scale=2e3, distance_scale=1.5, show_trail=show_trail)
self.earth = Earth(size_scale=2e3, distance_scale=1.5, rotate_angle=0, show_trail=show_trail) self.earth = Earth(size_scale=2e3, distance_scale=1.5, rotate_angle=0, show_trail=show_trail)
self.mars = Mars(size_scale=2e3, distance_scale=1.4, show_trail=show_trail) self.mars = Mars(size_scale=2e3, distance_scale=1.4, show_trail=show_trail)
self.jupiter = Jupiter(size_scale=0.3e3, distance_scale=0.72, show_trail=show_trail) self.jupiter = Jupiter(size_scale=0.3e3, distance_scale=0.7, show_trail=show_trail)
self.saturn = Saturn(size_scale=0.3e3, distance_scale=0.52, show_trail=show_trail) self.saturn = Saturn(size_scale=0.3e3, distance_scale=0.52, show_trail=show_trail)
self.uranus = Uranus(size_scale=0.8e3, distance_scale=0.33, show_trail=show_trail) self.uranus = Uranus(size_scale=0.8e3, distance_scale=0.34, show_trail=show_trail)
self.neptune = Neptune(size_scale=0.8e3, distance_scale=0.25, show_trail=show_trail) self.neptune = Neptune(size_scale=0.8e3, distance_scale=0.25, show_trail=show_trail)
self.pluto = Pluto(size_scale=1e4, distance_scale=0.23, show_trail=show_trail) self.pluto = Pluto(size_scale=1e4, distance_scale=0.23, show_trail=show_trail)
self.bodies = [ self.bodies = [
...@@ -68,7 +70,7 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -68,7 +70,7 @@ class TwoWayFoilSim(UniverseSimScenes):
] ]
self.two_way_foil_dt_factor = 1 self.two_way_foil_dt_factor = 1
self.sun.two_way_foil_dt = 0.003 * self.two_way_foil_dt_factor # self.sun.two_way_foil_dt = 0.3 * self.two_way_foil_dt_factor
self.saturn.two_way_foil_dt = 0.005 * self.two_way_foil_dt_factor self.saturn.two_way_foil_dt = 0.005 * self.two_way_foil_dt_factor
self.uranus.two_way_foil_dt = 0.002 * self.two_way_foil_dt_factor self.uranus.two_way_foil_dt = 0.002 * self.two_way_foil_dt_factor
...@@ -89,7 +91,7 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -89,7 +91,7 @@ class TwoWayFoilSim(UniverseSimScenes):
""" """
from ursina import color from ursina import color
# 创建天空 # 创建天空
create_sphere_sky(scale=50000, rotation_x=200, rotation_y=None, rotation_z=45) create_sphere_sky(texture="bg_pan2.jpg", scale=50000, rotation_x=200, rotation_y=None, rotation_z=45)
# UrsinaConfig.trail_type = "curve_line" # UrsinaConfig.trail_type = "curve_line"
# UrsinaConfig.trail_length = 300 # UrsinaConfig.trail_length = 300
UrsinaConfig.trail_type = "line" UrsinaConfig.trail_type = "line"
...@@ -114,7 +116,7 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -114,7 +116,7 @@ class TwoWayFoilSim(UniverseSimScenes):
self.two_way_foil = QuadObj(texture='two_way_foil.png', self.two_way_foil = QuadObj(texture='two_way_foil.png',
# size_scale=4e7, # size_scale=4e7,
size_scale=1e6, size_scale=1e6,
init_velocity=[0, -50, 60], init_velocity=[0, -50*5, 60*5],
init_position=[0, 5 * AU, -6 * AU]) \ init_position=[0, 5 * AU, -6 * AU]) \
.set_light_disable(True) # .set_ignore_gravity(False) .set_light_disable(True) # .set_ignore_gravity(False)
# 不断扩展的圆形二向箔 # 不断扩展的圆形二向箔
...@@ -143,28 +145,44 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -143,28 +145,44 @@ class TwoWayFoilSim(UniverseSimScenes):
# 移动的信息: # 移动的信息:
# 按坐标系方向移动 x:右+左-, y:升+降-, z:前+(接近太阳)后-(远离太阳) # 按坐标系方向移动 x:右+左-, y:升+降-, z:前+(接近太阳)后-(远离太阳)
# 以摄像机视角移动 f:前 b:后 l:左 r:右 u:上 d:下 # 以摄像机视角移动 f:前 b:后 l:左 r:右 u:上 d:下
(0, {"f": 5.2}), (0, {"f": 5.758}),
# (1983, {"to": {"ct_id": 1, "t": 10}}), # (1983, {"to": {"ct_id": 1, "t": 10}}),
(10, {}), (11, {"f": 1.8}),
(12, {"f": 0.2}), (14, {"f": 2}),
(15, {"f": 0.3}), (18, {"f": 2}),
(18, {"f": 0.4}), (25, {"f": 1}),
(28, {"f": 0.2}),
# (30, {"f": 0.5}), # (30, {"f": 0.5}),
# (40, {"f": 0.6}), # (40, {"f": 0.6}),
(160, {"b": 2}), (33, {"b": 2}),
(1988, {"y": -3, "z": -12}), (50, {"f": 0.2}),
(1989, {"z": -8, "f": -5}), (65, {"f": 2}),
(1993, {"z": -8, "f": -3}), (69, {"f": 3}),
(1995, {"z": -8}), (70, {"f": 4}),
(2000, {"z": -8, "y": -0.2}), (75, {"f": 5}),
(2013, {}), (90, {"f": 3}),
(2048, {"f": 3}), (200, {}),
(2062, {"y": -3}), # (2000, {"exit": True}),
(2063, {"y": -10, "z": 2}), # (1989, {"z": -8, "f": -5}),
(2181, {}), # (1993, {"z": -8, "f": -3}),
# (1995, {"z": -8}),
# (2000, {"z": -8, "y": -0.2}),
# (2013, {}),
# (2048, {"f": 3}),
# (2062, {"y": -3}),
# (2063, {"y": -10, "z": 2}),
# (2181, {}),
# (2082, {"exit": True}) # (2082, {"exit": True})
(250, {"exit": True}),
] ]
if time_data.total_days > 120:
# self.two_way_foil_circle.planet.enabled = False
self.two_way_foil.scale_factor = 0.5
if 100 > time_data.total_days > 28:
self.two_way_foil.scale_factor -= 1.5e-3
def cond_cb(ps): def cond_cb(ps):
return ps["next_cond"] > time_data.total_days >= ps["cond"] return ps["next_cond"] > time_data.total_days >= ps["cond"]
...@@ -189,7 +207,21 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -189,7 +207,21 @@ class TwoWayFoilSim(UniverseSimScenes):
# if planet.scale_y_v > planet.init_scale_y / 50: # if planet.scale_y_v > planet.init_scale_y / 50:
if planet.scale_y_v > 0.5: if planet.scale_y_v > 0.5:
planet.scale_y_v /= 1.01 planet.scale_y_v /= 1.01
# else: else:
if planet is self.pluto.planet:
self.two_way_foil.init_velocity = [0, 0, 0]
def two_way_foil_update():
target = self.last_target()
# 让实体A向着实体B移动
dt = target.two_way_foil_dt if hasattr(target, "two_way_foil_dt") \
else 0.003 * self.two_way_foil_dt_factor
self.two_way_foil.planet.position = \
lerp(self.two_way_foil.planet.position, target.planet.position, dt)
self.two_way_foil.planet.update = two_way_foil_update
self.current_stage = self.stage_03
# self.gen_pixcel_image(planet) # self.gen_pixcel_image(planet)
planet.scale_x_v += 0.05 planet.scale_x_v += 0.05
...@@ -222,6 +254,9 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -222,6 +254,9 @@ class TwoWayFoilSim(UniverseSimScenes):
return body return body
return None return None
def last_target(self):
return self.sun
def stage_01(self): def stage_01(self):
""" """
二向箔飞向太阳 二向箔飞向太阳
...@@ -232,14 +267,14 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -232,14 +267,14 @@ class TwoWayFoilSim(UniverseSimScenes):
if two_bodies_colliding(self.two_way_foil, self.sun): if two_bodies_colliding(self.two_way_foil, self.sun):
# 隐藏原始二向箔,保持在原地,不在飞行 # 隐藏原始二向箔,保持在原地,不在飞行
# self.two_way_foil.planet.enabled = False # self.two_way_foil.planet.enabled = False
self.two_way_foil.init_velocity = [0, 0, 0] # self.two_way_foil.init_velocity = [0, 0, 0]
def two_way_foil_update(): def two_way_foil_update():
target = self.get_target() target = self.get_target()
if target is self.sun: # if target is self.sun:
# 关闭太阳的光晕 # # 关闭太阳的光晕
self.sun.hide_children() # self.sun.hide_children()
# 让实体A朝向实体B # 让实体A朝向实体B
# self.two_way_foil.planet.look_at(target) # self.two_way_foil.planet.look_at(target)
...@@ -259,7 +294,7 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -259,7 +294,7 @@ class TwoWayFoilSim(UniverseSimScenes):
self.two_way_foil.planet.update = two_way_foil_update self.two_way_foil.planet.update = two_way_foil_update
# 圆形二向箔显示并设置透明度为0.8 # 圆形二向箔显示并设置透明度为0.8
self.two_way_foil_circle.planet.alpha = 0.8 self.two_way_foil_circle.planet.alpha = 0.7
self.two_way_foil_circle.planet.enabled = True self.two_way_foil_circle.planet.enabled = True
# 当前阶段为 stage_02:二向箔压平天体的阶段 # 当前阶段为 stage_02:二向箔压平天体的阶段
self.current_stage = self.stage_02 self.current_stage = self.stage_02
...@@ -272,12 +307,12 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -272,12 +307,12 @@ class TwoWayFoilSim(UniverseSimScenes):
self.two_way_foil.planet.enabled = False self.two_way_foil.planet.enabled = False
# self.sun.two_dim.planet.init_scale += 0.05 # self.sun.two_dim.planet.init_scale += 0.05
# 圆形二向箔不断扩展变大 # 圆形二向箔不断扩展变大
self.two_way_foil_circle.planet.init_scale += 0.8 self.two_way_foil_circle.planet.init_scale += 0.4
# 调整天体二维化的时间,一般需要延时,保证扩展和二维化同步的真实效果 # 调整天体二维化的时间,一般需要延时,保证扩展和二维化同步的真实效果
two_way_delay_times = [0.5, # 太阳 two_way_delay_times = [0.5, # 太阳
0.5, 0.8, 1.0, # 水星 金星 地球 0.5, 0.8, 1.5, # 水星 金星 地球
1.2, 2.0, 3.0, # 火星 木星 土星 2.5, 4.0, 5.0, # 火星 木星 土星
4.0, 4.5, 5.5] # 天王星 海王星 冥王星 7, 8, 9] # 天王星 海王星 冥王星
for idx, b in enumerate(self.bodies): for idx, b in enumerate(self.bodies):
if isinstance(b, Obj): if isinstance(b, Obj):
# 二向箔不处理 # 二向箔不处理
...@@ -295,7 +330,13 @@ class TwoWayFoilSim(UniverseSimScenes): ...@@ -295,7 +330,13 @@ class TwoWayFoilSim(UniverseSimScenes):
b.two_way_time = time.time() b.two_way_time = time.time()
# 圆形二向箔不断旋转的效果 # 圆形二向箔不断旋转的效果
self.two_way_foil_circle.planet.rotation_z += 0.4 self.two_way_foil_circle.planet.rotation_z += 0.4 * 5
def stage_03(self):
# 如果二向箔和太阳碰撞
if two_bodies_colliding(self.two_way_foil, self.last_target()):
self.two_way_foil.init_velocity = [0, 0, 0]
self.two_way_foil.planet.update = lambda: None
def on_ready(self): def on_ready(self):
""" """
...@@ -387,6 +428,6 @@ if __name__ == '__main__': ...@@ -387,6 +428,6 @@ if __name__ == '__main__':
# video_recoder=True, # video_recoder=True,
show_control_info=False, show_control_info=False,
timer_enabled=True, timer_enabled=True,
show_timer=True, # show_timer=True,
show_grid=False show_grid=False
) )
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册