From a191211d9c07b6fcd9c24c64581cad7f75bb4c7c Mon Sep 17 00:00:00 2001 From: march3 Date: Sat, 21 Oct 2023 21:02:29 +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(=E4=BB=A3=E7=A0=81=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=EF=BC=8C=E4=BB=A3=E7=A0=81=E7=9A=84=E6=B8=85=E7=90=86?= =?UTF-8?q?=E6=9C=AA=E5=88=A0=E9=99=A4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/celestial_data_service.py | 77 +++++++------ sim_scenes/tri_bodies/two_way_foil.py | 151 ++++++++++---------------- 2 files changed, 99 insertions(+), 129 deletions(-) diff --git a/common/celestial_data_service.py b/common/celestial_data_service.py index 606b298..7f671b9 100644 --- a/common/celestial_data_service.py +++ b/common/celestial_data_service.py @@ -268,7 +268,6 @@ def show_bodies_posvels(dt): def gen_real_pos_vel_bodies(body_names, dt): - import pytz # 安装 astropy 包 # pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com astropy @@ -281,59 +280,69 @@ def gen_real_pos_vel_bodies(body_names, dt): for body_name in str(body_names).split(","): earth_pos_vel = get_body_barycentric_posvel(body_name, dt) - pos,vel = earth_pos_vel[0],earth_pos_vel[1] + pos, vel = earth_pos_vel[0], earth_pos_vel[1] gen_body_str += f" init_pos_vels['{body_name.lower()}']={{}}\n" gen_body_str += f" init_pos_vels['{body_name.lower()}']['pos']=[%.4f,%.4f,%.4f]\n" % (pos.x.to(u.km).value, - pos.y.to(u.km).value, - pos.z.to(u.km).value) - gen_body_str += f" init_pos_vels['{body_name.lower()}']['vel']=[%.4f,%.4f,%.4f]\n" % (vel.x.to(u.km / u.second).value, - vel.y.to(u.km / u.second).value, - vel.z.to(u.km / u.second).value) + pos.y.to(u.km).value, + pos.z.to(u.km).value) + gen_body_str += f" init_pos_vels['{body_name.lower()}']['vel']=[%.4f,%.4f,%.4f]\n" % ( + vel.x.to(u.km / u.second).value, + vel.y.to(u.km / u.second).value, + vel.z.to(u.km / u.second).value) return gen_body_str - # pos, vel = earth_pos_vel[0], earth_pos_vel[1] - # print(f"{body_name}-坐标(公里):", [pos.x.to(u.km).value, - # pos.y.to(u.km).value, - # pos.z.to(u.km)].value) - # print(f"{body_name}-速度(公里/秒):", - # [vel.x.to(u.km / u.second).value, - # vel.y.to(u.km / u.second).value, - # vel.z.to(u.km / u.second).value]) + # pos, vel = earth_pos_vel[0], earth_pos_vel[1] + # print(f"{body_name}-坐标(公里):", [pos.x.to(u.km).value, + # pos.y.to(u.km).value, + # pos.z.to(u.km)].value) + # print(f"{body_name}-速度(公里/秒):", + # [vel.x.to(u.km / u.second).value, + # vel.y.to(u.km / u.second).value, + # vel.z.to(u.km / u.second).value]) def get_init_pos_vels(): init_pos_vels = {} init_pos_vels['sun'] = {} - init_pos_vels['sun']['pos'] = [120062.8111, -462734.9565, -198328.7512] - init_pos_vels['sun']['vel'] = [0.0093, 0.0037, 0.0014] + init_pos_vels['sun']['pos'] = [-4638653.0000, 0.0000, 1314332.6250] + init_pos_vels['sun']['vel'] = [-0.0165, 0.0000, -0.0097] init_pos_vels['mercury'] = {} - init_pos_vels['mercury']['pos'] = [-27459444.3141, 33659309.8266, 20887619.1358] - init_pos_vels['mercury']['vel'] = [-49.8268, -24.7415, -8.0569] + init_pos_vels['mercury']['pos'] = [-54412616.0000, 0.0000, 31280100.0000] + init_pos_vels['mercury']['vel'] = [-25.2667, 0.0000, -40.0561] init_pos_vels['venus'] = {} - init_pos_vels['venus']['pos'] = [21823958.6720, -97202911.8077, -45109059.0044] - init_pos_vels['venus']['vel'] = [34.0912, 7.0463, 1.0154] + init_pos_vels['venus']['pos'] = [-32341672.0000, 0.0000, -99861352.0000] + init_pos_vels['venus']['vel'] = [34.3770, 0.0000, -10.6676] init_pos_vels['earth'] = {} - init_pos_vels['earth']['pos'] = [-25983996.5057, 132369339.0025, 57373518.2429] - init_pos_vels['earth']['vel'] = [-29.7869, -4.9606, -2.1489] + init_pos_vels['earth']['pos'] = [140427392.0000, 0.0000, 45724572.0000] + init_pos_vels['earth']['vel'] = [-8.1280, 0.0000, 28.2277] init_pos_vels['mars'] = {} - init_pos_vels['mars']['pos'] = [-230623216.7918, -71477306.3132, -26561224.6080] - init_pos_vels['mars']['vel'] = [8.4564, -18.9614, -8.9250] + init_pos_vels['mars']['pos'] = [218751648.0000, 0.0000, -45263688.0000] + init_pos_vels['mars']['vel'] = [5.2205, 0.0000, 23.4601] + init_pos_vels['asteroids'] = {} + init_pos_vels['asteroids']['pos'] = [0.0000, 0.0000, 0.0000] + init_pos_vels['asteroids']['vel'] = [0.0000, 0.0000, 0.0000] init_pos_vels['jupiter'] = {} - init_pos_vels['jupiter']['pos'] = [-357712686.7572, 637570826.6050, 281973598.8065] - init_pos_vels['jupiter']['vel'] = [-11.7897, -5.0252, -1.8671] + init_pos_vels['jupiter']['pos'] = [769445760.0000, 0.0000, 2017638.5000] + init_pos_vels['jupiter']['vel'] = [0.0389, 0.0000, 13.0879] init_pos_vels['saturn'] = {} - init_pos_vels['saturn']['pos'] = [713384516.7012, -1202372203.9542, -527442445.4970] - init_pos_vels['saturn']['vel'] = [7.9649, 4.3679, 1.4610] + init_pos_vels['saturn']['pos'] = [-1330536704.0000, 0.0000, -454165280.0000] + init_pos_vels['saturn']['vel'] = [3.2189, 0.0000, -9.1974] init_pos_vels['uranus'] = {} - init_pos_vels['uranus']['pos'] = [-2666283945.3730, 544495773.6564, 276202868.3064] - init_pos_vels['uranus']['vel'] = [-1.5476, -6.3725, -2.7691] + init_pos_vels['uranus']['pos'] = [-1757163648.0000, 0.0000, 2272503808.0000] + init_pos_vels['uranus']['vel'] = [-5.3918, 0.0000, -4.1634] init_pos_vels['neptune'] = {} - init_pos_vels['neptune']['pos'] = [2602697275.5219, 3374419276.7397, 1316379531.2695] - init_pos_vels['neptune']['vel'] = [-4.4365, 2.9291, 1.3095] - return init_pos_vels + init_pos_vels['neptune']['pos'] = [-1480893824.0000, 0.0000, 4351772160.0000] + init_pos_vels['neptune']['vel'] = [-5.1466, 0.0000, -1.7189] + init_pos_vels['pluto'] = {} + init_pos_vels['pluto']['pos'] = [-1293909504.0000, 0.0000, 5770579968.0000] + init_pos_vels['pluto']['vel'] = [-4.5847, 0.0000, -1.0475] + + return init_pos_vels + if __name__ == '__main__': from astropy.time import Time # 时间 + # bodies = [ # sun, # 太阳放大 80 倍 # Mercury(size_scale=4e3, distance_scale=1.3), # 水星放大 4000 倍,距离放大 1.3 倍 diff --git a/sim_scenes/tri_bodies/two_way_foil.py b/sim_scenes/tri_bodies/two_way_foil.py index 6b280a4..9e7295f 100644 --- a/sim_scenes/tri_bodies/two_way_foil.py +++ b/sim_scenes/tri_bodies/two_way_foil.py @@ -6,23 +6,17 @@ # link :https://gitcode.net/pythoncr/ # python_version :3.9 # ============================================================================== -import threading import time -import datetime -from bodies import Sun, Earth, Moon -from objs import CoreValagaClas, SciFiBomber, WaterDrop, QuadObj, CircleObj -from common.consts import AU, SECONDS_PER_DAY, SECONDS_PER_WEEK, SECONDS_PER_MONTH -from sim_scenes.func import ursina_run, camera_look_at, create_main_entity, two_bodies_colliding -from simulators.ursina.entities.body_timer import TimeData -from simulators.ursina.entities.entity_utils import create_directional_light, create_rings -from simulators.ursina.ursina_config import UrsinaConfig -from simulators.ursina.ursina_event import UrsinaEvent from ursina import camera, application -from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, Asteroids -from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, SECONDS_PER_MONTH, SECONDS_PER_YEAR, AU -from sim_scenes.func import mayavi_run, ursina_run, create_sphere_sky +from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto +from common.celestial_data_service import get_init_pos_vels +from common.consts import SECONDS_PER_WEEK, AU +from objs import QuadObj, CircleObj, Obj +from sim_scenes.func import camera_look_at, two_bodies_colliding +from sim_scenes.func import ursina_run, create_sphere_sky +from simulators.ursina.entities.entity_utils import create_rings from simulators.ursina.ursina_event import UrsinaEvent @@ -33,48 +27,10 @@ class TwoWayFoilSim: def __init__(self): - self.three_dim_bodies = [] - self.two_dim_bodies = [] + # self.three_dim_bodies = [] + # self.two_dim_bodies = [] self.current_stage = self.stage_01 - def get_init_pos_vels(self): - init_pos_vels = {} - init_pos_vels['sun'] = {} - init_pos_vels['sun']['pos'] = [-4638653.0000, 0.0000, 1314332.6250] - init_pos_vels['sun']['vel'] = [-0.0165, 0.0000, -0.0097] - init_pos_vels['mercury'] = {} - init_pos_vels['mercury']['pos'] = [-54412616.0000, 0.0000, 31280100.0000] - init_pos_vels['mercury']['vel'] = [-25.2667, 0.0000, -40.0561] - init_pos_vels['venus'] = {} - init_pos_vels['venus']['pos'] = [-32341672.0000, 0.0000, -99861352.0000] - init_pos_vels['venus']['vel'] = [34.3770, 0.0000, -10.6676] - init_pos_vels['earth'] = {} - init_pos_vels['earth']['pos'] = [140427392.0000, 0.0000, 45724572.0000] - init_pos_vels['earth']['vel'] = [-8.1280, 0.0000, 28.2277] - init_pos_vels['mars'] = {} - init_pos_vels['mars']['pos'] = [218751648.0000, 0.0000, -45263688.0000] - init_pos_vels['mars']['vel'] = [5.2205, 0.0000, 23.4601] - init_pos_vels['asteroids'] = {} - init_pos_vels['asteroids']['pos'] = [0.0000, 0.0000, 0.0000] - init_pos_vels['asteroids']['vel'] = [0.0000, 0.0000, 0.0000] - init_pos_vels['jupiter'] = {} - init_pos_vels['jupiter']['pos'] = [769445760.0000, 0.0000, 2017638.5000] - init_pos_vels['jupiter']['vel'] = [0.0389, 0.0000, 13.0879] - init_pos_vels['saturn'] = {} - init_pos_vels['saturn']['pos'] = [-1330536704.0000, 0.0000, -454165280.0000] - init_pos_vels['saturn']['vel'] = [3.2189, 0.0000, -9.1974] - init_pos_vels['uranus'] = {} - init_pos_vels['uranus']['pos'] = [-1757163648.0000, 0.0000, 2272503808.0000] - init_pos_vels['uranus']['vel'] = [-5.3918, 0.0000, -4.1634] - init_pos_vels['neptune'] = {} - init_pos_vels['neptune']['pos'] = [-1480893824.0000, 0.0000, 4351772160.0000] - init_pos_vels['neptune']['vel'] = [-5.1466, 0.0000, -1.7189] - init_pos_vels['pluto'] = {} - init_pos_vels['pluto']['pos'] = [-1293909504.0000, 0.0000, 5770579968.0000] - init_pos_vels['pluto']['vel'] = [-4.5847, 0.0000, -1.0475] - - return init_pos_vels - def build_solar_system(self): # region 构建太阳系 self.sun = Sun(size_scale=0.8e2) @@ -84,7 +40,6 @@ class TwoWayFoilSim: Venus(size_scale=4e3, distance_scale=1.3), # 金星放大 4000 倍,距离放大 1.3 倍 Earth(size_scale=4e3, distance_scale=1.3, rotate_angle=0), # 地球放大 4000 倍,距离放大 1.3 倍 Mars(size_scale=4e3, distance_scale=1.2), # 火星放大 4000 倍,距离放大 1.2 倍 - # Asteroids(size_scale=1e2, parent=self.sun), # 小行星模拟(仅 ursina 模拟器支持) Jupiter(size_scale=0.68e3, distance_scale=0.72), # 木星放大 680 倍,距离缩小到真实距离的 0.72 Saturn(size_scale=0.68e3, distance_scale=0.52), # 土星放大 680 倍,距离缩小到真实距离的 0.52 Uranus(size_scale=1.5e3, distance_scale=0.36), # 天王星放大 1500 倍,距离缩小到真实距离的 0.36 @@ -92,7 +47,8 @@ class TwoWayFoilSim: Pluto(size_scale=10e3, distance_scale=0.23), # 冥王星放大 10000 倍,距离缩小到真实距离的 0.23(从太阳系的行星中排除) ] # endregion - init_pos_vels = self.get_init_pos_vels() + + init_pos_vels = get_init_pos_vels() for body in self.bodies: pos_vels = init_pos_vels.get(type(body).__name__.lower(), None) @@ -114,33 +70,36 @@ class TwoWayFoilSim: ) \ .set_light_disable(True).set_ignore_gravity(True) - def create_two_dim(self, body): - body_2dim = CircleObj(texture=body.texture, - size_scale=body.diameter * body.size_scale, - distance_scale=body.distance_scale, - init_position=body.position) \ - .set_light_disable(True).set_ignore_gravity(True) - - body.two_dim = body_2dim - body_2dim.three_dim = body - return body_2dim - - def build_two_dim_bodies(self): - for body in self.bodies: - two_dim_body = self.create_two_dim(body) - self.three_dim_bodies.append(body) - self.two_dim_bodies.append(two_dim_body) - self.bodies.append(self.two_way_foil) self.bodies.append(self.two_way_foil_circle) - for body in self.two_dim_bodies: - self.bodies.append(body) + # def create_two_dim(self, body): + # body_2dim = CircleObj(texture=body.texture, + # size_scale=body.diameter * body.size_scale, + # distance_scale=body.distance_scale, + # init_position=body.position) \ + # .set_light_disable(True).set_ignore_gravity(True) + # + # body.two_dim = body_2dim + # body_2dim.three_dim = body + # return body_2dim + + # def build_two_dim_bodies(self): + # for body in self.bodies: + # # two_dim_body = self.create_two_dim(body) + # self.three_dim_bodies.append(body) + # # self.two_dim_bodies.append(two_dim_body) + # + # self.bodies.append(self.two_way_foil) + # self.bodies.append(self.two_way_foil_circle) + # + # for body in self.two_dim_bodies: + # self.bodies.append(body) def build(self): self.build_solar_system() self.build_two_way_foil() - self.build_two_dim_bodies() + # self.build_two_dim_bodies() def on_ready(self): """ @@ -152,22 +111,22 @@ class TwoWayFoilSim: camera.clip_plane_far = 1000000 create_sphere_sky(scale=200000) application.time_scale = 5 - for body in self.two_dim_bodies: - body.planet.enabled = False - model = body.planet.model - if body.three_dim.has_rings: - rings = create_rings(body.planet) - rings.scale *= 2e10 + # for body in self.two_dim_bodies: + # body.planet.enabled = False + # model = body.planet.model + # if body.three_dim.has_rings: + # rings = create_rings(body.planet) + # rings.scale *= 2e10 self.two_way_foil_circle.planet.rotation_x = 90 self.two_way_foil_circle.planet.enabled = False # self.two_way_foil.planet.alpha = 0.6 - for b in self.two_dim_bodies: - b.planet.rotation_x = 90 + # for b in self.two_dim_bodies: + # b.planet.rotation_x = 90 - def flatten_animation(self, body, flatten_body): - def flatten_update(planet, flatten_planet): + def flatten_animation(self, body): + def flatten_update(planet): def warp(): planet.init_update() # time.sleep(0.2) @@ -187,7 +146,7 @@ class TwoWayFoilSim: body.planet.scale_y_v = body.planet.scale_y body.planet.init_scale_y = body.planet.scale_y body.planet.init_update = body.planet.update - body.planet.update = flatten_update(body.planet, flatten_body.planet) + body.planet.update = flatten_update(body.planet) # for i in range(10): # # body.planet.scale_y /= 2 @@ -241,17 +200,19 @@ class TwoWayFoilSim: """ # self.sun.two_dim.planet.init_scale += 0.05 self.two_way_foil_circle.planet.init_scale += 0.8 - self.blink(self.sun.two_dim) + # self.blink(self.sun.two_dim) # 二维化延时的时间 two_way_delay_times = [0.5, # 太阳 0.5, 0.8, 1.0, # 水星 金星 地球 1.2, 2.0, 3.0, # 火星 木星 土星 4.0, 4.5, 5.5] # 天王星 海王星 冥王星 - for idx, b in enumerate(self.three_dim_bodies): + for idx, b in enumerate(self.bodies): + if isinstance(b, Obj): + continue if hasattr(b, "two_way_time"): if b.two_way_time is not None: if time.time() - b.two_way_time > two_way_delay_times[idx]: - self.flatten_animation(b, b.two_dim) + self.flatten_animation(b) # b.planet.enabled = False # b.two_dim.planet.enabled = True b.two_way_time = None @@ -259,9 +220,9 @@ class TwoWayFoilSim: b.two_way_time = time.time() # b.planet.enabled = False # b.two_dim.planet.enabled = True - if b.two_dim.planet.enabled: - # b.two_dim.planet.init_scale += 0.05 - self.blink(b.two_dim) + # if b.two_dim.planet.enabled: + # # b.two_dim.planet.init_scale += 0.05 + # self.blink(b.two_dim) self.two_way_foil_circle.planet.rotation_z += 0.4 def on_timer_changed(self, time_data): @@ -270,9 +231,9 @@ class TwoWayFoilSim: # self.two_way_foil.planet.rotation_z += 10 camera_look_at(self.two_way_foil) self.current_stage() - for b in self.two_dim_bodies: - b.planet.rotation_y -= 0.5 - b.init_position = b.three_dim.position + # for b in self.two_dim_bodies: + # b.planet.rotation_y -= 0.5 + # b.init_position = b.three_dim.position if __name__ == '__main__': -- GitLab