From 143fac2c54a92fdb9342f3f57f32ca2537eb0c1a Mon Sep 17 00:00:00 2001 From: march3 Date: Tue, 26 Mar 2024 16:35:40 +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 --- bodies/body.py | 3 +++ common/system.py | 6 ++++- objs/obj.py | 3 +++ .../featured/jupiter_moon_protects_earth.py | 25 ++++++++++--------- simulators/ursina/entities/entity_utils.py | 1 + 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/bodies/body.py b/bodies/body.py index 0fa85c1..295808a 100644 --- a/bodies/body.py +++ b/bodies/body.py @@ -327,6 +327,9 @@ class Body(metaclass=ABCMeta): self.__append_history(self.__his_acc, self.acceleration) # print(self.name, "his pos->", self.__his_pos) + def clear_his_position(self): + self.__his_pos.clear() + def his_position(self): """ 历史位置 diff --git a/common/system.py b/common/system.py index 1d62059..f49fc6f 100644 --- a/common/system.py +++ b/common/system.py @@ -220,7 +220,11 @@ class System(object): positions = [] for body in valid_bodies: masses.append(body.mass) - positions.append(body.position * 1000) + position = body.position + if not isinstance(position, np.ndarray): + position = np.array(position) + position = position * 1000 + positions.append(position) accelerations = self.calculate_gravitational_accelerations(masses, positions) diff --git a/objs/obj.py b/objs/obj.py index d9b077a..9154fc5 100644 --- a/objs/obj.py +++ b/objs/obj.py @@ -316,6 +316,9 @@ class Obj(metaclass=ABCMeta): self.__append_history(self.__his_acc, self.acceleration) # print(self.name, "his pos->", self.__his_pos) + def clear_his_position(self): + self.__his_pos.clear() + def his_position(self): """ 历史位置 diff --git a/sim_scenes/featured/jupiter_moon_protects_earth.py b/sim_scenes/featured/jupiter_moon_protects_earth.py index bd4590c..f00e003 100644 --- a/sim_scenes/featured/jupiter_moon_protects_earth.py +++ b/sim_scenes/featured/jupiter_moon_protects_earth.py @@ -36,8 +36,8 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes): # 分别保存太阳碰撞次数、木星碰撞次数、地球碰撞次数、月球碰撞次数、木星保护次数、月球保护次数 self.colliding_count = [0, 0, 0, 0, 0, 0] self.sun = Sun(name="太阳", size_scale=0.85e2, show_trail=False) # 太阳放大 80 倍,距离保持不变 - self.jupiter = Jupiter(name="木星", size_scale=0.45e3, ignore_mass=True, show_trail=False) # 木星放大 600 倍,距离保持不变 - self.earth = Earth(name="地球", size_scale=2.5e3, ignore_mass=True, show_trail=False ) # 地球放大 2000 倍,距离保持不变 + self.jupiter = Jupiter(name="木星", size_scale=0.45e3, ignore_mass=False, show_trail=False) # 木星放大 600 倍,距离保持不变 + self.earth = Earth(name="地球", size_scale=2.5e3, ignore_mass=False, show_trail=False ) # 地球放大 2000 倍,距离保持不变 self.moon = Moon(name="月球", size_scale=3.5e3, # 月球球放大 3000 倍,为了较好的效果,地月距离要比实际大 init_position=[self.earth_moon_d, 0, AU], init_velocity=[0, 0, 0], @@ -58,7 +58,7 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes): for i in range(comet_num): # 随机生成 comet_num 个石头 - comet = self.create_comet(i, gravity_only_for=[self.sun]) + comet = self.create_comet(i, gravity_only_for=[self.sun, self.earth, self.jupiter]) # comet = self.create_comet(i, gravity_only_for=[self.sun, self.jupiter, self.earth]) self.bodies.append(comet) self.comets.append(comet) @@ -248,8 +248,8 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes): def camera_move(self, time_data): from ursina import camera - camera.position += camera.left * 0.01 - camera_look_at(self.sun) + camera.position += camera.left * 1 + camera_look_at(self.sun, rotation_z=0) def on_ready(self): from ursina import application, window @@ -264,7 +264,7 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes): 0, "0.0%", 0, 0) camera_look_at(self.sun) - self.sky = create_sphere_sky(scale=8000) + self.sky = create_sphere_sky(scale=8000, texture="bg_pan2.jpg") self.sky.rotation_y = -180 self.sky.rotation_x = -20 # self.sky.rotation_z = -65 @@ -278,9 +278,9 @@ class JupiterMoonProtectsEarthSim(UniverseSimScenes): # UrsinaConfig.trail_length = 1000 UrsinaConfig.trail_thickness_factor = 2 - for b in self.bodies: - if isinstance(b, Rock): - print("岩石大小", b.name, b.planet.scale_x) + # for b in self.bodies: + # if isinstance(b, Rock): + # print("岩石大小", b.name, b.planet.scale_x) if __name__ == '__main__': @@ -304,11 +304,12 @@ if __name__ == '__main__': # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- - ursina_run(sim.bodies, SECONDS_PER_MONTH / 2, - position=(AU, AU * 5, -AU * 5), + ursina_run(sim.bodies, SECONDS_PER_MONTH / 1, + # position=(AU, AU * 5, -AU * 5), + position=(0, 0, -AU * 6), cosmic_bg='', show_grid=False, # show_exit_button=False, - show_camera_info=False, + # show_camera_info=False, show_control_info=False, timer_enabled=True) diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index 1cd6676..92033d0 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -346,6 +346,7 @@ def clear_trails(parent): for entity, pos in parent.trails.items(): destroy(entity) parent.trails.clear() + parent.body.clear_his_position() if hasattr(parent, "trail_last_pos"): delattr(parent, "trail_last_pos") if hasattr(parent, "last_trail"): -- GitLab