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

Python超人-宇宙模拟器

上级 2a344f38
# -*- coding:utf-8 -*-
# title :三体场景模拟02
# description :三体场景模拟(3个太阳、1个地球)
# author :Python超人
# date :2023-02-11
# link :https://gitcode.net/pythoncr/
# python_version :3.8
# ==============================================================================
from bodies import Sun, Earth
from common.consts import SECONDS_PER_DAY, SECONDS_PER_WEEK, SECONDS_PER_YEAR, AU
from sim_scenes.func import mayavi_run, mpl_run, ursina_run
if __name__ == '__main__':
"""
注释: 3个太阳(ChatGPT生成的效果)
可以修改影响效果的参数为:
1、三个方向的初始位置 init_position[x, y, z]
2、三个方向的初始速度 init_velocity[x, y, z]
3、天体质量 mass
"""
# 代码案例如下:
SIZE_SCALE = 5e1 # 生成的太阳放大 50 倍
RUN_DIAMETER = 1.392e6 # 真实太阳的直径
# 恒星A:质量 = 1.0, 速度 = (2.0, 3.0, 4.0), 坐标 = (5.0, 6.0, 7.0)
# 恒星B:质量 = 1.5, 速度 = (-1.0, -2.0, -3.0), 坐标 = (8.0, 9.0, 10.0)
# 恒星C:质量 = 2.0, 速度 = (1.5, 2.5, 3.5), 坐标 = (11.0, 12.0, 13.0)
bodies = [
Sun(name="太阳1", mass=1e30, init_position=[500 * RUN_DIAMETER, 600 * RUN_DIAMETER, 700 * RUN_DIAMETER],
init_velocity=[2, 3, 4],
size_scale=SIZE_SCALE, texture="sun1.jpg"),
Sun(name="太阳2", mass=1.5e30, init_position=[800 * RUN_DIAMETER, 900 * RUN_DIAMETER, 1000 * RUN_DIAMETER],
init_velocity=[-1, -2, -3],
size_scale=SIZE_SCALE, texture="sun2.jpg"),
Sun(name="太阳3", mass=2e30, init_position=[1100 * RUN_DIAMETER, 1200 * RUN_DIAMETER, 1300 * RUN_DIAMETER],
init_velocity=[1.5, 2.5, 3.5],
size_scale=SIZE_SCALE, texture="sun2.jpg"),
]
# 按照以上代码案例格式生成代码,要求 init_position 、init_velocity、mass 生成后,要保证在万有引力的作用下,能正常运行,不会碰撞
"""
太阳1:
初始位置:(100000, 200000, 300000) km
初始速度:(-1.0, -2.0, 3.0) km/s
质量:2.5 x 10^30 kg
太阳2:
初始位置:(-150000, 250000, 350000) km
初始速度:(2.0, -3.0, -1.0) km/s
质量:2.0 x 10^30 kg
太阳3:
初始位置:(200000, -300000, 400000) km
初始速度:(-3.0, 1.0, -2.0) km/s
质量:2.8 x 10^30 kg
"""
# 使用 mayavi 查看的运行效果
# mayavi_run(bodies, SECONDS_PER_WEEK, view_azimuth=0)
# 使用 matplotlib 查看运行效果
# mpl_run(bodies, SECONDS_PER_WEEK)
# 使用 ursina 查看的运行效果
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后-
ursina_run(bodies, SECONDS_PER_YEAR, position=(3 * AU, 0, -30 * AU), show_trail=True)
......@@ -82,7 +82,7 @@ class TwoWayFoilSim:
Venus(size_scale=4e3, distance_scale=1.3), # 金星放大 4000 倍,距离放大 1.3 倍
Earth(size_scale=4e3, distance_scale=1.3), # 地球放大 4000 倍,距离放大 1.3 倍
Mars(size_scale=4e3, distance_scale=1.2), # 火星放大 4000 倍,距离放大 1.2 倍
Asteroids(size_scale=1e2, parent=self.sun), # 小行星模拟(仅 ursina 模拟器支持)
# 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=0.8e3, distance_scale=0.36), # 天王星放大 800 倍,距离缩小到真实距离的 0.36
......@@ -100,12 +100,14 @@ class TwoWayFoilSim:
body.init_velocity = pos_vels['vel']
def build_two_way_foil(self):
self.two_way_foil = QuadObj(texture='wave.jpg', size_scale=4e7,
init_velocity=[0, 0, 100],
self.two_way_foil = QuadObj(texture='two_way_foil.png',
# size_scale=4e7,
size_scale=1e7,
init_velocity=[0, 0, 150],
init_position=[0, 0, -10 * AU]) \
.set_light_disable(True).set_ignore_gravity(True)
self.two_way_foil_circle = CircleObj(texture=self.two_way_foil.texture,
self.two_way_foil_circle = CircleObj(texture="two_way_foil_circle.png",
size_scale=self.two_way_foil.size_scale * 2,
) \
.set_light_disable(True).set_ignore_gravity(True)
......@@ -157,7 +159,7 @@ class TwoWayFoilSim:
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
# self.two_way_foil.planet.alpha = 0.6
for b in self.two_dim_bodies:
b.planet.rotation_x = 90
......@@ -173,11 +175,12 @@ class TwoWayFoilSim:
self.sun.two_dim.planet.x += 100000
# two_way_foil.explode(sun)
self.two_way_foil.planet.enabled = False
self.two_way_foil_circle.planet.alpha = 0.6
self.two_way_foil_circle.planet.alpha = 0.9
self.two_way_foil_circle.planet.enabled = True
self.current_stage = self.stage_02
def blink(self, body):
return
if not hasattr(body, "blink_d"):
body.blink_d = 1
body.blink_v = 1
......@@ -198,7 +201,7 @@ class TwoWayFoilSim:
@return:
"""
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.blink(self.sun.two_dim)
for b in self.three_dim_bodies:
......@@ -206,16 +209,18 @@ class TwoWayFoilSim:
b.planet.enabled = False
b.two_dim.planet.enabled = True
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.two_way_foil_circle.planet.rotation_z += 0.2
def on_timer_changed(self, time_data):
self.two_way_foil.planet.rotation_x += 1
self.two_way_foil.planet.rotation_y += 10
self.two_way_foil.planet.rotation_x += 0.1
self.two_way_foil.planet.rotation_y += 1
# 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
......@@ -234,9 +239,9 @@ if __name__ == '__main__':
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后-
ursina_run(sim.bodies,
SECONDS_PER_MONTH / 2,
SECONDS_PER_WEEK,
# position=(0, 2 * AU, -11 * AU),
position=(0, 1 * AU, -11 * AU),
position=(0, 0.1 * AU, -5 * AU),
cosmic_bg='',
show_camera_info=False,
show_control_info=False,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册