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

Python超人-宇宙模拟器

上级 facf840b
...@@ -36,6 +36,7 @@ class Asteroids(TorusZone): ...@@ -36,6 +36,7 @@ class Asteroids(TorusZone):
subdivisions=64, subdivisions=64,
size_scale=1.0, size_scale=1.0,
distance_scale=1.0, distance_scale=1.0,
rotate_angle=0,
rotation_speed=0.002, # 小行星绕太阳转一圈的时间在数年到几十年之间不等。 rotation_speed=0.002, # 小行星绕太阳转一圈的时间在数年到几十年之间不等。
parent=None): parent=None):
params = { params = {
...@@ -50,6 +51,7 @@ class Asteroids(TorusZone): ...@@ -50,6 +51,7 @@ class Asteroids(TorusZone):
"size_scale": size_scale, "size_scale": size_scale,
"distance_scale": distance_scale, "distance_scale": distance_scale,
"rotation_speed": rotation_speed, "rotation_speed": rotation_speed,
"rotate_angle": rotate_angle,
"parent": parent "parent": parent
} }
super().__init__(**params) super().__init__(**params)
......
...@@ -23,6 +23,7 @@ class TorusZone(Body): ...@@ -23,6 +23,7 @@ class TorusZone(Body):
subdivisions=64, subdivisions=64,
size_scale=1.0, size_scale=1.0,
distance_scale=1.0, distance_scale=1.0,
rotate_angle=0,
rotation_speed=0, rotation_speed=0,
parent=None): parent=None):
""" """
...@@ -51,6 +52,7 @@ class TorusZone(Body): ...@@ -51,6 +52,7 @@ class TorusZone(Body):
"size_scale": size_scale, "size_scale": size_scale,
"distance_scale": distance_scale, "distance_scale": distance_scale,
"rotation_speed": rotation_speed, "rotation_speed": rotation_speed,
"rotate_angle": rotate_angle,
"parent": parent "parent": parent
} }
super().__init__(**params) super().__init__(**params)
......
...@@ -15,7 +15,7 @@ import numpy as np ...@@ -15,7 +15,7 @@ import numpy as np
from astropy.coordinates import get_body_barycentric_posvel from astropy.coordinates import get_body_barycentric_posvel
from astropy.time import Time 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 common.consts import SECONDS_PER_WEEK, SECONDS_PER_DAY, AU
from sim_scenes.func import ursina_run from sim_scenes.func import ursina_run
from simulators.ursina.entities.body_timer import TimeData from simulators.ursina.entities.body_timer import TimeData
...@@ -73,6 +73,7 @@ if __name__ == '__main__': ...@@ -73,6 +73,7 @@ if __name__ == '__main__':
Earth(name="地球", size_scale=1e3), # 地球 Earth(name="地球", size_scale=1e3), # 地球
Moon(name="月球", size_scale=2e3), # 月球 Moon(name="月球", size_scale=2e3), # 月球
Mars(name="火星", size_scale=1.2e3), # 火星 Mars(name="火星", size_scale=1.2e3), # 火星
Asteroids(size_scale=1e2, parent=sun, rotate_angle=-20),
Jupiter(name="木星", size_scale=4e2), # 木星 Jupiter(name="木星", size_scale=4e2), # 木星
Saturn(name="土星", size_scale=4e2), # 土星 Saturn(name="土星", size_scale=4e2), # 土星
Uranus(name="天王星", size_scale=10e2), # 天王星 Uranus(name="天王星", size_scale=10e2), # 天王星
...@@ -80,10 +81,14 @@ if __name__ == '__main__': ...@@ -80,10 +81,14 @@ if __name__ == '__main__':
] ]
names = get_bodies_names(bodies) names = get_bodies_names(bodies)
names = names.replace("Asteroids,", "")
def get_body_posvel(body, posvels): def get_body_posvel(body, posvels=None, time=None):
posvel = posvels.get(body.__class__.__name__, None) if posvels is None:
posvel = get_body_barycentric_posvel(body.__class__.__name__, time)
else:
posvel = posvels.get(body.__class__.__name__, None)
return posvel return posvel
...@@ -97,14 +102,21 @@ if __name__ == '__main__': ...@@ -97,14 +102,21 @@ if __name__ == '__main__':
posvels = get_bodies_posvels(names, t) posvels = get_bodies_posvels(names, t)
# earth_loc = None # earth_loc = None
earth_pos = None earth_pos = None
sun_pos = None
for body in bodies: 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): if isinstance(body, Moon):
posvel = recalc_moon_position(posvel, earth_pos) posvel = recalc_moon_position(posvel, earth_pos)
if posvel is None: 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: else:
S_OF_D = 24 * 60 * 60 S_OF_D = 24 * 60 * 60
# 坐标单位:千米 速度单位:千米/秒 # 坐标单位:千米 速度单位:千米/秒
...@@ -117,6 +129,8 @@ if __name__ == '__main__': ...@@ -117,6 +129,8 @@ if __name__ == '__main__':
if isinstance(body, Earth): if isinstance(body, Earth):
# earth_loc = EarthLocation(x=posvel[0].x, y=posvel[0].y, z=posvel[0].z) # earth_loc = EarthLocation(x=posvel[0].x, y=posvel[0].y, z=posvel[0].z)
earth_pos = posvel[0] earth_pos = posvel[0]
elif isinstance(body, Sun):
sun_pos = posvel[0]
dt = time_data.get_datetime(str(current_time)) dt = time_data.get_datetime(str(current_time))
# print(time_data.get_datetime(str(current_time))) # print(time_data.get_datetime(str(current_time)))
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册