diff --git a/sim_scenes/featured/earth_seasons_live.py b/sim_scenes/featured/earth_seasons_live.py index a0b664976a64fefb4a689a233a343d98f38379e8..c6143a21f886e7dbe7649d9b73bb59f6a4c17c11 100644 --- a/sim_scenes/featured/earth_seasons_live.py +++ b/sim_scenes/featured/earth_seasons_live.py @@ -6,7 +6,7 @@ # link :https://gitcode.net/pythoncr/ # python_version :3.8 # ============================================================================== -from ursina import camera, window, Text, color +from ursina import camera, window, Text, color, Vec3, destroy from bodies import * from common.celestial_data_service import set_solar_system_celestial_position, conv_to_astropy_time, get_body_posvel @@ -21,23 +21,28 @@ from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent from simulators.ursina_simulator import UrsinaSimulator import numpy as np +import math class EarthSeasonsSimLive(EarthSeasonsSimBase): def __init__(self): super(EarthSeasonsSimLive, self).__init__(sun_transparent=False, - exit_at_total_days=370, + exit_at_total_days=3700, delay_run=False, earth_cn_size_factor=1.01, earth_clouds_size_factor=1.015) self.start_time = '2023-12-20 00:00:00' self.sun.size_scale = 3e1 - self.moon = Moon(name="月球", size_scale=5e3, + self.earth.size_scale = 2e3 + self.earth_clouds.size_scale = self.earth.size_scale + self.earth_cn.size_scale = self.earth.size_scale + + self.moon = Moon(name="月球", size_scale=2e3, rotation_speed=0.645 ) # 月球 - self.mercury = Mercury(size_scale=5e3) - self.venus = Venus(name="金星", size_scale=5e3) - self.mars = Mars(size_scale=5e3) + self.mercury = Mercury(size_scale=2e3) + self.venus = Venus(name="金星", size_scale=2e3) + self.mars = Mars(size_scale=2e3) self.jupiter = Jupiter(size_scale=1e3) self.saturn = Saturn(size_scale=1e3) self.uranus = Uranus(size_scale=4e3) @@ -73,9 +78,16 @@ class EarthSeasonsSimLive(EarthSeasonsSimBase): "冬至-2025": '2024-12-21 00:00:00', } + font = "fonts/DroidSansFallback.ttf" + from common.func import find_file + self.font = find_file(f"{font}", UrsinaConfig.CN_FONT) + for body in self.bodies: if body not in self.season_earths: self.planets.append(body) + else: + body.texture = "transparent.png" + body.show_trail = False def earth_text_display(self, term_name): for e in [self.earth_1, self.earth_2, self.earth_3, self.earth_4]: @@ -93,11 +105,37 @@ class EarthSeasonsSimLive(EarthSeasonsSimBase): def on_ready(self): super(EarthSeasonsSimLive, self).on_ready() - # camera_look_at(self.sun, rotation_z=0) - self.earth_1.planet.alpha = 0.2 - self.earth_2.planet.alpha = 0.2 - self.earth_3.planet.alpha = 0.2 - self.earth_4.planet.alpha = 0.2 + + UrsinaConfig.trail_type = "line" + # UrsinaConfig.trail_length = 91 + UrsinaConfig.trail_type = "curve_line" + UrsinaConfig.trail_length = 50 + # UrsinaConfig.trail_length = 1000 + UrsinaConfig.trail_thickness_factor = 2 + + for body in self.bodies: + body.planet.trail_scale = 3 + + self.moon.planet.trail_scale = 1 + + camera.clip_plane_near = 1 + # camera.clip_plane_far = sky.scale_x * 1.5 + + destroy(self.earth_clouds.planet) + destroy(self.earth_cn.planet) + # self.earth_cn.size_scale = self.earth.size_scale + + for e in self.season_earths: + # camera_look_at(self.sun, rotation_z=0) + # e.planet.scale = 0.1 + # e.planet.alpha = 0.2 + e.name_text.scale = Vec3(10, 10, 10) + e.name_text.font = self.font + destroy(e.name_text.background) + + # self.earth_2.planet.alpha = 0.2 + # self.earth_3.planet.alpha = 0.2 + # self.earth_4.planet.alpha = 0.2 self.earth.planet.name_text.enabled = False # , self.earth_clouds, self.earth_cn @@ -110,7 +148,7 @@ class EarthSeasonsSimLive(EarthSeasonsSimBase): self.moon.planet.rotation_y = 180 self.show_title() - camera.fov = 140 + # camera.fov = 140 window.borderless = True window.exit_button = False @@ -125,9 +163,14 @@ class EarthSeasonsSimLive(EarthSeasonsSimBase): dt = time_data.get_datetime(self.start_time) self.set_bodies_position(time_data) self.show_clock(dt) + self.camera_around() + + def camera_around(self): + ec = UrsinaSimulator.EditorCamera - # ec.target_z -= 0.05 - # camera.position += camera.left * 0.0001 + ec.rotation_y -= 0.01 * UrsinaConfig.run_speed_factor # 每帧绕y轴旋转1度 + # print(self.earth.planet.world_position) + # print(self.earth.planet.position) def set_bodies_position(self, time_data: TimeData): """ @@ -136,37 +179,38 @@ class EarthSeasonsSimLive(EarthSeasonsSimBase): @return: """ dt = conv_to_astropy_time(self.start_time) - center_pos = self.get_center_pos(dt) - year = int(dt.jyear) + t = dt + time_data.total_days + center_pos = self.get_center_pos(t) + set_solar_system_celestial_position(self.planets, t, True, recalc_moon_pos_scale=60, center_pos=center_pos) + + year = int(t.jyear) if self.last_year != year: for body in self.season_earths: jieqir = self.jieqis.get(f"{body.name}-{year}", None) if jieqir is not None: jieqir = conv_to_astropy_time(jieqir) - set_solar_system_celestial_position([body], jieqir, False, center_pos=center_pos) + set_solar_system_celestial_position([body], jieqir, False, center_pos=None) + body.abs_position = body.position self.last_year = year - t = dt + time_data.total_days - set_solar_system_celestial_position(self.planets, t, True, recalc_moon_pos_scale=180, center_pos=center_pos) + for body in self.season_earths: + body.position = body.abs_position + self.sun.position def exit_handle(self): UrsinaEvent.on_reset() return True def show_title(self): - font = "fonts/DroidSansFallback.ttf" - from common.func import find_file - font = find_file(f"{font}", UrsinaConfig.CN_FONT) aspect_ratio = window.aspect_ratio position, origin = (-0.5 * aspect_ratio - 0.1, 0.48), (-0.05, 0.1) position2, origin2 = (-0.5 * aspect_ratio - 0.1, 0.40), (-0.05, 0.1) # text1 = Text(text="太阳视角:观察日食月食", color=color.white, scale=2.5, position=position, # (-0.98, 0.48), # font=font) ext1 = Text(text="太阳视角:2024年重要天象", color=color.white, scale=2.5, position=position, # (-0.98, 0.48), - font=font) + font=self.font) text2 = Text(text="(地球自转放慢10倍)", color=color.white, scale=1.5, position=position2, # (-0.98, 0.48), - font=font) + font=self.font) # 2024年重要天象 def show_clock(self, dt): diff --git a/sim_scenes/featured/tri_bodies_01.py b/sim_scenes/featured/tri_bodies_01.py index e928db1d4aec9a22deead269ffdd3ce61ad7f305..2dd917d2d5cc687d773b055c01b0d91b073d6c9c 100644 --- a/sim_scenes/featured/tri_bodies_01.py +++ b/sim_scenes/featured/tri_bodies_01.py @@ -58,9 +58,9 @@ if __name__ == '__main__': window.borderless = True window.exit_button = False # window.fullscreen = True - window.position = (1920, 0) - # 设置窗口的宽度和高度 - window.size = (2340, 1079) + # window.position = (1920, 0) + # # 设置窗口的宽度和高度 + # window.size = (2340, 1079) sky = create_sphere_sky(scale=80000, texture="bg_pan_deep_blue.jpg") camera.clip_plane_near = 1 camera.clip_plane_far = sky.scale_x * 1.5 diff --git a/sim_scenes/func.py b/sim_scenes/func.py index aea9dc2c57424068d0d6a291c1122ada54a69f57..8fe3b2be4f13ea1939850904a38c1d05c4810e20 100644 --- a/sim_scenes/func.py +++ b/sim_scenes/func.py @@ -717,6 +717,7 @@ def speed_smooth_adjust_test(): def create_sphere_sky(texture="bg_pan.jpg", scale=8000, rotation_x=None, rotation_y=None, rotation_z=None): from common.image_utils import find_texture + from ursina import camera from simulators.ursina.entities.sphere_sky import SphereSky sky_texture = find_texture(texture, None) if sky_texture is not None: @@ -728,6 +729,8 @@ def create_sphere_sky(texture="bg_pan.jpg", scale=8000, rotation_x=None, rotatio sky.rotation_y = rotation_y if rotation_z is not None: sky.rotation_z = rotation_z + # camera.clip_plane_near = 1 + camera.clip_plane_far = sky.scale_x * 1.5 return sky else: print(f'`textures`目录下没有找到图片`{texture}`,请访问如下链接下载,下载后,将图片放在`textures`目录下') diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index 92033d0f08014e58b4b2960d03c973d77cb46427..98cff29046d981949d811f8981e9e54d8a62b83c 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -132,7 +132,7 @@ def create_trails(parent): if UrsinaConfig.trail_type == "curve_line": # 如果位置比较近,就不创建拖尾了,保证拖尾间隔一定的距离 # if last_pos_distance < parent.trail_scale * trail_int_scale / 5: - if last_pos_distance < 10: + if last_pos_distance < parent.trail_scale * trail_int_scale * UrsinaConfig.trail_factor: return else: # 如果位置比较近,就不创建拖尾了,保证拖尾间隔一定的距离 diff --git a/simulators/ursina/entities/planet.py b/simulators/ursina/entities/planet.py index 7e31b69b883e22aa027210474d3e5d416230f90a..4172703229a1995f44a90fcdaa8f20cc1f038e74 100644 --- a/simulators/ursina/entities/planet.py +++ b/simulators/ursina/entities/planet.py @@ -305,9 +305,9 @@ class Planet(Entity): # self.x = -pos[1] # self.y = pos[2] # self.z = pos[0] - self.main_entity.x = pos[0] - self.main_entity.y = pos[1] - self.main_entity.z = pos[2] + self.main_entity.world_x = pos[0] + self.main_entity.world_y = pos[1] + self.main_entity.world_z = pos[2] else: self.follow_parent()