From 22c9b10654b52c016742050601d0d2c35b654d9f Mon Sep 17 00:00:00 2001 From: march3 Date: Mon, 22 Jan 2024 10:20:38 +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 --- common/celestial_data_service.py | 39 ++++++ sim_lab/two_way_foil_lab.py | 4 +- .../featured/jupiter_moon_protects_earth.py | 2 +- sim_scenes/featured/two_way_foil_sim.py | 113 ++++++++++++------ 4 files changed, 119 insertions(+), 39 deletions(-) diff --git a/common/celestial_data_service.py b/common/celestial_data_service.py index dbc67c9..2a07db8 100644 --- a/common/celestial_data_service.py +++ b/common/celestial_data_service.py @@ -363,6 +363,45 @@ def get_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): # 获取模拟的初始位置和速度 init_pos_vels = get_init_pos_vels() diff --git a/sim_lab/two_way_foil_lab.py b/sim_lab/two_way_foil_lab.py index 93793b5..d45b718 100644 --- a/sim_lab/two_way_foil_lab.py +++ b/sim_lab/two_way_foil_lab.py @@ -278,8 +278,8 @@ if __name__ == '__main__': # init_pos_vels['sun']['vel'] = [0.0093, 0.0037, 0.0014] # print(b.planet.position, b.three_dim.planet.position) - # print("----------------------------------------------") - # print(init_pos_vels_info) + print("----------------------------------------------") + print(init_pos_vels_info) # 订阅事件后,上面2个函数功能才会起作用 diff --git a/sim_scenes/featured/jupiter_moon_protects_earth.py b/sim_scenes/featured/jupiter_moon_protects_earth.py index a75cc09..330147d 100644 --- a/sim_scenes/featured/jupiter_moon_protects_earth.py +++ b/sim_scenes/featured/jupiter_moon_protects_earth.py @@ -233,7 +233,7 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes): exit() self.text_panel.text = colliding_info - self.camera_move(time_data) + # self.camera_move(time_data) def camera_move(self, time_data): from ursina import camera diff --git a/sim_scenes/featured/two_way_foil_sim.py b/sim_scenes/featured/two_way_foil_sim.py index 58aa468..b749c67 100644 --- a/sim_scenes/featured/two_way_foil_sim.py +++ b/sim_scenes/featured/two_way_foil_sim.py @@ -40,18 +40,20 @@ class TwoWayFoilSim(UniverseSimScenes): # region 构建太阳系 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), # texture="", 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.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.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.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.pluto = Pluto(size_scale=1e4, distance_scale=0.23, show_trail=show_trail) self.bodies = [ @@ -68,7 +70,7 @@ class TwoWayFoilSim(UniverseSimScenes): ] 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.uranus.two_way_foil_dt = 0.002 * self.two_way_foil_dt_factor @@ -89,7 +91,7 @@ class TwoWayFoilSim(UniverseSimScenes): """ 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_length = 300 UrsinaConfig.trail_type = "line" @@ -114,7 +116,7 @@ class TwoWayFoilSim(UniverseSimScenes): self.two_way_foil = QuadObj(texture='two_way_foil.png', # size_scale=4e7, size_scale=1e6, - init_velocity=[0, -50, 60], + init_velocity=[0, -50*5, 60*5], init_position=[0, 5 * AU, -6 * AU]) \ .set_light_disable(True) # .set_ignore_gravity(False) # 不断扩展的圆形二向箔 @@ -143,28 +145,44 @@ class TwoWayFoilSim(UniverseSimScenes): # 移动的信息: # 按坐标系方向移动 x:右+左-, y:升+降-, z:前+(接近太阳)后-(远离太阳) # 以摄像机视角移动 f:前 b:后 l:左 r:右 u:上 d:下 - (0, {"f": 5.2}), + (0, {"f": 5.758}), # (1983, {"to": {"ct_id": 1, "t": 10}}), - (10, {}), - (12, {"f": 0.2}), - (15, {"f": 0.3}), - (18, {"f": 0.4}), + (11, {"f": 1.8}), + (14, {"f": 2}), + (18, {"f": 2}), + (25, {"f": 1}), + (28, {"f": 0.2}), # (30, {"f": 0.5}), # (40, {"f": 0.6}), - (160, {"b": 2}), - (1988, {"y": -3, "z": -12}), - (1989, {"z": -8, "f": -5}), - (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, {}), + (33, {"b": 2}), + (50, {"f": 0.2}), + (65, {"f": 2}), + (69, {"f": 3}), + (70, {"f": 4}), + (75, {"f": 5}), + (90, {"f": 3}), + (200, {}), + # (2000, {"exit": True}), + # (1989, {"z": -8, "f": -5}), + # (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}) + (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): return ps["next_cond"] > time_data.total_days >= ps["cond"] @@ -189,8 +207,22 @@ class TwoWayFoilSim(UniverseSimScenes): # if planet.scale_y_v > planet.init_scale_y / 50: if planet.scale_y_v > 0.5: planet.scale_y_v /= 1.01 - # else: - # self.gen_pixcel_image(planet) + 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) planet.scale_x_v += 0.05 # 灯光关闭,不然压到2纬就会是黑色 @@ -222,6 +254,9 @@ class TwoWayFoilSim(UniverseSimScenes): return body return None + def last_target(self): + return self.sun + def stage_01(self): """ 二向箔飞向太阳 @@ -232,14 +267,14 @@ class TwoWayFoilSim(UniverseSimScenes): if two_bodies_colliding(self.two_way_foil, self.sun): # 隐藏原始二向箔,保持在原地,不在飞行 # 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(): target = self.get_target() - if target is self.sun: - # 关闭太阳的光晕 - self.sun.hide_children() + # if target is self.sun: + # # 关闭太阳的光晕 + # self.sun.hide_children() # 让实体A朝向实体B # self.two_way_foil.planet.look_at(target) @@ -259,7 +294,7 @@ class TwoWayFoilSim(UniverseSimScenes): self.two_way_foil.planet.update = two_way_foil_update # 圆形二向箔显示并设置透明度为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 # 当前阶段为 stage_02:二向箔压平天体的阶段 self.current_stage = self.stage_02 @@ -272,12 +307,12 @@ class TwoWayFoilSim(UniverseSimScenes): self.two_way_foil.planet.enabled = False # 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, # 太阳 - 0.5, 0.8, 1.0, # 水星 金星 地球 - 1.2, 2.0, 3.0, # 火星 木星 土星 - 4.0, 4.5, 5.5] # 天王星 海王星 冥王星 + 0.5, 0.8, 1.5, # 水星 金星 地球 + 2.5, 4.0, 5.0, # 火星 木星 土星 + 7, 8, 9] # 天王星 海王星 冥王星 for idx, b in enumerate(self.bodies): if isinstance(b, Obj): # 二向箔不处理 @@ -295,7 +330,13 @@ class TwoWayFoilSim(UniverseSimScenes): 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): """ @@ -387,6 +428,6 @@ if __name__ == '__main__': # video_recoder=True, show_control_info=False, timer_enabled=True, - show_timer=True, + # show_timer=True, show_grid=False ) -- GitLab