diff --git a/sim_scenes/fiction/earth_orbit_stopped.py b/sim_scenes/fiction/earth_orbit_stopped.py index 397be8c777e5dbbb65fa4e5603fa7f661a02a294..3413721732baaf7863dcf83f49ca8fd4a55ef3b1 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 e4ba24084fbb0b2f7428d7b5db1b9f1818816e06..c3ae3dc327ea739bd78fb1edbed6fc867097bd7f 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 7a78e36aa9cb1a0923f7194ee9b92bd028e6dd8e..c4594583f4540288482ef93bc5b6432f40cc8ff1 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