diff --git a/sim_scenes/funny/dancing_with_jupiter.py b/sim_scenes/funny/dancing_with_jupiter.py new file mode 100644 index 0000000000000000000000000000000000000000..c115d3907151b1607aeb231640d428bd7074e71b --- /dev/null +++ b/sim_scenes/funny/dancing_with_jupiter.py @@ -0,0 +1,56 @@ +# -*- 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, Jupiter, Mars, Venus +from common.consts import SECONDS_PER_YEAR, SECONDS_PER_MONTH, AU +from sim_scenes.func import mayavi_run, ursina_run, camera_look_at +from simulators.ursina.entities.body_timer import TimeData +from simulators.ursina.ursina_config import UrsinaConfig +from simulators.ursina.ursina_event import UrsinaEvent +from simulators.ursina.ursina_mesh import create_line +from ursina import color + +if __name__ == '__main__': + """ + 与木星跳舞 + """ + # 选择舞者 + Dancer = Earth # 舞者为地球 + Dancer = Venus # 舞者为金星 + Dancer = Mars # 舞者为火星 + + bodies = [ + Sun(size_scale=0.8e2), # 太阳放大 80 倍 + Dancer(size_scale=2e3), # 舞者放大 2000 倍 + Jupiter(size_scale=5e2), # 木星放大 500 倍 + ] + sun, dancer, jupiter = bodies[0], bodies[1], bodies[2] + + + def on_ready(): + camera_look_at(sun) + UrsinaConfig.trail_length = 235 + UrsinaConfig.trail_type = "line" + pass + + + def on_timer_changed(time_data: TimeData): + if int(time_data.total_days) % 10 == 0: + create_line(from_pos=jupiter.planet.position, to_pos=dancer.planet.position, color=color.white) + + + UrsinaEvent.on_ready_subscription(on_ready) + UrsinaEvent.on_timer_changed_subscription(on_timer_changed) + + # 使用 ursina 查看的运行效果 + # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 + # position = 左-右+、上+下-、前+后- + ursina_run(bodies, SECONDS_PER_YEAR, + position=(0, 20 * AU, 0), + show_timer=True, + show_trail=True) diff --git a/sim_scenes/solar_system/sun_earth_jupiter.py b/sim_scenes/solar_system/sun_earth_jupiter.py index de4df015c4a80d255a71b2523dc7f07d0753a183..454c52f7e7ef4c9fba7b079bff96c9ea6f1eb408 100644 --- a/sim_scenes/solar_system/sun_earth_jupiter.py +++ b/sim_scenes/solar_system/sun_earth_jupiter.py @@ -8,22 +8,43 @@ # ============================================================================== from bodies import Sun, Earth, Jupiter from common.consts import SECONDS_PER_YEAR, SECONDS_PER_MONTH, AU -from sim_scenes.func import mayavi_run, ursina_run +from sim_scenes.func import mayavi_run, ursina_run, camera_look_at +from simulators.ursina.entities.body_timer import TimeData +from simulators.ursina.ursina_config import UrsinaConfig +from simulators.ursina.ursina_event import UrsinaEvent +from simulators.ursina.ursina_mesh import create_line +from ursina import color if __name__ == '__main__': """ 太阳、地球、木星 """ + bodies = [ Sun(size_scale=5e1), # 太阳放大 50 倍 Earth(size_scale=2e3, distance_scale=1), # 地球放大 2000 倍,距离保持不变 Jupiter(size_scale=5e2, distance_scale=1), # 木星放大 500 倍,距离保持不变 ] + sun, earth, jupiter = bodies[0], bodies[1], bodies[2] + + + def on_ready(): + camera_look_at(sun, rotation_x=None, rotation_y=None, rotation_z=None) + UrsinaConfig.trail_length = 235 + UrsinaConfig.trail_type = "line" + pass + + + def on_timer_changed(time_data: TimeData): + if int(time_data.total_days) % 10 == 0: + # print(time_data.total_hours) + create_line(from_pos=jupiter.planet.position, to_pos=earth.planet.position, color=color.white) + - # 使用 mayavi 查看的运行效果 - # mayavi_run(bodies, SECONDS_PER_WEEK, view_azimuth=-45) + UrsinaEvent.on_ready_subscription(on_ready) + UrsinaEvent.on_timer_changed_subscription(on_timer_changed) # 使用 ursina 查看的运行效果 # 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹 # position = 左-右+、上+下-、前+后- - ursina_run(bodies, SECONDS_PER_MONTH, position=(0, AU, -4 * AU), show_trail=True) + ursina_run(bodies, SECONDS_PER_YEAR, position=(0, 20 * AU, 0), show_timer=True, show_trail=True) diff --git a/simulators/ursina/entities/body_timer.py b/simulators/ursina/entities/body_timer.py index 18e0ac58b47d157301c234c9e6b0a2988bfd4e67..d99c4d78613744a9c0fa14af30427ff5ce9e91e8 100644 --- a/simulators/ursina/entities/body_timer.py +++ b/simulators/ursina/entities/body_timer.py @@ -50,6 +50,10 @@ class TimeData: return self.total_seconds / 3600 + @property + def total_days(self): + return self.total_hours / 24 + class BodyTimer(Singleton): """ diff --git a/simulators/ursina/entities/entity_utils.py b/simulators/ursina/entities/entity_utils.py index 9f2d6ff5982644e3dcd1d77a7dfac03a0996de5e..40b6baf1ad59314eb644c85f062efb08f8e173b6 100644 --- a/simulators/ursina/entities/entity_utils.py +++ b/simulators/ursina/entities/entity_utils.py @@ -105,8 +105,10 @@ def create_trails(parent): if last_pos_distance < parent.trail_scale * trail_int_scale: # 间隔距离不小于1.2倍的拖尾球体 return - # trail = create_trail_line(parent, pos) # 拖尾为线条 - trail = create_trail_sphere(parent, pos) # 拖尾为球体 + if UrsinaConfig.trail_type == "line": + trail = create_trail_line(parent, pos) # 拖尾为线条 + else: + trail = create_trail_sphere(parent, pos) # 拖尾为球体 if trail is not None: create_trail_info(parent.body, trail) diff --git a/simulators/ursina/ui/control_ui.py b/simulators/ursina/ui/control_ui.py index b4ff62d0585108db7040d478635a908a7634f2a0..76cf18657ed6e9fca7d552388293fcb976bc354d 100644 --- a/simulators/ursina/ui/control_ui.py +++ b/simulators/ursina/ui/control_ui.py @@ -25,6 +25,8 @@ class ControlUI(UiPanel): 控制面板界面 """ def component_init(self): + + UrsinaEvent.after_ready_subscription(self.after_ready) self.start_button_text = "●" # 》●▲○◎ self.pause_button_text = "〓" # 〓 || ‖ self.no_trail_button_text = "○ " @@ -75,6 +77,9 @@ class ControlUI(UiPanel): return content + def after_ready(self): + self.slider_trail_length.value = UrsinaConfig.trail_length + def after_component_init(self): self.sec_per_time_switch.x = -0.4 self.on_off_switch.x = 0.2 diff --git a/simulators/ursina/ursina_config.py b/simulators/ursina/ursina_config.py index 81f8abf2f48e9825f88fd2dabd3a7eb0031e2dee..66386c2915700df4a6b0d1b1dcb9b9a7390d746d 100644 --- a/simulators/ursina/ursina_config.py +++ b/simulators/ursina/ursina_config.py @@ -37,6 +37,8 @@ class UrsinaConfig: show_trail = False # 拖尾球体的数量 trail_length = 100 + # 拖尾的类型(球体、线条) + trail_type = "sphere" # trail_type="line" or trail_type="sphere" # 默认秒数(0表示默认) seconds_per = 0 # # 控制摄像机动作速度(天体越大,速度越快,天体越小,速度越慢) diff --git a/simulators/ursina/ursina_event.py b/simulators/ursina/ursina_event.py index 50e7b8cd282b2952a2bf58b7d39588b92cff2b51..9532cc6b3284904c7ec6c20759088036371ef2ba 100644 --- a/simulators/ursina/ursina_event.py +++ b/simulators/ursina/ursina_event.py @@ -26,7 +26,8 @@ class UrsinaEvent: UrsinaEvent.on_start_funcs = [] # 运行准备的订阅事件 UrsinaEvent.on_ready_funcs = [] - + # 准备后的订阅事件 + UrsinaEvent.after_ready_funcs = [] # 搜索天体的订阅事件 UrsinaEvent.on_searching_bodies_funcs = [] # 应用运行的订阅事件 @@ -115,6 +116,19 @@ class UrsinaEvent: for f in UrsinaEvent.on_ready_funcs: f() + @staticmethod + def after_ready_subscription(fun): + UrsinaEvent.after_ready_funcs.append(fun) + + @staticmethod + def after_ready_unsubscription(fun): + UrsinaEvent.after_ready_funcs.remove(fun) + + @staticmethod + def after_ready(): + for f in UrsinaEvent.after_ready_funcs: + f() + @staticmethod def on_start_subscription(fun): UrsinaEvent.on_start_funcs.append(fun) diff --git a/simulators/ursina/ursina_mesh.py b/simulators/ursina/ursina_mesh.py index 83d4a287201a8149955d7edd91f2243bcbcab9b7..d61e1c9341cf9871255ed56b6319c1e0a7809eda 100644 --- a/simulators/ursina/ursina_mesh.py +++ b/simulators/ursina/ursina_mesh.py @@ -98,6 +98,17 @@ def create_label(parent, label, pos, color, scale=50, alpha=1.0): return text +def create_line(from_pos, to_pos, parent=None, alpha=1.0, len_scale=1,set_light_off=True, + color=color.white, thickness=1): + line = Entity(parent=parent, + model=Mesh(vertices=(from_pos * len_scale, to_pos * len_scale), + mode='line', thickness=thickness), + color=color, alpha=alpha) + if set_light_off: + line.set_light_off() + return line + + def create_arrow_line(from_pos, to_pos, parent=None, label=None, set_light_off=True, alpha=1.0, len_scale=0.5, color=color.white, thickness=2, @@ -123,6 +134,7 @@ def create_arrow_line(from_pos, to_pos, parent=None, label=None, line = Entity(parent=parent, model=Mesh(vertices=(from_pos * len_scale, to_pos * len_scale), mode='line', thickness=thickness), color=color, alpha=alpha) + arrow = Entity(parent=line, model=arrow_mesh, position=to_pos * len_scale, scale=thickness * arrow_scale, color=color, alpha=alpha) arrow.look_at(to_pos * 100) diff --git a/simulators/ursina_simulator.py b/simulators/ursina_simulator.py index 7d4977b2a873d76e8e3c958e287e09b5e4a4c1a0..8ce7fc7c30360bcfb0ca003716cf0f5685f11fd1 100644 --- a/simulators/ursina_simulator.py +++ b/simulators/ursina_simulator.py @@ -281,6 +281,8 @@ class UrsinaSimulator(Simulator): UrsinaEvent.on_ready() + UrsinaEvent.after_ready() + self.app.run()