diff --git a/bodies/body.py b/bodies/body.py index ab48a0517f99127428140eb8c6a289aece58a042..981b75db7a41f0156b42906733c924c7c8ba52b8 100644 --- a/bodies/body.py +++ b/bodies/body.py @@ -90,6 +90,8 @@ class Body(metaclass=ABCMeta): self.resolution = None self.light_disable = False + self.__has_rings = False + def set_light_disable(self, value): """ 设置灯光为无效 @@ -150,7 +152,11 @@ class Body(metaclass=ABCMeta): 是否为带光环的天体(土星为 True) :return: """ - return False + return self.__has_rings + + @has_rings.setter + def has_rings(self, value): + self.__has_rings = value @property def is_fixed_star(self): @@ -402,7 +408,17 @@ class Body(metaclass=ABCMeta): body_data.pop("is_fixed_star") body = FixedStar(**body_data) else: + has_rings = False + if "has_rings" in body_data: + if body_data["has_rings"]: + has_rings = True + body_data.pop("has_rings") + body = Body(**body_data) + + if has_rings: + body.has_rings = True + # [x, y, z]->[-y, z, x] # body.init_velocity = [-body.init_velocity[1],body.init_velocity[2],body.init_velocity[0]] # body.init_position = [-body.init_position[1],body.init_position[2],body.init_position[0]] diff --git a/data/gravity_slingshot_2.json b/data/gravity_slingshot_2.json new file mode 100644 index 0000000000000000000000000000000000000000..9e151748ae2107d11f8128d79b3acd14d90a6800 --- /dev/null +++ b/data/gravity_slingshot_2.json @@ -0,0 +1,108 @@ +{ + "bodies": [ + { + "name": "木星", + "mass": 1.8982e+27, + "init_position": [ + -37399468.0, + 0.0, + 0.0 + ], + "init_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "density": 1326.0, + "color": [ + 173, + 121, + 92 + ], + "texture": "jupiter1.jpg", + "size_scale": 100.0, + "distance_scale": 1.0, + "rotation_speed": 36.2537, + "ignore_mass": false, + "is_fixed_star": false, + "trail_color": [ + 173, + 121, + 92 + ] + }, + { + "name": "土星", + "mass": 5.6834e+26, + "init_position": [ + -183577232.0, + 0.0, + 99731912.0 + ], + "init_velocity": [ + 0.0, + 0.0, + 0.0 + ], + "density": 687.0, + "color": [ + 219, + 189, + 159 + ], + "has_rings": true, + "texture": "saturn.jpg", + "size_scale": 100.0, + "distance_scale": 1.0, + "rotation_speed": 33.7711, + "ignore_mass": false, + "is_fixed_star": false, + "trail_color": [ + 219, + 189, + 159 + ] + }, + { + "name": "地球", + "mass": 5.97237e+24, + "init_position": [ + 0.0, + 0.0, + 0.0 + ], + "init_velocity": [ + -38.0, + 0.0, + -0.20000000298023224 + ], + "density": 5507.85, + "color": [ + 7, + 0, + 162 + ], + "texture": "earth1.jpg", + "size_scale": 300.0, + "distance_scale": 1.0, + "rotation_speed": 15, + "ignore_mass": false, + "is_fixed_star": false, + "trail_color": [ + 7, + 0, + 162 + ] + } + ], + "params": { + "dt": 604800, + "position": [ + -80000000.0, + 29919574.139999997, + -224396806.04999998 + ], + "show_trail": true, + "show_name": false + } +} \ No newline at end of file diff --git a/sim_scenes/fiction/fixed_stars.py b/sim_scenes/fiction/fixed_stars_1.py similarity index 100% rename from sim_scenes/fiction/fixed_stars.py rename to sim_scenes/fiction/fixed_stars_1.py diff --git a/sim_scenes/fiction/fixed_stars_2.py b/sim_scenes/fiction/fixed_stars_2.py new file mode 100644 index 0000000000000000000000000000000000000000..2e418b2c59b09043812d5f840cb4512d030162eb --- /dev/null +++ b/sim_scenes/fiction/fixed_stars_2.py @@ -0,0 +1,62 @@ +# -*- coding:utf-8 -*- +# title :恒星演示 +# description :恒星演示 +# author :Python超人 +# date :2023-02-11 +# link :https://gitcode.net/pythoncr/ +# python_version :3.8 +# ============================================================================== +from bodies import Sun, Earth, Sirius, Rigel, Bellatrix, Alcyone, Antares, Arcturus, Aldebaran, Betelgeuse +from bodies import EtaCarinae, YCanumVenaticorum, VYCanisMajoris, UYScuti, CarinaeV382, Stephenson_2_18 +from common.consts import SECONDS_PER_WEEK, SECONDS_PER_MONTH, SECONDS_PER_YEAR, SECONDS_PER_DAY +from sim_scenes.func import mayavi_run, mpl_run, ursina_run +from bodies.body import Body, AU + +if __name__ == '__main__': + """ + 恒星演示 + """ + # 构建两个天体对象(太阳、地球) + D = 5e5 + SIZE_SCALE = 0.5 + bodies = [ + Earth(size_scale=SIZE_SCALE, ignore_mass=True), + Sun(size_scale=SIZE_SCALE, ignore_mass=True), # 太阳 + # Sirius(size_scale=SIZE_SCALE, ignore_mass=True), # 天狼星A 质量倍数 2.02 半径倍数 1.71 + Bellatrix(size_scale=SIZE_SCALE, ignore_mass=True), # 参宿五 质量倍数 8.6 半径倍数 5.75 + # Alcyone(size_scale=SIZE_SCALE, ignore_mass=True), # 昴宿六 质量倍数 6 半径倍数 9.5 + Arcturus(size_scale=SIZE_SCALE, ignore_mass=True), # 大角星 质量倍数 1.1 半径倍数 25.7 + # Aldebaran(size_scale=SIZE_SCALE, ignore_mass=True), # 毕宿五 质量倍数 1.16 半径倍数 44.13 + Rigel(size_scale=SIZE_SCALE, ignore_mass=True), # 参宿七 质量倍数 18 半径倍数 78 + # YCanumVenaticorum(size_scale=SIZE_SCALE, ignore_mass=True), # 猎犬座Y 质量倍数 3.0 半径倍数 215 + EtaCarinae(size_scale=SIZE_SCALE, ignore_mass=True), # 海山二 质量倍数 125 半径倍数 278 + # Antares(size_scale=SIZE_SCALE, ignore_mass=True), # 心宿二 质量倍数 15 半径倍数 680 + CarinaeV382(size_scale=SIZE_SCALE, ignore_mass=True), # 船底座V382 质量倍数 39 半径倍数 747 + # Betelgeuse(size_scale=SIZE_SCALE, ignore_mass=True), # 参宿四 质量倍数 19 半径倍数 1180 + # VYCanisMajoris(size_scale=SIZE_SCALE, ignore_mass=True), # 大犬座VY 质量倍数 30 半径倍数 1400 + # UYScuti(size_scale=SIZE_SCALE, ignore_mass=True), # 盾牌座 UY 质量倍数 10 半径倍数 1708 + Stephenson_2_18(size_scale=SIZE_SCALE, ignore_mass=True) # 史蒂文森2-18 质量倍数 40.0 半径倍数 2150 + ] + distance_sum = 0 + for idx, body in enumerate(bodies): + body.rotation_speed /= 10 + if body.is_fixed_star: + body.light_on = False # 关闭灯光效果,只有太阳对地球有灯光效果 + if idx == 0: + d = 0 + else: + # d = (body.raduis + bodies[idx - 1].raduis) * SIZE_SCALE + d = pow((body.raduis + bodies[idx - 1].raduis) * SIZE_SCALE, 1.0) * 1.1 + # d = body.raduis * SIZE_SCALE + # d = (body.diameter + bodies[idx - 1].diameter) * SIZE_SCALE * 1.1 + D + body.init_velocity = [0, 0, 0] + # body.init_position = [-(distance_sum + d), AU, body.raduis * SIZE_SCALE] + # d = (distance_sum + d) + body.init_position = [-body.raduis * SIZE_SCALE / 1.1, body.raduis * SIZE_SCALE/ 1.1, d] + distance_sum += d + + # 使用 ursina 查看的运行效果 + # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 + # position = 左-右+、上+下-、前+后- + ursina_run(bodies, SECONDS_PER_WEEK, position=(0, 100000, -AU / 500), + show_name=True, bg_music="sounds/universe_03.mp3") diff --git a/sim_scenes/func.py b/sim_scenes/func.py index 1ffeb7a9b7500a3f06705876162ef00ea6a7bca4..451e4a944e7d9f6c8057e296f98d1826517c2058 100644 --- a/sim_scenes/func.py +++ b/sim_scenes/func.py @@ -94,7 +94,7 @@ def ursina_run(bodies, "show_trail": show_trail, "show_name": show_name}) print(f"{save_as_json} 文件生成成功!") except Exception as e: - print(f"{save_as_json} 文件生成失败!" + str(e)) + raise Exception(f"{save_as_json} 文件生成失败!" + str(e)) return simulator = UrsinaSimulator(body_sys) view_azimuth = 0 # 暂时未用 diff --git a/sim_scenes/interest/images/eye.png b/sim_scenes/interest/images/eye.png index 0a0024bf88cfe1528599280998b7b3ca8f7dcb9c..81afcaf7276eadfdb83ee30bf9a7112547a0dd7d 100644 Binary files a/sim_scenes/interest/images/eye.png and b/sim_scenes/interest/images/eye.png differ diff --git a/sim_scenes/science/gravity_slingshot_2.py b/sim_scenes/science/gravity_slingshot_2.py index f089e0b2cf0d13bfd38611e067b8d224b1d4331d..d36f4675ce9091a10466394cbf9c895ae22c9c2c 100644 --- a/sim_scenes/science/gravity_slingshot_2.py +++ b/sim_scenes/science/gravity_slingshot_2.py @@ -13,17 +13,19 @@ from bodies.body import AU if __name__ == '__main__': """ - 模拟流浪地球经过木星、土星加速 + 模拟流浪地球通过木星、土星加速 """ + # params 为不同参数量的加速效果,j_pos为木星位置;s_pos为土星位置;e_vel为地球初始速度 + # 地球初始速度≈36km/s,通过木星加速到 42.43km/s(加速度为0时的速度),再通过土星加速到 108.64km/s(加速度为0时的速度) + params = {"j_pos": [-AU / 4, 0, 0], "s_pos": [-0.9 * AU + 7.5e6, 0, AU / 1.5], "e_vel": [-36, 0, -0.2]} + + # 地球初始速度≈38km/s,通过木星加速到 51.96km/s(加速度为0时的速度),再通过土星加速到 71.27km/s(加速度为0时的速度) + params = {"j_pos": [-AU / 4, 0, 0], "s_pos": [-1.3 * AU + 1.09e7, 0, AU / 1.5], "e_vel": [-38, 0, -0.2]} + bodies = [ - Jupiter(size_scale=1e2, init_position=[-AU / 4, 0, 0], init_velocity=[0, 0, 0]), # 木星放大 100 倍 - Saturn(size_scale=1e2, init_position=[-1.5 * AU, 0, AU / 1.5], init_velocity=[0, 0, 0]), # 土星放大 100 倍 - Earth(size_scale=3e2, # 地球放大 300 倍 - init_position=[0, 0, 0], # - # init_velocity=[0, 33, -1], - init_velocity=[-10, 0, -1], # 朝向木星的速度为 38km/s,-1 km/s 是为了防止地球正面对着木星冲去 - # init_velocity=[0, 50, -1], - ), + Jupiter(size_scale=1e2, init_position=params["j_pos"], init_velocity=[0, 0, 0]), # 木星放大 100 倍 + Saturn(size_scale=1e2, init_position=params["s_pos"], init_velocity=[0, 0, 0]), # 土星放大 100 倍 + Earth(size_scale=3e2, init_position=[0, 0, 0], init_velocity=params["e_vel"]), # 地球放大 300 倍 ] # 使用 mayavi 查看的运行效果 @@ -32,4 +34,4 @@ if __name__ == '__main__': # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- - ursina_run(bodies, SECONDS_PER_MONTH, position=(0, AU / 2, -2 * AU), show_trail=True, view_closely=True) + ursina_run(bodies, SECONDS_PER_WEEK, position=(-8e7, AU / 5, -1.5 * AU), show_trail=True, view_closely=True) diff --git a/sim_scenes/solar_system/earth_at_night.py b/sim_scenes/solar_system/earth_at_night.py index 47d54648298f775b381db7375c9e80000520dc4f..d53aed0930f865a2349962ad1f68dcbaaa1992cc 100644 --- a/sim_scenes/solar_system/earth_at_night.py +++ b/sim_scenes/solar_system/earth_at_night.py @@ -23,9 +23,9 @@ if __name__ == '__main__': Earth(texture="earth_at_night_hd.jpg", init_position=[0, 0, 0], init_velocity=[0, 0, 0], size_scale=100, ignore_mass=True).set_resolution(resolution), - Earth(texture="earth_hd.jpg", - init_position=[-10, 0, 0], init_velocity=[0, 0, 0], - size_scale=100, ignore_mass=True).set_resolution(resolution) + # Earth(texture="earth_hd.jpg", + # init_position=[-10, 0, 0], init_velocity=[0, 0, 0], + # size_scale=100, ignore_mass=True).set_resolution(resolution) ] # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 diff --git a/sim_scenes/ursina_json_sim.py b/sim_scenes/ursina_json_sim.py index 2138d3941bb0c6d5f5a2e75d3a224d92290c53e9..b28c70751f4ef61c28cc3484c5e2e3189b7e1f10 100644 --- a/sim_scenes/ursina_json_sim.py +++ b/sim_scenes/ursina_json_sim.py @@ -29,7 +29,9 @@ if __name__ == '__main__': # TODO: 去掉注释,完美数据的三体模型的演示05(画大花) # bodies, params = Body.build_bodies_from_json('../data/tri_bodies_perfect_05.json') # TODO: 去掉注释,引力弹弓的演示 - bodies, params = Body.build_bodies_from_json('../data/gravity_slingshot.json') + # bodies, params = Body.build_bodies_from_json('../data/gravity_slingshot.json') + # TODO: 去掉注释,引力弹弓的演示2(通过木星、土星加速) + bodies, params = Body.build_bodies_from_json('../data/gravity_slingshot_2.json') dt = params["dt"] if "dt" in params else SECONDS_PER_YEAR position = params["position"] if "position" in params else (0, 0, 0) diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index afbd643696c51d1766daea38170a36b3b2d3caca..1143151e419ac5746835a367c62cba762cb6727b 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -27,14 +27,16 @@ def create_name_text(parent): @return: """ b_color = parent.body_view.color - parent.name_text = Text(parent.body_view.body.name, scale=1, billboard=True, parent=parent, + name_text = Text(parent.body_view.body.name, scale=1, billboard=True, parent=parent, font=UrsinaConfig.CN_FONT, background=True, origin=(0, 0)) - parent.name_text.background.color = color.rgba(b_color[0], b_color[1], b_color[2], 0.3) + name_text.background.color = color.rgba(b_color[0], b_color[1], b_color[2], 0.3) + name_text.resolution = 24 # self.name_text.scale = self.scale inverse_color = get_inverse_color(b_color) - parent.name_text.color = color.rgba(inverse_color[0], inverse_color[1], inverse_color[2], 1) - return parent.name_text + name_text.color = color.rgba(inverse_color[0], inverse_color[1], inverse_color[2], 1) + parent.name_text = name_text + return name_text def trail_init(parent):