From af9acf6835f04961c7c630dfd96a6857de5f7c7a Mon Sep 17 00:00:00 2001 From: march3 Date: Sun, 23 Jul 2023 18:16:59 +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/asteroids.py | 2 ++ bodies/torus_zone.py | 2 ++ .../solar_system/solar_system_reality.py | 24 +++++++++++++++---- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/bodies/asteroids.py b/bodies/asteroids.py index 41f2aeb..26ef8ae 100644 --- a/bodies/asteroids.py +++ b/bodies/asteroids.py @@ -36,6 +36,7 @@ class Asteroids(TorusZone): subdivisions=64, size_scale=1.0, distance_scale=1.0, + rotate_angle=0, rotation_speed=0.002, # 小行星绕太阳转一圈的时间在数年到几十年之间不等。 parent=None): params = { @@ -50,6 +51,7 @@ class Asteroids(TorusZone): "size_scale": size_scale, "distance_scale": distance_scale, "rotation_speed": rotation_speed, + "rotate_angle": rotate_angle, "parent": parent } super().__init__(**params) diff --git a/bodies/torus_zone.py b/bodies/torus_zone.py index 080ecb6..7cf7e5a 100644 --- a/bodies/torus_zone.py +++ b/bodies/torus_zone.py @@ -23,6 +23,7 @@ class TorusZone(Body): subdivisions=64, size_scale=1.0, distance_scale=1.0, + rotate_angle=0, rotation_speed=0, parent=None): """ @@ -51,6 +52,7 @@ class TorusZone(Body): "size_scale": size_scale, "distance_scale": distance_scale, "rotation_speed": rotation_speed, + "rotate_angle": rotate_angle, "parent": parent } super().__init__(**params) diff --git a/sim_scenes/solar_system/solar_system_reality.py b/sim_scenes/solar_system/solar_system_reality.py index 337aaa0..86f4bd0 100644 --- a/sim_scenes/solar_system/solar_system_reality.py +++ b/sim_scenes/solar_system/solar_system_reality.py @@ -15,7 +15,7 @@ import numpy as np from astropy.coordinates import get_body_barycentric_posvel from astropy.time import Time -from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Moon +from bodies import Sun, Mercury, Venus, Earth, Mars, Asteroids, Jupiter, Saturn, Uranus, Neptune, Moon from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, AU from sim_scenes.func import ursina_run from simulators.ursina.entities.body_timer import TimeData @@ -73,6 +73,7 @@ if __name__ == '__main__': Earth(name="地球", size_scale=1e3), # 地球 Moon(name="月球", size_scale=2e3), # 月球 Mars(name="火星", size_scale=1.2e3), # 火星 + Asteroids(size_scale=1e2, parent=sun, rotate_angle=-20), Jupiter(name="木星", size_scale=4e2), # 木星 Saturn(name="土星", size_scale=4e2), # 土星 Uranus(name="天王星", size_scale=10e2), # 天王星 @@ -80,10 +81,14 @@ if __name__ == '__main__': ] names = get_bodies_names(bodies) + names = names.replace("Asteroids,", "") - def get_body_posvel(body, posvels): - posvel = posvels.get(body.__class__.__name__, None) + def get_body_posvel(body, posvels=None, time=None): + if posvels is None: + posvel = get_body_barycentric_posvel(body.__class__.__name__, time) + else: + posvel = posvels.get(body.__class__.__name__, None) return posvel @@ -97,14 +102,21 @@ if __name__ == '__main__': posvels = get_bodies_posvels(names, t) # earth_loc = None earth_pos = None + sun_pos = None for body in bodies: - posvel = get_body_posvel(body, posvels) + if isinstance(body, Asteroids): + posvel = None + else: + posvel = get_body_posvel(body, None, t) + if isinstance(body, Moon): posvel = recalc_moon_position(posvel, earth_pos) if posvel is None: - position, velocity = [0, 0, 0], [0, 0, 0] + position, velocity = [sun_pos.x.value * AU, + sun_pos.z.value * AU, + sun_pos.y.value * AU], [0, 0, 0] else: S_OF_D = 24 * 60 * 60 # 坐标单位:千米 速度单位:千米/秒 @@ -117,6 +129,8 @@ if __name__ == '__main__': if isinstance(body, Earth): # earth_loc = EarthLocation(x=posvel[0].x, y=posvel[0].y, z=posvel[0].z) earth_pos = posvel[0] + elif isinstance(body, Sun): + sun_pos = posvel[0] dt = time_data.get_datetime(str(current_time)) # print(time_data.get_datetime(str(current_time))) -- GitLab