Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
宇宙模拟器
提交
0334cff4
宇宙模拟器
项目概览
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看板
提交
0334cff4
编写于
4月 09, 2023
作者:
三月三net
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Python超人-宇宙模拟器
上级
304eb4aa
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
65 addition
and
9 deletion
+65
-9
sim_scenes/solar_system/speed_of_light.py
sim_scenes/solar_system/speed_of_light.py
+5
-4
sim_scenes/solar_system/speed_of_light_init.py
sim_scenes/solar_system/speed_of_light_init.py
+60
-5
未找到文件。
sim_scenes/solar_system/speed_of_light.py
浏览文件 @
0334cff4
...
...
@@ -12,8 +12,9 @@ from sim_scenes.solar_system.speed_of_light_init import SpeedOfLightInit
# TODO: 三种不同的摄像机视角
camera_follow_light
=
None
# 摄像机固定,不会跟随光
camera_follow_light
=
'ForwardView'
# 摄像机跟随光,方向是向前看
camera_follow_light
=
'SideView'
# 摄像机跟随光,方向是侧面看
# camera_follow_light = 'ForwardView' # 摄像机跟随光,方向是向前看
# camera_follow_light = 'SideView' # 摄像机跟随光,方向是侧面看
# camera_follow_light = 'SideViewActualSize' # 摄像机跟随光,方向是侧面看,天体是实际大小
# 实例化一个初始化对象(订阅事件,记录到达每个行星所需要的时间)
init
=
SpeedOfLightInit
(
camera_follow_light
)
...
...
@@ -29,8 +30,8 @@ light_body = create_light_body(init.light_size_scale, init.light_init_position,
bodies
.
append
(
light_body
)
# 运行前指定bodies、light_body并订阅事件
init
.
bodies
=
bodies
init
.
light_body
=
light_body
init
.
bodies
=
bodies
init
.
event_subscription
()
# 使用 ursina 查看的运行效果
...
...
@@ -40,5 +41,5 @@ ursina_run(bodies, 60,
position
=
init
.
camera_position
,
show_trail
=
init
.
show_trail
,
show_timer
=
True
,
# view_closely=True
,
view_closely
=
init
.
view_closely
,
bg_music
=
"sounds/interstellar.mp3"
)
sim_scenes/solar_system/speed_of_light_init.py
浏览文件 @
0334cff4
...
...
@@ -7,9 +7,10 @@
# python_version :3.8
# ==============================================================================
from
bodies
import
Sun
,
Asteroids
,
Body
from
common.consts
import
AU
from
common.consts
import
AU
,
LIGHT_SPEED
,
SECONDS_PER_MINUTE
,
SECONDS_PER_HOUR
from
sim_scenes.func
import
create_text_panel
from
simulators.ursina.entities.body_timer
import
TimeData
from
simulators.ursina.ursina_config
import
UrsinaConfig
from
simulators.ursina.ursina_event
import
UrsinaEvent
from
ursina
import
camera
import
datetime
...
...
@@ -33,8 +34,8 @@ class SpeedOfLightInit:
self
.
__camera_follow_light
=
camera_follow_light
self
.
__light_body
=
None
self
.
__bodies
=
None
if
self
.
__camera_follow_light
==
"SideView"
:
self
.
view_closely
=
False
if
self
.
__camera_follow_light
in
[
"SideView"
,
"SideViewActualSize"
]
:
# 摄像机位置 = 前-后+、上+下-、左-右+、
self
.
camera_position
=
(
AU
,
0
,
0
)
self
.
show_trail
=
True
...
...
@@ -68,6 +69,14 @@ class SpeedOfLightInit:
@
bodies
.
setter
def
bodies
(
self
,
value
):
self
.
__bodies
=
value
if
self
.
__camera_follow_light
==
"SideViewActualSize"
:
# TODO: 将天体的大小不进行缩放
for
body
in
self
.
__bodies
:
if
body
is
self
.
light_body
:
continue
body
.
size_scale
=
1
self
.
camera_position
=
[
-
self
.
light_init_position
[
0
]
/
1.35
,
0
,
0
]
self
.
view_closely
=
True
def
on_reset
(
self
):
"""
...
...
@@ -122,7 +131,7 @@ class SpeedOfLightInit:
self
.
text_panel
=
create_text_panel
()
self
.
text_panel
.
text
=
self
.
arrived_info
.
replace
(
"${distance}"
,
"0 AU"
)
if
self
.
__camera_follow_light
==
"SideView"
:
if
self
.
__camera_follow_light
in
[
"SideView"
,
"SideViewActualSize"
]
:
camera
.
parent
=
self
.
light_body
.
planet
camera
.
rotation_y
=
-
85
elif
self
.
__camera_follow_light
==
"ForwardView"
:
...
...
@@ -131,12 +140,58 @@ class SpeedOfLightInit:
self
.
light_body
.
planet
.
input
=
self
.
light_body_input
camera
.
rotation_y
=
-
15
def
auto_run_speed
(
self
):
# if self.__camera_follow_light != "SideViewActualSize":
# return
run_speed_maps
=
[
{
"au"
:
0.008
,
"secs"
:
1
},
{
"au"
:
0.36
,
"secs"
:
SECONDS_PER_MINUTE
*
2
},
{
"au"
:
0.37
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
0.385
,
"secs"
:
1
},
# [00:03:12] 到达 [水星] 0.38 AU
{
"au"
:
0.715
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
0.725
,
"secs"
:
1
},
# [00:06:00] 到达 [金星] 0.72 AU
{
"au"
:
0.99
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
1.005
,
"secs"
:
1
},
# [00:08:19] 到达 [地球] 1.0 AU
{
"au"
:
1.50
,
"secs"
:
SECONDS_PER_MINUTE
*
2
},
{
"au"
:
1.51
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
1.525
,
"secs"
:
1
},
# [00:12:39] 到达 [火星] 1.52 AU
{
"au"
:
5.17
,
"secs"
:
SECONDS_PER_MINUTE
*
5
},
{
"au"
:
5.18
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
5.195
,
"secs"
:
1
},
# [00:43:11] 到达 [木星] 5.19 AU
{
"au"
:
9.475
,
"secs"
:
SECONDS_PER_MINUTE
*
5
},
{
"au"
:
9.485
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
9.505
,
"secs"
:
1
},
# [01:19:03] 到达 [土星] 9.5 AU
{
"au"
:
19.17
,
"secs"
:
SECONDS_PER_HOUR
},
{
"au"
:
19.18
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
19.205
,
"secs"
:
1
},
# [02:39:41] 到达 [天王星] 19.2 AU
{
"au"
:
30.675
,
"secs"
:
SECONDS_PER_HOUR
},
{
"au"
:
30.685
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
30.705
,
"secs"
:
1
},
# [04:15:18] 到达 [海王星] 30.7 AU
{
"au"
:
39.53
,
"secs"
:
SECONDS_PER_HOUR
*
1.2
},
{
"au"
:
39.54
,
"secs"
:
SECONDS_PER_MINUTE
},
{
"au"
:
1000
,
"secs"
:
1
}
# [05:28:54] 到达 [冥王星] 39.55 AU
]
light_distance
=
self
.
light_body
.
position
[
2
]
for
i
,
m
in
enumerate
(
run_speed_maps
):
if
i
==
0
:
au_min
=
0
else
:
au_min
=
run_speed_maps
[
i
-
1
][
"au"
]
au_max
=
m
[
"au"
]
if
au_max
*
AU
>
light_distance
>=
au_min
*
AU
:
UrsinaConfig
.
seconds_per
=
m
[
"secs"
]
def
on_timer_changed
(
self
,
time_data
:
TimeData
):
"""
计时器触发
@param time_data: 计时器时间数据
@return:
"""
self
.
auto_run_speed
()
for
body
in
self
.
bodies
:
if
body
is
self
.
light_body
or
isinstance
(
body
,
Sun
)
\
or
body
in
self
.
arrived_bodies
or
isinstance
(
body
,
Asteroids
):
...
...
@@ -149,7 +204,7 @@ class SpeedOfLightInit:
self
.
arrived_info
+=
f
"[
{
time_data
.
time_text
}
]
\t
到达
\t
[
{
body
.
name
}
]
\n\n
"
distance
=
round
(
self
.
light_body
.
position
[
2
]
/
AU
,
2
)
self
.
text_panel
.
text
=
self
.
arrived_info
.
replace
(
"${distance}"
,
f
"
{
distance
}
AU"
)
print
(
f
"[
{
time_data
.
time_text
}
] 到达 [
{
body
.
name
}
]"
)
print
(
f
"[
{
time_data
.
time_text
}
] 到达 [
{
body
.
name
}
]
{
round
(
self
.
light_body
.
position
[
2
]
/
AU
,
4
)
}
AU
"
)
return
if
not
hasattr
(
self
,
"last_time"
):
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录