diff --git a/sim_scenes/solar_system/halley_comet_sim_03.py b/sim_scenes/solar_system/halley_comet_sim_03.py index 1583706ac358b20b7e5ff08c5ba9b7fd0c8bd536..1a1e11290d87ac903c8e80ab79e3f87f22a77686 100644 --- a/sim_scenes/solar_system/halley_comet_sim_03.py +++ b/sim_scenes/solar_system/halley_comet_sim_03.py @@ -25,7 +25,7 @@ from simulators.ursina.entities.entity_utils import get_value_direction_vectors from simulators.ursina.ui.control_ui import ControlUI from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent -from simulators.ursina.ursina_mesh import create_orbit_by_points +from simulators.ursina.ursina_mesh import create_orbit_by_points, create_label from dataclasses import dataclass from dataclasses import field @@ -181,6 +181,11 @@ class HalleyCometSim: t = self.start_time + time_data.total_days set_solar_system_celestial_position(self.bodies, t, False) + def create_year_label(self, trail, year, halley_comet_pos): + label = create_label(trail, label=year, pos=(0,0,0), color=(255, 255, 255), scale=40, alpha=1.0) + # label.udpate + label.set_light_off() + def on_timer_changed(self, time_data): """ @@ -188,6 +193,8 @@ class HalleyCometSim: @return: """ dt = time_data.get_datetime(str(self.start_time)) + year = dt.strftime("%Y") + if hasattr(self, "halley_comet"): # 哈雷彗星飞行的翻转效果 if self.halley_comet.planet.enabled: @@ -195,23 +202,30 @@ class HalleyCometSim: # self.halley_comet.planet.rotation_y += 1 self.halley_comet.planet.look_at(self.sun.planet) - d_sun = calculate_distance(self.halley_comet.position, self.sun.position) - d_earth = calculate_distance(self.halley_comet.position, self.earth.position) - trail_keys = self.halley_comet.planet.trails.keys() - last_trail = list(trail_keys)[-1] # self.halley_comet.planet.trails[list(trail_keys)[-1]] - if hasattr(last_trail, "entity_infos"): - # print(last_trail.entity_infos) - last_trail.entity_infos["distance_from_sun"] = d_sun - last_trail.entity_infos["distance_from_earth"] = d_earth - last_trail.entity_infos["time"] = dt.strftime("%Y-%m-%d") - # print(last_trail.entity_infos) - - panel_text = "哈雷彗星:\n距离太阳:%.3f AU" % (d_sun / AU) - panel_text += "\n距离地球:%.3f AU" % (d_earth / AU) - velocity, _ = get_value_direction_vectors(self.halley_comet.velocity) - panel_text += "\n当前速度:%.3f km/s" % velocity - - self.text_panel.text = panel_text + d_sun = calculate_distance(self.halley_comet.position, self.sun.position) + d_earth = calculate_distance(self.halley_comet.position, self.earth.position) + trail_keys = self.halley_comet.planet.trails.keys() + last_trail = list(trail_keys)[-1] # self.halley_comet.planet.trails[list(trail_keys)[-1]] + if hasattr(last_trail, "entity_infos"): + # print(last_trail.entity_infos) + last_trail.entity_infos["distance_from_sun"] = d_sun + last_trail.entity_infos["distance_from_earth"] = d_earth + last_trail.entity_infos["time"] = dt.strftime("%Y-%m-%d") + # print(last_trail.entity_infos) + + if not hasattr(self, "last_year"): + self.create_year_label(last_trail, year, self.halley_comet.planet.position) + elif self.last_year != year: + self.create_year_label(last_trail, year, self.halley_comet.planet.position) + + self.last_year = year + + panel_text = "哈雷彗星:\n距离太阳:%.3f AU" % (d_sun / AU) + panel_text += "\n距离地球:%.3f AU" % (d_earth / AU) + velocity, _ = get_value_direction_vectors(self.halley_comet.velocity) + panel_text += "\n当前速度:%.3f km/s" % velocity + + self.text_panel.text = panel_text self.set_bodies_position(time_data) diff --git a/simulators/ursina/entities/label.py b/simulators/ursina/entities/label.py new file mode 100644 index 0000000000000000000000000000000000000000..535373f1253293c79f8b91560fe4dea4d5458831 --- /dev/null +++ b/simulators/ursina/entities/label.py @@ -0,0 +1,19 @@ +# -*- coding:utf-8 -*- +# title :标签对象 +# description :标签对象 +# author :Python超人 +# date :2023-10-29 +# link :https://gitcode.net/pythoncr/ +# python_version :3.9 +# ============================================================================== +from ursina import Text, color + + +class Label(Text): + def __init__(self, text='', position=(0, 0, 0), **kwargs): + # def __init__(self, text='', start_tag=start_tag, end_tag=end_tag, ignore=True, **kwargs): + super().__init__( + text=text, + position=position, + **kwargs + ) diff --git a/simulators/ursina/ursina_mesh.py b/simulators/ursina/ursina_mesh.py index 1ba393811f6813e61b61fae7451aeb659464710d..1d12f955dddc1c48a7d6daf0508bebd6883c7458 100644 --- a/simulators/ursina/ursina_mesh.py +++ b/simulators/ursina/ursina_mesh.py @@ -18,6 +18,7 @@ from common.color_utils import conv_to_vec4_color from common.func import calculate_distance from simulators.ursina.entities.circle_line import CircleLine from simulators.ursina.entities.orbit_line import OrbitLine +from simulators.ursina.entities.label import Label from simulators.ursina.ursina_config import UrsinaConfig @@ -69,6 +70,11 @@ def create_sphere(radius, subdivisions): return Mesh(vertices=verts, triangles=tris, normals=normals, uvs=uvs, mode='triangle') +# def create_label(text, position=(0, 0, 0)): +# label = Label(text=text, position=position) +# return label + + def create_cone(radius, height, subdivisions, r=0.1): """ 创建一个圆锥 @@ -82,8 +88,8 @@ def create_cone(radius, height, subdivisions, r=0.1): normals = [] # 法线列表 uvs = [] # UV坐标列表 - p_h = r*height - d_h = (1-r)*height + p_h = r * height + d_h = (1 - r) * height # 生成圆锥底部的顶点和UV坐标 for i in range(subdivisions): @@ -189,6 +195,10 @@ def create_arrow(height=0.5, width=0.1): def create_label(parent, label, pos, color, scale=50, alpha=1.0): + if isinstance(color, tuple) or isinstance(color, list): + color = conv_to_vec4_color(color) + if alpha < 1: + color[3] = alpha text = Text(label, parent=parent, scale=scale, billboard=True, color=color, position=Vec3(pos) + Vec3(1, 1, 1), alpha=alpha, font=UrsinaConfig.CN_FONT, background=False)