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

Python超人-宇宙模拟器

上级 6c170d76
......@@ -10,6 +10,7 @@ from bodies import Sun, Mercury, Venus, Earth, Mars, Moon, Ceres, Jupiter, Satur
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 sim_scenes.universe_sim_scenes import UniverseSimScenes
from simulators.func import ext_fun_for_method
from simulators.ursina.ursina_event import UrsinaEvent
if __name__ == '__main__':
......@@ -19,18 +20,20 @@ if __name__ == '__main__':
# 环状星群带(inner_radius, outer_radius, subdivisions)
# inner_radius:内圆半径 outer_radius:外圆半径,subdivisions:细分数,控制圆环的细节和精度
asteroids.torus_zone = 4.2, 5, 64
asteroids.torus_zone = 4.7, 5.5, 64
moon = Moon(size_scale=3e3, init_position=[0, 0, (0.4 + 2.4) * AU], distance_scale=1.7)
moon = Moon(size_scale=3e3, init_position=[0, 0, (0.4 + 2.4) * AU], distance_scale=1.8)
ceres = Ceres(size_scale=3e3, distance_scale=1.7)
jupiter = Jupiter(size_scale=0.68e3, distance_scale=1.05)
saturn = Saturn(size_scale=0.68e3, distance_scale=0.72)
earth = Earth(size_scale=3e3, distance_scale=3.8)
mars = Mars(size_scale=3e3, distance_scale=2.9)
jupiter = Jupiter(size_scale=0.68e3, distance_scale=1.15)
saturn = Saturn(size_scale=0.68e3, distance_scale=0.74)
bodies = [
sun,
Mercury(size_scale=3e3, distance_scale=7), # 水星放大 4000 倍
Venus(size_scale=3e3, distance_scale=4.3), # 金星放大 4000 倍
Earth(size_scale=3e3, distance_scale=3.5), # 地球放大 4000 倍
Mars(size_scale=3e3, distance_scale=2.6), # 火星放大 4000 倍
earth, # 地球放大 4000 倍
mars, # 火星放大 4000 倍
asteroids,
moon,
ceres,
......@@ -89,44 +92,148 @@ if __name__ == '__main__':
"""
from ursina import camera, Vec3
# 创建天空
create_sphere_sky(scale=20000)
create_sphere_sky(scale=20000, rotation_x=0, rotation_y=80)
camera.clip_plane_near = 0.1
camera.clip_plane_far = 1000000
# camera.look_at(saturn.planet)
camera.look_at(jupiter.planet)
# camera.look_at(sun.planet)
# camera.rotation_y = 90
camera.rotation_z -= 90
# UniverseSimScenes.show_grid_axises()
# asteroids.planet.enabled = False
# moon.planet.enabled = False
asteroids.planet.enabled = False
moon.planet.enabled = False
ceres.planet.enabled = False
def set_alpha_animation(body, begin_alpha, end_alpha, interval):
planet = body.planet
planet.alpha = begin_alpha
if begin_alpha > end_alpha:
interval = -abs(interval)
else:
interval = abs(interval)
origin_update = planet.update
def alpha_animation():
from ursina import camera, Vec4
origin_update()
alpha = planet.alpha
alpha += interval
if (interval > 0 and alpha >= end_alpha) or (interval < 0 and alpha <= end_alpha):
alpha = end_alpha
planet.update = origin_update
planet.enabled = (alpha > 0)
planet.alpha = alpha
# planet.color = Vec4(planet.color[0], planet.color[1], planet.color[2], alpha)
print(planet.alpha)
planet.update = alpha_animation
# ext_fun_for_method(planet, after_run_fun=alpha_animation)
#
# def after_ready():
# from ursina import camera, Vec3
# camera.position = Vec3(0,149.60,-665.76)
# camera.world_position = Vec3(-14.71,-98.38,0)
#
def on_timer_changed(time_data):
from ursina import camera, Vec3
camera.position = Vec3(0, 149.60, -665.76)
camera.world_position = Vec3(-14.71, -98.38, 0)
from ursina import camera, Vec3, distance
import math
# print(time_data.years)
if time_data.years > 1 and not hasattr(asteroids, "years_1"):
set_alpha_animation(asteroids, 0.0, 1.0, 0.01)
setattr(asteroids, "years_1", True)
elif time_data.years > 4 and not hasattr(asteroids, "years_5"):
set_alpha_animation(asteroids, 1.0, 0.0, 0.01)
setattr(asteroids, "years_5", True)
elif time_data.years > 6 and not hasattr(moon, "years_6"):
moon.planet.look_at(mars.planet)
moon.planet.update = lambda: None
set_alpha_animation(moon, 0.0, 1.0, 0.005)
setattr(moon, "years_6", True)
elif time_data.years > 8 and not hasattr(asteroids, "years_8"):
set_alpha_animation(asteroids, 0.0, 1.0, 0.01)
setattr(asteroids, "years_8", True)
if time_data.years > 8 and not hasattr(moon, "years_8"):
moon.planet.look_at(mars.planet)
radius = 12
d = distance(moon.planet, mars.planet.position)
if d > 12:
moon.planet.position += moon.planet.forward * 0.1
else:
if not hasattr(mars, "moon_angle"):
setattr(mars, "moon_angle", 90)
moon_angle = getattr(mars, "moon_angle")
x = mars.planet.x + radius * math.cos(moon_angle)
z = mars.planet.z + radius * math.sin(moon_angle)
moon.planet.position = (x, 0, z)
setattr(mars, "moon_angle", moon_angle + 0.08)
if moon_angle >= 110:
setattr(moon, "years_8", True)
print("moon_angle",moon_angle)
elif hasattr(mars, "moon_angle") and not hasattr(moon, "earth_rotation"):
earth_target = earth.planet.main_entity
moon.planet.look_at(earth_target)
radius = 15
d = distance(moon.planet.position, earth_target.position)
if d > 15:
moon.planet.position += moon.planet.forward * 0.1
else:
if not hasattr(earth, "moon_angle"):
setattr(earth, "moon_angle", 90)
moon_angle = getattr(earth, "moon_angle")
x = earth_target.x + radius * math.cos(moon_angle)
z = earth_target.z + radius * math.sin(moon_angle)
moon.planet.position = (x, 0, z)
setattr(earth, "moon_angle", moon_angle + 0.08)
if moon_angle >= 360 * 2 + 90:
setattr(moon, "earth_rotation", True)
print("moon_angle", moon_angle)
# moon.planet.world_rotation_z = 90
# moon.planet.position += moon.planet.right * 0.1
# setattr(moon, "years_8", True)
# elif time_data.years > 15 and not hasattr(moon, "years_15"):
# set_alpha_animation(moon, 1.0, 0.0, 0.05)
# setattr(moon, "years_15", True)
# UniverseSimScenes.set_window_size((1920, 1079), False)
# 运行前会触发 on_ready
UrsinaEvent.on_ready_subscription(on_ready)
# UrsinaEvent.after_ready_subscription(after_ready)
# UrsinaEvent.on_timer_changed_subscription(on_timer_changed)
UrsinaEvent.on_timer_changed_subscription(on_timer_changed)
# 使用 ursina 查看的运行效果
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后-
ursina_run(bodies,
SECONDS_PER_YEAR,
gravity_works=False,
position=(0, 2 * AU, -11 * AU),
show_exit_button=False,
show_control_info=False,
show_camera_info=False,
# position=(0, 2 * AU, -11 * AU),
# position=(0, 20 * AU, 10 * AU),
# position=(0, 20 * AU, 0),
position=(5.5 * AU, AU, 5 * AU),
timer_enabled=True,
show_timer=True,
cosmic_bg='',
show_grid=False)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册