From d28fe8b20cb5d913f0315d4f18b9179f896adeb0 Mon Sep 17 00:00:00 2001 From: march3 Date: Sat, 9 Dec 2023 20:55:23 +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 --- sim_scenes/featured/eight_stars_alignment.py | 53 ++++++++++++++++---- 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/sim_scenes/featured/eight_stars_alignment.py b/sim_scenes/featured/eight_stars_alignment.py index d61565d..d8e52bb 100644 --- a/sim_scenes/featured/eight_stars_alignment.py +++ b/sim_scenes/featured/eight_stars_alignment.py @@ -13,7 +13,7 @@ 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, \ set_solar_system_celestial_position, set_earth_rotation from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, SECONDS_PER_HOUR, AU -from sim_scenes.func import ursina_run +from sim_scenes.func import ursina_run, create_sphere_sky, two_bodies_colliding from sim_scenes.universe_sim_scenes import UniverseSimScenes from simulators.ursina.entities.body_timer import TimeData from simulators.ursina.ui.control_ui import ControlUI @@ -33,6 +33,7 @@ class SolarSystemRealitySim(UniverseSimScenes): self.show_earth_clouds = False self.debug_mode = False self.recalc_moon_pos = True + self.target_index = 0 def create_bodies(self): """ @@ -75,13 +76,19 @@ class SolarSystemRealitySim(UniverseSimScenes): # 所有天体 self.bodies = [self.sun] + self.planets + [self.moon] - self.camera_target = self.create_camera_target(init_position=[0, 0, -AU], size_scale=1e4) + self.ship = self.create_camera_target(init_position=[0, AU / 10, AU], size_scale=1e4) if self.show_earth_clouds: self.bodies += [self.earth_clouds] if self.show_asteroids: - self.bodies += [self.asteroids, self.camera_target] + self.bodies += [self.asteroids] + + self.bodies += [self.ship] + + self.targets = [self.earth, self.venus, self.mercury, + self.saturn, self.mars, self.jupiter, + self.uranus, self.neptune, self.sun] def init_earth(self): """ @@ -129,10 +136,9 @@ class SolarSystemRealitySim(UniverseSimScenes): @return: """ # 运行前触发 + self.set_window_size((1919, 1080), False) - if self.sky_texture is not None: - from simulators.ursina.entities.sphere_sky import SphereSky - SphereSky(texture=self.sky_texture).scale = 80000 + self.sky = create_sphere_sky(scale=80000) camera.clip_plane_near = 0.1 camera.clip_plane_far = 100000 @@ -144,16 +150,45 @@ class SolarSystemRealitySim(UniverseSimScenes): # 需要按照时间和日期来控制地球的自转,所以删除控制地球自转的属性 delattr(self.earth.planet, "rotation_speed") delattr(self.earth.planet, "rotspeed") - + self.ship.planet.update = lambda: None # 设置后,可以调整鼠标键盘的控制速度 application.time_scale = 1 + self.ship.planet.position = self.earth.planet.position + + def ship_go_target(self): + from ursina import distance + + if self.target_index > len(self.targets) - 1: + exit(0) + + + target = self.targets[self.target_index] + planet = target.planet.main_entity + + d = distance(planet, self.ship.planet) + # r = d * 10 + # if r<100: + # r = 100 + r = 500 + self.ship.planet.look_at(planet) + self.ship.planet.position += self.ship.planet.forward * r + + # d = distance(planet, self.ship.planet) + # if d / UrsinaConfig.SCALE_FACTOR < 900000: + if two_bodies_colliding(target, self.ship): + if not hasattr(planet, "arrived"): + self.target_index += 1 + planet.arrived = True + def on_timer_changed(self, time_data: TimeData): """ 事件绑定后,时时刻刻都会触发 @param time_data: @return: """ + self.ship_go_target() + dt = time_data.get_datetime(str(self.start_time)) # 设置天体的位置(包含速度和加速度的信息) self.set_bodies_position(time_data) @@ -236,8 +271,8 @@ if __name__ == '__main__': sim = SolarSystemRealitySim() sim.run( # debug_mode=True, # 是否调试模式 - # dt=SECONDS_PER_DAY , # 1秒=1天 - dt=SECONDS_PER_HOUR, # 1秒=1小时 + dt=SECONDS_PER_DAY , # 1秒=1天 + # dt=SECONDS_PER_HOUR, # 1秒=1小时 # dt=SECONDS_PER_HOUR, # 1秒=1小时 start_time='2149-12-10 12:00:00', # 九(八)星连珠的时间 # https://baijiahao.baidu.com/s?id=1654160345900112362 # show_asteroids=True, # 是否显示小行星带(图片模拟) -- GitLab