From 10492b869606e82ebef41bf89be8084716549d73 Mon Sep 17 00:00:00 2001 From: march3 Date: Thu, 26 Oct 2023 10:46:12 +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 --- bodies/body.py | 2 +- bodies/fixed_stars/fixed_star.py | 4 +- bodies/jupiter.py | 4 +- bodies/mars.py | 4 +- bodies/mercury.py | 4 +- bodies/neptune.py | 4 +- bodies/pluto.py | 4 +- bodies/saturn.py | 4 +- bodies/sun.py | 4 +- bodies/uranus.py | 4 +- bodies/venus.py | 4 +- sim_scenes/solar_system/halley_comet_sim.py | 57 ++++++++++++++++----- simulators/ursina/ursina_mesh.py | 39 ++++++++++++++ 13 files changed, 115 insertions(+), 23 deletions(-) diff --git a/bodies/body.py b/bodies/body.py index 6a634e9..9e74020 100644 --- a/bodies/body.py +++ b/bodies/body.py @@ -26,7 +26,7 @@ class Body(metaclass=ABCMeta): text_color=None, texture=None, size_scale=1.0, distance_scale=1.0, rotation_speed=None, parent=None, ignore_mass=False, - is_fixed_star=False, show_trail=True,trail_color=None, show_name=False): + is_fixed_star=False, show_trail=True, trail_color=None, show_name=False): """ 天体类 @param name: 天体名称 diff --git a/bodies/fixed_stars/fixed_star.py b/bodies/fixed_stars/fixed_star.py index d18ea6e..4399439 100644 --- a/bodies/fixed_stars/fixed_star.py +++ b/bodies/fixed_stars/fixed_star.py @@ -27,7 +27,8 @@ class FixedStar(Body): init_velocity=[0, 0, 0], color=(0xFF, 0xFF, 0xFF), texture=None, size_scale=1.0, distance_scale=1.0, - rotation_speed=0.1, ignore_mass=False, density=1.408e3, trail_color=None, + rotation_speed=0.1, ignore_mass=False, density=1.408e3, + show_trail=True, trail_color=None, texture_bright=None, texture_contrast=None, show_name=False): if texture is None or texture == "fixed_star.png": self.color = color @@ -45,6 +46,7 @@ class FixedStar(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/jupiter.py b/bodies/jupiter.py index 8f9c05c..50b04d9 100644 --- a/bodies/jupiter.py +++ b/bodies/jupiter.py @@ -26,7 +26,8 @@ class Jupiter(Body): init_position=[0, 0, 5.19 * AU], init_velocity=[-13.06, 0, 0], texture="jupiter.png", size_scale=1.0, distance_scale=1.0, - rotation_speed=36.2537, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=36.2537, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -39,6 +40,7 @@ class Jupiter(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/mars.py b/bodies/mars.py index d96837d..2ef052e 100644 --- a/bodies/mars.py +++ b/bodies/mars.py @@ -26,7 +26,8 @@ class Mars(Body): init_position=[0, 0, 1.52 * AU], init_velocity=[-24.13, 0, 0], texture="mars.jpg", size_scale=1.0, distance_scale=1.0, - rotation_speed=14.6223, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=14.6223, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -39,6 +40,7 @@ class Mars(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/mercury.py b/bodies/mercury.py index e6cc8cf..f7e12e5 100644 --- a/bodies/mercury.py +++ b/bodies/mercury.py @@ -27,7 +27,8 @@ class Mercury(Body): init_position=[0, 0, 0.384 * AU], init_velocity=[-47.87, 0, 0], texture="mercury.jpg", size_scale=1.0, distance_scale=1.0, - rotation_speed=0.2558, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=0.2558, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -40,6 +41,7 @@ class Mercury(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/neptune.py b/bodies/neptune.py index 66932bb..0407fad 100644 --- a/bodies/neptune.py +++ b/bodies/neptune.py @@ -27,7 +27,8 @@ class Neptune(Body): init_position=[0, 0, 30.7 * AU], init_velocity=[-5.43, 0, 0], texture="neptune.jpg", size_scale=1.0, distance_scale=1.0, - rotation_speed=22.3463, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=22.3463, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -40,6 +41,7 @@ class Neptune(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/pluto.py b/bodies/pluto.py index c9c5451..93870b5 100644 --- a/bodies/pluto.py +++ b/bodies/pluto.py @@ -27,7 +27,8 @@ class Pluto(Body): init_position=[0, 0, 39.55 * AU], init_velocity=[-4.7, 0, 0], texture="pluto.png", size_scale=1.0, distance_scale=1.0, - rotation_speed=-2.3474, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=-2.3474, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -40,6 +41,7 @@ class Pluto(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/saturn.py b/bodies/saturn.py index e6a4c9c..81ac4e5 100644 --- a/bodies/saturn.py +++ b/bodies/saturn.py @@ -27,7 +27,8 @@ class Saturn(Body): init_position=[0, 0, 9.5 * AU], init_velocity=[-9.64, 0, 0], texture="saturn.jpg", size_scale=1.0, distance_scale=1.0, - rotation_speed=33.7711, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=33.7711, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -40,6 +41,7 @@ class Saturn(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/sun.py b/bodies/sun.py index fc17f52..0a2a1c4 100644 --- a/bodies/sun.py +++ b/bodies/sun.py @@ -23,7 +23,8 @@ class Sun(FixedStar): init_velocity=[0, 0, 0], color=(170, 98, 25), texture="sun2.jpg", size_scale=1.0, distance_scale=1.0, - rotation_speed=0.6130, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=0.6130, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -36,6 +37,7 @@ class Sun(FixedStar): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/uranus.py b/bodies/uranus.py index e592b3d..103fac2 100644 --- a/bodies/uranus.py +++ b/bodies/uranus.py @@ -27,7 +27,8 @@ class Uranus(Body): init_position=[0, 0, 19.2 * AU], init_velocity=[-6.81, 0, 0], texture="uranus.png", size_scale=1.0, distance_scale=1.0, - rotation_speed=-20.8816, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=-20.8816, ignore_mass=False, show_trail=True, + trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -40,6 +41,7 @@ class Uranus(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/bodies/venus.py b/bodies/venus.py index 4ca8454..64f0d77 100644 --- a/bodies/venus.py +++ b/bodies/venus.py @@ -27,7 +27,8 @@ class Venus(Body): init_position=[0, 0, 0.721 * AU], init_velocity=[-35, 0, 0], texture="venus.jpg", size_scale=1.0, distance_scale=1.0, - rotation_speed=-0.0617, ignore_mass=False, trail_color=None, show_name=False): + rotation_speed=-0.0617, ignore_mass=False, + show_trail=True, trail_color=None, show_name=False): params = { "name": name, "mass": mass, @@ -40,6 +41,7 @@ class Venus(Body): "distance_scale": distance_scale, "rotation_speed": rotation_speed, "ignore_mass": ignore_mass, + "show_trail": show_trail, "trail_color": trail_color, "show_name": show_name } diff --git a/sim_scenes/solar_system/halley_comet_sim.py b/sim_scenes/solar_system/halley_comet_sim.py index 4fffc8e..b3f131e 100644 --- a/sim_scenes/solar_system/halley_comet_sim.py +++ b/sim_scenes/solar_system/halley_comet_sim.py @@ -17,7 +17,9 @@ from common.func import calculate_distance from objs import HalleComet, Obj from sim_scenes.func import camera_look_at, two_bodies_colliding, create_text_panel from sim_scenes.func import ursina_run, create_sphere_sky +from simulators.ursina.ursina_config import UrsinaConfig from simulators.ursina.ursina_event import UrsinaEvent +from simulators.ursina.ursina_mesh import create_orbit_line class HalleyCometSim: @@ -30,18 +32,27 @@ class HalleyCometSim: def build_solar_system(self): # region 构建太阳系 - self.sun = Sun(size_scale=0.8e2) + self.sun = Sun(size_scale=0.8e2, show_trail=False) + self.earth = Earth(size_scale=8e3, distance_scale=1, rotate_angle=0, show_trail=False) + self.mercury = Mercury(size_scale=4e3, distance_scale=1, show_trail=False) + self.venus = Venus(size_scale=4e3, distance_scale=1, show_trail=False) + self.mars = Mars(size_scale=4e3, distance_scale=1, show_trail=False) + self.jupiter = Jupiter(size_scale=1.68e3, distance_scale=1, show_trail=False) + self.saturn = Saturn(size_scale=1.68e3, distance_scale=1, show_trail=False) + self.uranus = Uranus(size_scale=3.5e3, distance_scale=1, show_trail=False) + self.neptune = Neptune(size_scale=3.5e3, distance_scale=1, show_trail=False) + self.pluto = Pluto(size_scale=1.5e5, distance_scale=1, show_trail=False) self.bodies = [ - self.sun, # 太阳放大 80 倍 - # Mercury(size_scale=4e3, distance_scale=1.3), # 水星放大 4000 倍,距离放大 1.3 倍 - # Venus(size_scale=4e3, distance_scale=1.3), # 金星放大 4000 倍,距离放大 1.3 倍 - Earth(size_scale=8e3, distance_scale=1, rotate_angle=0), # 地球放大 4000 倍,距离放大 1.3 倍 - # Mars(size_scale=4e3, distance_scale=1.2), # 火星放大 4000 倍,距离放大 1.2 倍 - Jupiter(size_scale=1.68e3, distance_scale=1), # 木星放大 680 倍,距离缩小到真实距离的 0.72 - Saturn(size_scale=1.68e3, distance_scale=1), # 土星放大 680 倍,距离缩小到真实距离的 0.52 - Uranus(size_scale=3.5e3, distance_scale=1), # 天王星放大 1500 倍,距离缩小到真实距离的 0.36 - Neptune(size_scale=3.5e3, distance_scale=1), # 海王星放大 1500 倍,距离缩小到真实距离的 0.27 - Pluto(size_scale=1.5e5, distance_scale=1), # 冥王星放大 10000 倍,距离缩小到真实距离的 0.23(从太阳系的行星中排除) + self.sun, # 太阳 + self.mercury, # 水星 + self.venus, # 金星 + self.earth, # 地球 + self.mars, # 火星 + self.jupiter, # 木星 + self.saturn, # 土星 + self.uranus, # 天王星 + self.neptune, # 海王星 + self.pluto, # 冥王星 ] # endregion @@ -60,7 +71,7 @@ class HalleyCometSim: # [3.33, 0, 10.655] 68 # [3.33, 0, 10.66] 69 self.halley_comet = HalleComet( # size_scale=4e7, - size_scale=1e8, + size_scale=0.5e8, init_velocity=[3.34, 0, 10.7], # [3.33, 0, 10.6] < ? <[3.34, 0, 10.7] init_position=[0, 0.5 * AU, -10 * AU]) \ .set_light_disable(True) @@ -77,10 +88,23 @@ class HalleyCometSim: @return: """ # 创建天空 + from ursina import scene + UrsinaConfig.trail_type = "line" # camera.clip_plane_near = 0.1 camera.clip_plane_far = 1000000 create_sphere_sky(scale=200000) application.time_scale = 5 + self.orbit_lines = [] + for body in self.bodies[1:]: + if isinstance(body, HalleComet): + continue + print("create_orbit_line", body) + orbit_line = create_orbit_line(self.sun, body) + orbit_line.body = body + self.orbit_lines.append(orbit_line) + # orbit_line.parent = scene + # self.earth_orbit = create_orbit_line(self.sun, self.earth) + # self.pluto_orbit = create_orbit_line(self.sun, self.pluto, alpha=1) self.text_panel = create_text_panel() @@ -99,6 +123,15 @@ class HalleyCometSim: d = calculate_distance(self.halley_comet.position, self.sun.position) self.text_panel.text = "哈雷彗星距离太阳:%.3f AU" % (d / AU) + for i, orbit_line in enumerate(self.orbit_lines): + if i < 4: + continue + body = orbit_line.body + distance = calculate_distance(self.sun.position - body.position) + scale_rate = distance * UrsinaConfig.SCALE_FACTOR * 0.695 / orbit_line.radius + orbit_line.scale = scale_rate + + if __name__ == '__main__': """ diff --git a/simulators/ursina/ursina_mesh.py b/simulators/ursina/ursina_mesh.py index 68110db..82898f1 100644 --- a/simulators/ursina/ursina_mesh.py +++ b/simulators/ursina/ursina_mesh.py @@ -15,6 +15,7 @@ import numpy as np import math 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.ursina_config import UrsinaConfig @@ -127,6 +128,7 @@ def create_circle_line(parent=None, radius=1, position=None, segments=100, thick circle_line = CircleLine(position=position, radius=radius, segments=segments, thickness=thickness, color=color, alpha=alpha) + circle_line.set_light_off(True) if parent is not None: if hasattr(parent, "planet"): parent = parent.planet @@ -195,6 +197,43 @@ def get_obj_planet_position(obj): return pos1 +def create_orbit_line(center_obj, orbiting_obj, thickness=5, line_color=None, alpha=0.6): + 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: + line_color = orbiting_obj.trail_color + if line_color is None: + 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 * 0.695, position=center_obj.planet.position, + thickness=thickness, color=line_color, + alpha=alpha) + orbit_line.rotation_x = 90 + # orbit_line.enabled = False # 默认不显示 + return orbit_line + + +def create_orbit_line2(center_obj, orbiting_obj, line_color=color.white, alpha=0.3): + 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) + # 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.0125 + orbit_line = create_circle_line(parent=center_obj, radius=distance2, thickness=2, color=line_color, alpha=alpha) + orbit_line.rotation_x = 90 + # orbit_line.enabled = False # 默认不显示 + return orbit_line + + def create_connecting_line(obj1, obj2, line_color=color.white, alpha=0.3): """ 创建物体之间的连接线 -- GitLab