Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
宇宙模拟器
提交
cff15119
宇宙模拟器
项目概览
Python_超人
/
宇宙模拟器
通知
19
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
宇宙模拟器
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
cff15119
编写于
10月 21, 2023
作者:
三月三net
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Python超人-宇宙模拟器
上级
2a344f38
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
82 addition
and
12 deletion
+82
-12
objs/textures/two_way_foil.png
objs/textures/two_way_foil.png
+0
-0
objs/textures/two_way_foil_circle.png
objs/textures/two_way_foil_circle.png
+0
-0
sim_scenes/tri_bodies/tri_bodies_05.py
sim_scenes/tri_bodies/tri_bodies_05.py
+65
-0
sim_scenes/tri_bodies/two_way_foil.py
sim_scenes/tri_bodies/two_way_foil.py
+17
-12
未找到文件。
objs/textures/two_way_foil.png
0 → 100644
浏览文件 @
cff15119
73.3 KB
objs/textures/two_way_foil_circle.png
0 → 100644
浏览文件 @
cff15119
23.6 KB
sim_scenes/tri_bodies/tri_bodies_05.py
0 → 100644
浏览文件 @
cff15119
# -*- 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
)
sim_scenes/tri_bodies/two_way_foil.py
浏览文件 @
cff15119
...
...
@@ -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
+=
1
0
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录