From e9ab9d0a68a6ad61cca87265be6eeb187a877a19 Mon Sep 17 00:00:00 2001 From: march3 Date: Thu, 26 Oct 2023 11:53:10 +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/fiction/earth_orbit_stopped.py | 4 ++ sim_scenes/solar_system/halley_comet_sim.py | 5 +- simulators/ursina/ursina_mesh.py | 54 +++++++++++++++++---- 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/sim_scenes/fiction/earth_orbit_stopped.py b/sim_scenes/fiction/earth_orbit_stopped.py index 397be8c..3413721 100644 --- a/sim_scenes/fiction/earth_orbit_stopped.py +++ b/sim_scenes/fiction/earth_orbit_stopped.py @@ -145,12 +145,16 @@ class EarthOrbitStoppedSim: # 进入了水星轨道附近,才显示水星轨道线 if mercury_range[0] - 2 < time_data.total_days < mercury_range[1]: self.mercury_orbit_line.enabled = True + # 由于天体运行不是标准的圆形,则需要动态调整轨道的大小,保证轨道线始终在天体的中心位置 + self.mercury_orbit_line.auto_adj_scale() else: self.mercury_orbit_line.enabled = False # 进入了金星轨道附近,才显示金星轨道线 if venus_range[0] - 2 < time_data.total_days < venus_range[1]: self.venus_orbit_line.enabled = True + # 由于天体运行不是标准的圆形,则需要动态调整轨道的大小,保证轨道线始终在天体的中心位置 + self.venus_orbit_line.auto_adj_scale() else: self.venus_orbit_line.enabled = False diff --git a/sim_scenes/solar_system/halley_comet_sim.py b/sim_scenes/solar_system/halley_comet_sim.py index e4ba240..c3ae3dc 100644 --- a/sim_scenes/solar_system/halley_comet_sim.py +++ b/sim_scenes/solar_system/halley_comet_sim.py @@ -124,11 +124,8 @@ class HalleyCometSim: if i < 4: # 近日的天体绕行非常快,不调整轨道大小 continue - body = orbit_line.body # 由于天体运行不是标准的圆形,则需要动态调整轨道的大小,保证轨道线始终在天体的中心位置 - distance = calculate_distance(self.sun.position - body.position) - scale_rate = distance * UrsinaConfig.SCALE_FACTOR / orbit_line.radius - orbit_line.scale = scale_rate + orbit_line.auto_adj_scale() if __name__ == '__main__': diff --git a/simulators/ursina/ursina_mesh.py b/simulators/ursina/ursina_mesh.py index 7a78e36..c459458 100644 --- a/simulators/ursina/ursina_mesh.py +++ b/simulators/ursina/ursina_mesh.py @@ -197,7 +197,37 @@ def get_obj_planet_position(obj): return pos1 -def create_orbit_line(center_obj, orbiting_obj, thickness=5, line_color=None, alpha=0.6): +def adj_orbit_line_scale(center_obj, orbiting_obj, orbit_line): + """ + 由于天体运行不是标准的圆形,则需要动态调整轨道的大小,保证轨道线始终在天体的中心位置 + @param center_obj: 中心天体,一般为恒星天体 + @param orbiting_obj: 绕行天体,一般为行星天体 + @param orbit_line: 绕行天体轨道,一般为行星轨道 + @return: + """ + # + distance = calculate_distance(center_obj.position - orbiting_obj.position) + scale_rate = distance * UrsinaConfig.SCALE_FACTOR / orbit_line.radius + # 根据距离调整缩放 + orbit_line.scale = scale_rate + # 保证轨道中心的位置始终是中心天体的位置 + orbit_line.position = center_obj.planet.position + + +def create_orbit_line(center_obj, orbiting_obj, thickness=5, line_color=None, alpha=0.6, + rotation_x=90, rotation_y=None, rotation_z=None): + """ + 创建轨道 + @param center_obj: 中心天体,一般为恒星天体 + @param orbiting_obj: 绕行天体,一般为行星天体 + @param thickness: 轨道线的粗细 + @param line_color: 轨道线颜色,默认为绕行天体的拖尾颜色 + @param alpha: 轨道线的透明度 + @param rotation_x: + @param rotation_y: + @param rotation_z: + @return: + """ if isinstance(line_color, tuple) or isinstance(line_color, list): line_color = color.rgba(line_color[0] / 255, line_color[1] / 255, line_color[2] / 255, alpha) if line_color is None: @@ -206,16 +236,22 @@ def create_orbit_line(center_obj, orbiting_obj, thickness=5, line_color=None, al line_color = color.white else: line_color = color.rgba(line_color[0], line_color[1], line_color[2], alpha) - # line_color = adjust_brightness(line_color, 0.6) - # center_pos = get_obj_planet_position(center_obj) - # orbiting_pos = get_obj_planet_position(orbiting_obj) - distance1 = (center_obj.planet.position - orbiting_obj.planet.position).length() - # distance = calculate_distance(center_obj.position - orbiting_obj.position) - # distance2 = distance * UrsinaConfig.SCALE_FACTOR * 0.695 # / center_obj.planet.scale_x # * 0.0125 - orbit_line = create_circle_line(parent=None, radius=distance1, position=center_obj.planet.position, + + distance = (center_obj.planet.position - orbiting_obj.planet.position).length() + orbit_line = create_circle_line(parent=None, radius=distance, position=center_obj.planet.position, thickness=thickness, color=line_color, alpha=alpha) - orbit_line.rotation_x = 90 + if rotation_x is not None: + orbit_line.rotation_x = rotation_x + if rotation_y is not None: + orbit_line.rotation_y = rotation_y + if rotation_z is not None: + orbit_line.rotation_z = rotation_z + + def adj_scale(): + adj_orbit_line_scale(center_obj, orbiting_obj, orbit_line) + + orbit_line.auto_adj_scale = adj_scale # orbit_line.enabled = False # 默认不显示 return orbit_line -- GitLab