提交 a191211d 编写于 作者: 三月三net's avatar 三月三net

Python超人-宇宙模拟器(代码备份,代码的清理未删除)

上级 e77a06ec
...@@ -268,7 +268,6 @@ def show_bodies_posvels(dt): ...@@ -268,7 +268,6 @@ def show_bodies_posvels(dt):
def gen_real_pos_vel_bodies(body_names, dt): def gen_real_pos_vel_bodies(body_names, dt):
import pytz import pytz
# 安装 astropy 包 # 安装 astropy 包
# pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com 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): ...@@ -281,59 +280,69 @@ def gen_real_pos_vel_bodies(body_names, dt):
for body_name in str(body_names).split(","): for body_name in str(body_names).split(","):
earth_pos_vel = get_body_barycentric_posvel(body_name, dt) 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()}']={{}}\n"
gen_body_str += f" init_pos_vels['{body_name.lower()}']['pos']=[%.4f,%.4f,%.4f]\n" % (pos.x.to(u.km).value, 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.y.to(u.km).value,
pos.z.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, gen_body_str += f" init_pos_vels['{body_name.lower()}']['vel']=[%.4f,%.4f,%.4f]\n" % (
vel.y.to(u.km / u.second).value, vel.x.to(u.km / u.second).value,
vel.z.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 return gen_body_str
# pos, vel = earth_pos_vel[0], earth_pos_vel[1] # pos, vel = earth_pos_vel[0], earth_pos_vel[1]
# print(f"{body_name}-坐标(公里):", [pos.x.to(u.km).value, # print(f"{body_name}-坐标(公里):", [pos.x.to(u.km).value,
# pos.y.to(u.km).value, # pos.y.to(u.km).value,
# pos.z.to(u.km)].value) # pos.z.to(u.km)].value)
# print(f"{body_name}-速度(公里/秒):", # print(f"{body_name}-速度(公里/秒):",
# [vel.x.to(u.km / u.second).value, # [vel.x.to(u.km / u.second).value,
# vel.y.to(u.km / u.second).value, # vel.y.to(u.km / u.second).value,
# vel.z.to(u.km / u.second).value]) # vel.z.to(u.km / u.second).value])
def get_init_pos_vels(): def get_init_pos_vels():
init_pos_vels = {} init_pos_vels = {}
init_pos_vels['sun'] = {} init_pos_vels['sun'] = {}
init_pos_vels['sun']['pos'] = [120062.8111, -462734.9565, -198328.7512] init_pos_vels['sun']['pos'] = [-4638653.0000, 0.0000, 1314332.6250]
init_pos_vels['sun']['vel'] = [0.0093, 0.0037, 0.0014] init_pos_vels['sun']['vel'] = [-0.0165, 0.0000, -0.0097]
init_pos_vels['mercury'] = {} init_pos_vels['mercury'] = {}
init_pos_vels['mercury']['pos'] = [-27459444.3141, 33659309.8266, 20887619.1358] init_pos_vels['mercury']['pos'] = [-54412616.0000, 0.0000, 31280100.0000]
init_pos_vels['mercury']['vel'] = [-49.8268, -24.7415, -8.0569] init_pos_vels['mercury']['vel'] = [-25.2667, 0.0000, -40.0561]
init_pos_vels['venus'] = {} init_pos_vels['venus'] = {}
init_pos_vels['venus']['pos'] = [21823958.6720, -97202911.8077, -45109059.0044] init_pos_vels['venus']['pos'] = [-32341672.0000, 0.0000, -99861352.0000]
init_pos_vels['venus']['vel'] = [34.0912, 7.0463, 1.0154] init_pos_vels['venus']['vel'] = [34.3770, 0.0000, -10.6676]
init_pos_vels['earth'] = {} init_pos_vels['earth'] = {}
init_pos_vels['earth']['pos'] = [-25983996.5057, 132369339.0025, 57373518.2429] init_pos_vels['earth']['pos'] = [140427392.0000, 0.0000, 45724572.0000]
init_pos_vels['earth']['vel'] = [-29.7869, -4.9606, -2.1489] init_pos_vels['earth']['vel'] = [-8.1280, 0.0000, 28.2277]
init_pos_vels['mars'] = {} init_pos_vels['mars'] = {}
init_pos_vels['mars']['pos'] = [-230623216.7918, -71477306.3132, -26561224.6080] init_pos_vels['mars']['pos'] = [218751648.0000, 0.0000, -45263688.0000]
init_pos_vels['mars']['vel'] = [8.4564, -18.9614, -8.9250] 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'] = {}
init_pos_vels['jupiter']['pos'] = [-357712686.7572, 637570826.6050, 281973598.8065] init_pos_vels['jupiter']['pos'] = [769445760.0000, 0.0000, 2017638.5000]
init_pos_vels['jupiter']['vel'] = [-11.7897, -5.0252, -1.8671] init_pos_vels['jupiter']['vel'] = [0.0389, 0.0000, 13.0879]
init_pos_vels['saturn'] = {} init_pos_vels['saturn'] = {}
init_pos_vels['saturn']['pos'] = [713384516.7012, -1202372203.9542, -527442445.4970] init_pos_vels['saturn']['pos'] = [-1330536704.0000, 0.0000, -454165280.0000]
init_pos_vels['saturn']['vel'] = [7.9649, 4.3679, 1.4610] init_pos_vels['saturn']['vel'] = [3.2189, 0.0000, -9.1974]
init_pos_vels['uranus'] = {} init_pos_vels['uranus'] = {}
init_pos_vels['uranus']['pos'] = [-2666283945.3730, 544495773.6564, 276202868.3064] init_pos_vels['uranus']['pos'] = [-1757163648.0000, 0.0000, 2272503808.0000]
init_pos_vels['uranus']['vel'] = [-1.5476, -6.3725, -2.7691] init_pos_vels['uranus']['vel'] = [-5.3918, 0.0000, -4.1634]
init_pos_vels['neptune'] = {} init_pos_vels['neptune'] = {}
init_pos_vels['neptune']['pos'] = [2602697275.5219, 3374419276.7397, 1316379531.2695] init_pos_vels['neptune']['pos'] = [-1480893824.0000, 0.0000, 4351772160.0000]
init_pos_vels['neptune']['vel'] = [-4.4365, 2.9291, 1.3095] init_pos_vels['neptune']['vel'] = [-5.1466, 0.0000, -1.7189]
return init_pos_vels 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__': if __name__ == '__main__':
from astropy.time import Time # 时间 from astropy.time import Time # 时间
# bodies = [ # bodies = [
# sun, # 太阳放大 80 倍 # sun, # 太阳放大 80 倍
# Mercury(size_scale=4e3, distance_scale=1.3), # 水星放大 4000 倍,距离放大 1.3 倍 # Mercury(size_scale=4e3, distance_scale=1.3), # 水星放大 4000 倍,距离放大 1.3 倍
......
...@@ -6,23 +6,17 @@ ...@@ -6,23 +6,17 @@
# link :https://gitcode.net/pythoncr/ # link :https://gitcode.net/pythoncr/
# python_version :3.9 # python_version :3.9
# ============================================================================== # ==============================================================================
import threading
import time 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 ursina import camera, application
from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto, Asteroids from bodies import Sun, Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune, Pluto
from common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, SECONDS_PER_MONTH, SECONDS_PER_YEAR, AU from common.celestial_data_service import get_init_pos_vels
from sim_scenes.func import mayavi_run, ursina_run, create_sphere_sky 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 from simulators.ursina.ursina_event import UrsinaEvent
...@@ -33,48 +27,10 @@ class TwoWayFoilSim: ...@@ -33,48 +27,10 @@ class TwoWayFoilSim:
def __init__(self): def __init__(self):
self.three_dim_bodies = [] # self.three_dim_bodies = []
self.two_dim_bodies = [] # self.two_dim_bodies = []
self.current_stage = self.stage_01 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): def build_solar_system(self):
# region 构建太阳系 # region 构建太阳系
self.sun = Sun(size_scale=0.8e2) self.sun = Sun(size_scale=0.8e2)
...@@ -84,7 +40,6 @@ class TwoWayFoilSim: ...@@ -84,7 +40,6 @@ class TwoWayFoilSim:
Venus(size_scale=4e3, distance_scale=1.3), # 金星放大 4000 倍,距离放大 1.3 倍 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 倍 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 倍 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 Jupiter(size_scale=0.68e3, distance_scale=0.72), # 木星放大 680 倍,距离缩小到真实距离的 0.72
Saturn(size_scale=0.68e3, distance_scale=0.52), # 土星放大 680 倍,距离缩小到真实距离的 0.52 Saturn(size_scale=0.68e3, distance_scale=0.52), # 土星放大 680 倍,距离缩小到真实距离的 0.52
Uranus(size_scale=1.5e3, distance_scale=0.36), # 天王星放大 1500 倍,距离缩小到真实距离的 0.36 Uranus(size_scale=1.5e3, distance_scale=0.36), # 天王星放大 1500 倍,距离缩小到真实距离的 0.36
...@@ -92,7 +47,8 @@ class TwoWayFoilSim: ...@@ -92,7 +47,8 @@ class TwoWayFoilSim:
Pluto(size_scale=10e3, distance_scale=0.23), # 冥王星放大 10000 倍,距离缩小到真实距离的 0.23(从太阳系的行星中排除) Pluto(size_scale=10e3, distance_scale=0.23), # 冥王星放大 10000 倍,距离缩小到真实距离的 0.23(从太阳系的行星中排除)
] ]
# endregion # endregion
init_pos_vels = self.get_init_pos_vels()
init_pos_vels = get_init_pos_vels()
for body in self.bodies: for body in self.bodies:
pos_vels = init_pos_vels.get(type(body).__name__.lower(), None) pos_vels = init_pos_vels.get(type(body).__name__.lower(), None)
...@@ -114,33 +70,36 @@ class TwoWayFoilSim: ...@@ -114,33 +70,36 @@ class TwoWayFoilSim:
) \ ) \
.set_light_disable(True).set_ignore_gravity(True) .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)
self.bodies.append(self.two_way_foil_circle) self.bodies.append(self.two_way_foil_circle)
for body in self.two_dim_bodies: # def create_two_dim(self, body):
self.bodies.append(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): def build(self):
self.build_solar_system() self.build_solar_system()
self.build_two_way_foil() self.build_two_way_foil()
self.build_two_dim_bodies() # self.build_two_dim_bodies()
def on_ready(self): def on_ready(self):
""" """
...@@ -152,22 +111,22 @@ class TwoWayFoilSim: ...@@ -152,22 +111,22 @@ class TwoWayFoilSim:
camera.clip_plane_far = 1000000 camera.clip_plane_far = 1000000
create_sphere_sky(scale=200000) create_sphere_sky(scale=200000)
application.time_scale = 5 application.time_scale = 5
for body in self.two_dim_bodies: # for body in self.two_dim_bodies:
body.planet.enabled = False # body.planet.enabled = False
model = body.planet.model # model = body.planet.model
if body.three_dim.has_rings: # if body.three_dim.has_rings:
rings = create_rings(body.planet) # rings = create_rings(body.planet)
rings.scale *= 2e10 # rings.scale *= 2e10
self.two_way_foil_circle.planet.rotation_x = 90 self.two_way_foil_circle.planet.rotation_x = 90
self.two_way_foil_circle.planet.enabled = False self.two_way_foil_circle.planet.enabled = False
# self.two_way_foil.planet.alpha = 0.6 # self.two_way_foil.planet.alpha = 0.6
for b in self.two_dim_bodies: # for b in self.two_dim_bodies:
b.planet.rotation_x = 90 # b.planet.rotation_x = 90
def flatten_animation(self, body, flatten_body): def flatten_animation(self, body):
def flatten_update(planet, flatten_planet): def flatten_update(planet):
def warp(): def warp():
planet.init_update() planet.init_update()
# time.sleep(0.2) # time.sleep(0.2)
...@@ -187,7 +146,7 @@ class TwoWayFoilSim: ...@@ -187,7 +146,7 @@ class TwoWayFoilSim:
body.planet.scale_y_v = body.planet.scale_y body.planet.scale_y_v = body.planet.scale_y
body.planet.init_scale_y = body.planet.scale_y body.planet.init_scale_y = body.planet.scale_y
body.planet.init_update = body.planet.update 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): # for i in range(10):
# # body.planet.scale_y /= 2 # # body.planet.scale_y /= 2
...@@ -241,17 +200,19 @@ class TwoWayFoilSim: ...@@ -241,17 +200,19 @@ class TwoWayFoilSim:
""" """
# self.sun.two_dim.planet.init_scale += 0.05 # self.sun.two_dim.planet.init_scale += 0.05
self.two_way_foil_circle.planet.init_scale += 0.8 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, # 太阳 two_way_delay_times = [0.5, # 太阳
0.5, 0.8, 1.0, # 水星 金星 地球 0.5, 0.8, 1.0, # 水星 金星 地球
1.2, 2.0, 3.0, # 火星 木星 土星 1.2, 2.0, 3.0, # 火星 木星 土星
4.0, 4.5, 5.5] # 天王星 海王星 冥王星 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 hasattr(b, "two_way_time"):
if b.two_way_time is not None: if b.two_way_time is not None:
if time.time() - b.two_way_time > two_way_delay_times[idx]: 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.planet.enabled = False
# b.two_dim.planet.enabled = True # b.two_dim.planet.enabled = True
b.two_way_time = None b.two_way_time = None
...@@ -259,9 +220,9 @@ class TwoWayFoilSim: ...@@ -259,9 +220,9 @@ class TwoWayFoilSim:
b.two_way_time = time.time() b.two_way_time = time.time()
# b.planet.enabled = False # b.planet.enabled = False
# b.two_dim.planet.enabled = True # b.two_dim.planet.enabled = True
if b.two_dim.planet.enabled: # if b.two_dim.planet.enabled:
# b.two_dim.planet.init_scale += 0.05 # # b.two_dim.planet.init_scale += 0.05
self.blink(b.two_dim) # self.blink(b.two_dim)
self.two_way_foil_circle.planet.rotation_z += 0.4 self.two_way_foil_circle.planet.rotation_z += 0.4
def on_timer_changed(self, time_data): def on_timer_changed(self, time_data):
...@@ -270,9 +231,9 @@ class TwoWayFoilSim: ...@@ -270,9 +231,9 @@ class TwoWayFoilSim:
# self.two_way_foil.planet.rotation_z += 10 # self.two_way_foil.planet.rotation_z += 10
camera_look_at(self.two_way_foil) camera_look_at(self.two_way_foil)
self.current_stage() self.current_stage()
for b in self.two_dim_bodies: # for b in self.two_dim_bodies:
b.planet.rotation_y -= 0.5 # b.planet.rotation_y -= 0.5
b.init_position = b.three_dim.position # b.init_position = b.three_dim.position
if __name__ == '__main__': if __name__ == '__main__':
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册