diff --git a/sim_scenes/featured/bodies_size_sim.py b/sim_scenes/featured/bodies_size_sim.py index 36734ab260bb7cf4cb320684f64c1880d23d44b8..9252f0535ad8f31986f5a4408163432fefda81c2 100644 --- a/sim_scenes/featured/bodies_size_sim.py +++ b/sim_scenes/featured/bodies_size_sim.py @@ -15,7 +15,7 @@ from bodies import EtaCarinae, YCanumVenaticorum, VYCanisMajoris, UYScuti, Carin from bodies.jupiter_system import Io from common.consts import SECONDS_PER_HOUR, SECONDS_PER_DAY, AU -from sim_scenes.func import ursina_run, create_sphere_sky +from sim_scenes.func import ursina_run, create_sphere_sky, camera_move_control, get_run_speed_factor from sim_scenes.universe_sim_scenes import UniverseSimScenes from simulators.ursina.entities.body_timer import TimeData, AppTimeUtil from simulators.ursina.entities.entity_utils import create_directional_light @@ -29,58 +29,70 @@ class BodiesSizeSim(UniverseSimScenes): def __init__(self): self.D = AU / 30000 # earth1 = Earth("地球1", init_position=[0, 0, 0], rotate_angle=-23.44) + self.earth = Earth("地球", texture="earth2.jpg", rotate_angle=0, init_position=[3 * self.D, self.D, self.D]) self.bodies = [ - Pluto(name="冥王星", init_position=[-4*self.D, 0, 0]), - Moon("月球", init_position=[-3*self.D, 0, 0]), - Io(name="木卫一", init_position=[-2*self.D, 0, 0]), - Europa(name="木卫二", init_position=[-self.D, 0, 0]), - Ganymede(name="木卫三", init_position=[0, 0, 0]), - Callisto(name="木卫四", init_position=[self.D, 0, 0]), - Mercury(name="水星", init_position=[2*self.D, 0, 0]), - Mars(name="火星", init_position=[-4*self.D, self.D, self.D]), + Pluto(name="冥王星", init_position=[-4 * self.D, 0, 0]), + # Europa(name="木卫二", init_position=[-3 * self.D, 0, 0]), + Moon("月球", init_position=[-3 * self.D, 0, 0]), + Io(name="木卫一", init_position=[-2 * self.D, 0, 0]), + # Callisto(name="木卫四", init_position=[-1 * self.D, 0, 0]), + # Ganymede(name="木卫三", init_position=[-self.D, 0, 0]), + Mercury(name="水星", init_position=[-0.5*self.D, 0, 0]), + Mars(name="火星", init_position=[-4 * self.D, self.D, self.D]), Venus(name="金星", init_position=[-self.D, self.D, self.D]), - Earth("地球", texture="earth2.jpg", rotate_angle=0, init_position=[3 * self.D, self.D, self.D]), - Uranus(name="天王星", init_position=[-6*self.D, 5*self.D, 5*self.D]), - Neptune(name="海王星", init_position=[6*self.D, 5*self.D, 5*self.D]), - Saturn(name="土星", init_position=[-20*self.D, 11*self.D, 30*self.D]), # .show_rings(False), - Jupiter(name="木星", texture='jupiter_hd.jpg', init_position=[25*self.D, 14*self.D, 25*self.D]), - Sun(name="太阳", init_position=[70*self.D, 70*self.D, 250*self.D]), - Sirius(name="天狼星A", init_position=[-90*self.D, 120*self.D, 450*self.D]), - Alcyone(name="昴宿六", init_position=[-900*self.D, 1200*self.D, 1200*self.D]), # 质量倍数 6 半径倍数 9.5 - Arcturus(name="大角星", init_position=[2000*self.D, 3000*self.D, 4000*self.D]), # 质量倍数 1.1 半径倍数 25.7 - Aldebaran(name="毕宿五", init_position=[-5000*self.D, 4000*self.D, 9000*self.D]), # 质量倍数 1.16 半径倍数 44.13 - Rigel(name="参宿七", init_position=[9000*self.D, 8000*self.D, 13000*self.D]), # 质量倍数 18 半径倍数 78 + self.earth, + # Earth("地球", texture="earth2.jpg", rotate_angle=0, init_position=[3 * self.D, self.D, self.D]), + Uranus(name="天王星", init_position=[-6 * self.D, 5 * self.D, 5 * self.D]), + Neptune(name="海王星", init_position=[6 * self.D, 5 * self.D, 5 * self.D]), + Saturn(name="土星", init_position=[-20 * self.D, 11 * self.D, 30 * self.D]), # .show_rings(False), + Jupiter(name="木星", texture='jupiter_hd.jpg', init_position=[25 * self.D, 14 * self.D, 25 * self.D]), + Sun(name="太阳", init_position=[70 * self.D, 70 * self.D, 250 * self.D]), + Sirius(name="天狼星A", init_position=[-90 * self.D, 120 * self.D, 450 * self.D]), + Alcyone(name="昴宿六", init_position=[-900 * self.D, 1200 * self.D, 1200 * self.D]), # 质量倍数 6 半径倍数 9.5 + Arcturus(name="大角星", init_position=[2000 * self.D, 3000 * self.D, 4000 * self.D]), # 质量倍数 1.1 半径倍数 25.7 + Aldebaran(name="毕宿五", init_position=[-5000 * self.D, 4000 * self.D, 9000 * self.D]), + # 质量倍数 1.16 半径倍数 44.13 + Rigel(name="参宿七", init_position=[9000 * self.D, 8000 * self.D, 13000 * self.D]), # 质量倍数 18 半径倍数 78 # # YCanumVenaticorum(name="猎犬座Y", init_position=[-90*self.D, 120*self.D, 450*self.D]), # 质量倍数 3.0 半径倍数 215 - EtaCarinae(name="海山二", init_position=[-15000*self.D, 28000*self.D, 45000*self.D]), # 质量倍数 125 半径倍数 278 + EtaCarinae(name="海山二", init_position=[-15000 * self.D, 28000 * self.D, 45000 * self.D]), + # 质量倍数 125 半径倍数 278 # # Antares(name="心宿二", init_position=[-90*self.D, 120*self.D, 450*self.D]), # 质量倍数 15 半径倍数 680 - CarinaeV382(name="船底座V382", init_position=[35000*self.D, 70000*self.D, 150000*self.D]), # 质量倍数 39 半径倍数 747 + CarinaeV382(name="船底座V382", init_position=[35000 * self.D, 70000 * self.D, 150000 * self.D]), + # 质量倍数 39 半径倍数 747 # # Betelgeuse(name="参宿四", init_position=[-90*self.D, 120*self.D, 450*self.D]), # 质量倍数 19 半径倍数 1180 - VYCanisMajoris(name="大犬座VY", init_position=[-85000*self.D, 140000*self.D, 360000*self.D]), # 质量倍数 30 半径倍数 1400 + VYCanisMajoris(name="大犬座VY", init_position=[-85000 * self.D, 140000 * self.D, 360000 * self.D]), + # 质量倍数 30 半径倍数 1400 # # UYScuti(name="盾牌座 UY", init_position=[-85000*self.D, 140000*self.D, 360000*self.D]), # 盾牌座 UY 质量倍数 10 半径倍数 1708 - Stephenson_2_18(name="史蒂文森2-18", init_position=[95000*self.D, 200000*self.D, 800000*self.D]) # 史蒂文森2-18 质量倍数 40.0 半径倍数 2150 + Stephenson_2_18(name="史蒂文森2-18", init_position=[95000 * self.D, 200000 * self.D, 800000 * self.D]) + # 史蒂文森2-18 质量倍数 40.0 半径倍数 2150 ] - for body in self.bodies: + for idx, body in enumerate(self.bodies): # if body.rotation_speed == 0: body.rotation_speed = 10 body.init_velocity = [0, 0, 0] + body.text_scale = 3 body.ignore_mass = True def on_ready(self): # 运行前触发 # 为了较好的立体效果,可以增加太阳光线,光线直射地球(target=earth) - create_directional_light(position=([-1e2, -1e2, -5e4]), + create_directional_light(position=([-5e2, -5e2, -5e4]), light_num=3, - target= self.bodies[0]) + target=self.bodies[0]) camera.clip_plane_near = 0.001 camera.clip_plane_far = 50000000 camera.fov = 60 - application.time_scale = 0.001 + application.time_scale = 0.0001 sky = create_sphere_sky(scale=100000) # sky.alpha = 0.5 # sky.rotation_y = -90 sky.rotation_x = 200 # sky.rotation_z = 200 + for idx, body in enumerate(self.bodies): + if idx > 6: + body.planet.enabled = False + pass # for idx, body in enumerate(self.bodies): # if idx <= len(body_rotation_y) - 1: @@ -88,8 +100,117 @@ class BodiesSizeSim(UniverseSimScenes): # interval = 5 + def camera_move(self, time_data): + """ + 摄像机移动控制 + @param dt: + @return: + """ + from ursina import distance + # 摄像机移动控制数据 + camera_move_infos = [ + # 条件:年份 + # 移动的信息: + # 按坐标系方向移动 x:右+左-, y:升+降-, z:前+(接近太阳)后-(远离太阳) + # 以摄像机视角移动 f:前 b:后 l:左 r:右 u:上 d:下 + (0, {"r": 0.00008}), + (8, {"b": 0.0005, "u": 0.0001}), + (10, {"b": 0.005, "u": 0.001}), + (20, {"b": 0.5, "u": 0.1}), + (30, {"b": 1, "u": 0.2}), + (1000000, {"b": 0.02}), + (2000000, {}), + # (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}), + ] + + def cond_cb(ps): + return ps["next_cond"] > time_data.total_hours >= ps["cond"] + + d_earth = distance(camera.position, self.earth.planet.position) + distance_ctrl_infos = [ + (0.018, [7, 10]), + (0.025, [10, 12]), + (0.08, [12, 14]), + (0.3, [14, 15]), + (0.5, [15, 16]), + (100.05, None) + ] + for i, ctrl_info in enumerate(distance_ctrl_infos[:-1]): + d1, ctrl_info1 = ctrl_info + d2, ctrl_info2 = distance_ctrl_infos[i + 1] + if ctrl_info1 is None: + continue + if d1 < d_earth <= d2: + for idx, body in enumerate(self.bodies[ctrl_info1[0]:ctrl_info1[1]]): + if body.planet.enabled: + continue + body.planet.alpha = 0.0 + body.planet.enabled = True + self.set_alpha_animation(body, 0.0, 1.0, 0.1) + + print("d", d_earth) + # if d_earth > 0.025: + # for idx, body in enumerate(self.bodies[7:10]): + # if body.planet.enabled: + # continue + # body.planet.alpha = 0.0 + # body.planet.enabled = True + # self.set_alpha_animation(body, 0.0, 1.0, 0.01) + + camera_move_control(camera_move_infos, + cond_cb=cond_cb, + value_conv=self.s_f) + + def set_alpha_animation(self, body, begin_alpha, end_alpha, interval, is_destroy=False): + from ursina import destroy + if hasattr(body, "planet"): + planet = body.planet + else: + planet = body + planet.alpha = begin_alpha + if begin_alpha > end_alpha: + interval = -abs(interval) / self.record_rate + else: + interval = abs(interval) / self.record_rate + + origin_update = planet.update + + def alpha_animation(): + from ursina import camera, Vec4 + origin_update() + alpha = planet.alpha + alpha += interval + if (interval > 0 and alpha >= end_alpha) or (interval < 0 and alpha <= end_alpha): + alpha = end_alpha + planet.update = origin_update + + planet.enabled = (alpha > 0) + planet.alpha = alpha + if is_destroy and not planet.enabled: + destroy(planet) + # planet.color = Vec4(planet.color[0], planet.color[1], planet.color[2], alpha) + # print(body, planet.alpha, planet.rotation_x, planet.rotation_y, planet.rotation_z) + + planet.update = alpha_animation + + def s_f(self, value=1): + if value == 0: + return 0 + return get_run_speed_factor() * value + def on_timer_changed(self, time_data: TimeData): - pass + self.camera_move(time_data) def run(self): # 运行中,每时每刻都会触发 on_timer_changed @@ -101,7 +222,8 @@ class BodiesSizeSim(UniverseSimScenes): # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- ursina_run(self.bodies, SECONDS_PER_HOUR / 2, - position=[0, 0, -5e4], + position=[-2e4, 0, -0.8e4], + # position=[0, 0, -5e4], # position=[0, 2e4, -15e4], # 海王星 # position=[0, 2e4, -35e4], # 木星 # position=[0, 35e4, -150e4], # 太阳 @@ -115,12 +237,13 @@ class BodiesSizeSim(UniverseSimScenes): # position=[0, 80000e4, -300000e4], # 盾牌座 UY # position=[0, 70000e4, -280000e4], # 史蒂文森2-18 cosmic_bg='', - # show_name=True, + show_name=True, show_control_info=False, show_exit_button=False, show_camera_info=False, show_grid=False, # view_closely=True, + show_timer=True, timer_enabled=True) diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index a7de08d07117ca248234bf661c061990975a545e..42f9108cd817b336596fe7420b295b7694839e3d 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -31,9 +31,14 @@ def create_name_text(parent): @return: """ text_color = parent.body.text_color + if hasattr(parent.body, "text_scale"): + text_scale = parent.body.text_scale + else: + text_scale = 1 + font = find_file("fonts/DroidSansFallback.ttf", UrsinaConfig.CN_FONT) b_color = parent.body_view.color - name_text = Text(parent.body_view.body.name, scale=1, billboard=True, parent=parent, - font=UrsinaConfig.CN_FONT, background=True, + name_text = Text(parent.body_view.body.name, scale=text_scale, billboard=True, parent=parent, + font=font, background=True, origin=(0, 0)) name_text.background.color = color.rgba(b_color[0], b_color[1], b_color[2], 0.3) name_text.resolution = 24