Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
太阳系三体模拟器
提交
00341327
太阳系三体模拟器
项目概览
Python_超人
/
太阳系三体模拟器
通知
1103
Star
131
Fork
129
代码
文件
提交
分支
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看板
提交
00341327
编写于
3月 16, 2023
作者:
三月三net
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
太阳系三体模拟器
上级
7076f48a
变更
6
显示空白变更内容
内联
并排
Showing
6 changed file
with
80 addition
and
107 deletion
+80
-107
scenes/func.py
scenes/func.py
+2
-1
scenes/solar_system_1.py
scenes/solar_system_1.py
+2
-2
simulators/ursina/ui_component.py
simulators/ursina/ui_component.py
+38
-0
simulators/ursina/ursina_ui.py
simulators/ursina/ursina_ui.py
+31
-30
simulators/ursina_simulator.py
simulators/ursina_simulator.py
+2
-74
simulators/views/ursina_view.py
simulators/views/ursina_view.py
+5
-0
未找到文件。
scenes/func.py
浏览文件 @
00341327
...
...
@@ -75,6 +75,7 @@ def ursina_run(bodies,
def
callback_update
():
for
ursina_view
in
simulator
.
ursina_views
:
simulator
.
check_and_evolve
()
if
ursina_view
.
appeared
:
ursina_view
.
update
()
# print('....')
...
...
scenes/solar_system_1.py
浏览文件 @
00341327
...
...
@@ -7,7 +7,7 @@
# python_version :3.8
# ==============================================================================
from
bodies
import
Sun
,
Mercury
,
Venus
,
Earth
,
Mars
,
Jupiter
,
Saturn
,
Uranus
,
Neptune
,
Pluto
,
Moon
from
common.consts
import
SECONDS_PER_WEEK
,
SECONDS_PER_DAY
from
common.consts
import
SECONDS_PER_WEEK
,
SECONDS_PER_DAY
,
SECONDS_PER_YEAR
from
scenes.func
import
mayavi_run
,
ursina_run
if
__name__
==
'__main__'
:
...
...
@@ -36,4 +36,4 @@ if __name__ == '__main__':
# mayavi_run(bodies, SECONDS_PER_WEEK, view_azimuth=-45)
# 使用 ursina 查看的运行效果
ursina_run
(
bodies
,
SECONDS_PER_DAY
,
position
=
(
0
,
0
,
0
))
\ No newline at end of file
ursina_run
(
bodies
,
SECONDS_PER_YEAR
,
position
=
(
0
,
0
,
0
))
\ No newline at end of file
simulators/ursina/ui_component.py
0 → 100644
浏览文件 @
00341327
# -*- coding:utf-8 -*-
# title :ursina UI组件
# description :ursina UI组件
# author :Python超人
# date :2023-02-11
# link :https://gitcode.net/pythoncr/
# python_version :3.8
# ==============================================================================
from
ursina
import
Ursina
,
window
,
Entity
,
Grid
,
Mesh
,
camera
,
Text
,
application
,
color
,
mouse
,
Vec2
,
Vec3
,
\
load_texture
,
held_keys
,
Button
from
ursina.prefabs.first_person_controller
import
FirstPersonController
from
simulators.ursina.ursina_config
import
UrsinaConfig
from
simulators.ursina.ursina_event
import
UrsinaEvent
from
ursina
import
WindowPanel
,
InputField
,
Button
,
Slider
,
ButtonGroup
class
UiSlider
(
Slider
):
def
__init__
(
self
,
text
,
min
=
0.01
,
max
=
3
,
default
=
1
):
super
().
__init__
(
text
=
text
,
height
=
Text
.
size
,
y
=-
.
6
,
step
=
.
01
,
min
=
min
,
max
=
max
,
default
=
default
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
label
.
scale
=
1
self
.
height
=
Text
.
size
/
1.2
# self.text_entity
# self.update()
class
SwithButton
(
ButtonGroup
):
def
__int__
(
self
,
options
,
default
):
super
().
__init__
(
options
,
min_selection
=
1
,
y
=
0
,
default
=
default
,
selected_color
=
color
.
green
,
ignore_paused
=
True
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
label
.
scale
=
0.8
\ No newline at end of file
simulators/ursina/ursina_ui.py
浏览文件 @
00341327
...
...
@@ -9,51 +9,32 @@
from
ursina
import
Ursina
,
window
,
Entity
,
Grid
,
Mesh
,
camera
,
Text
,
application
,
color
,
mouse
,
Vec2
,
Vec3
,
\
load_texture
,
held_keys
,
Button
from
ursina.prefabs.first_person_controller
import
FirstPersonController
from
simulators.ursina.ui_component
import
UiSlider
,
SwithButton
from
simulators.ursina.ursina_config
import
UrsinaConfig
from
simulators.ursina.ursina_event
import
UrsinaEvent
from
ursina
import
WindowPanel
,
InputField
,
Button
,
Slider
,
ButtonGroup
class
UrsinaUI
:
def
__init__
(
self
):
Text
.
default_font
=
'simsun.ttc'
# self.pause_handler = Entity(ignore_paused=True)
# 加载中文字体文件
# text_time_scale = "1"
# self.text_time_scale_info = None
# self.pause_handler.input = self.pause_handler_input
# self.show_text_time_scale_info()
# key_info_str = "退出[按2次ESC] 方位控制[鼠标QWEASD] 开始暂停[空格] 控制倍率[Tab - +]"
# key_info = Text(text=key_info_str, position=(-0.8, 0.5), origin=(-1, 1), background=True)
# # self.show_button()
self
.
slider_body_spin_factor
=
Slider
(
text
=
"自转速度"
,
y
=-
.
6
,
step
=
.
01
,
min
=
0.01
,
max
=
3
,
default
=
1
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
slider_run_speed_factor
=
Slider
(
text
=
"运行速度"
,
y
=-
.
1
,
step
=
.
01
,
min
=
0.01
,
max
=
500
,
default
=
1
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
def
ui_component_init
(
self
):
Text
.
default_font
=
'simsun.ttc'
application
.
time_scale
=
0.5
self
.
slider_control_speed_factor
=
Slider
(
text
=
"控制速度"
,
y
=-
.
1
,
step
=
.
01
,
min
=
0.01
,
max
=
30
,
default
=
0.5
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
slider_body_spin_factor
=
UiSlider
(
text
=
'自转速度'
,
min
=
0.01
,
max
=
30
,
default
=
1
)
self
.
slider_run_speed_factor
=
UiSlider
(
text
=
"运行速度"
,
min
=
0.01
,
max
=
800
,
default
=
1
)
self
.
slider_control_speed_factor
=
UiSlider
(
text
=
"控制速度"
,
min
=
0.01
,
max
=
30
,
default
=
application
.
time_scale
)
self
.
slider_trail_length
=
UiSlider
(
text
=
"拖尾长度"
,
min
=
30
,
max
=
500
,
default
=
UrsinaConfig
.
trail_length
)
self
.
slider_body_spin_factor
.
on_value_changed
=
self
.
on_slider_body_spin_changed
self
.
slider_run_speed_factor
.
on_value_changed
=
self
.
on_slider_run_speed_changed
self
.
slider_control_speed_factor
.
on_value_changed
=
self
.
on_slider_control_speed_changed
self
.
slider_trail_length
=
Slider
(
text
=
"拖尾长度"
,
y
=-
.
1
,
step
=
1
,
min
=
30
,
max
=
500
,
default
=
UrsinaConfig
.
trail_length
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
slider_trail_length
.
on_value_changed
=
self
.
on_slider_trail_length_changed
self
.
on_off_switch
=
ButtonGroup
((
'||'
,
'○'
),
min_selection
=
1
,
y
=
0
,
default
=
'○'
,
selected_color
=
color
.
green
,
ignore_paused
=
True
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
on_off_switch
=
SwithButton
((
'||'
,
'○'
),
default
=
'○'
)
self
.
on_off_switch
.
selected_color
=
color
.
red
self
.
on_off_trail
=
ButtonGroup
((
' '
,
'...'
),
min_selection
=
1
,
y
=
0
,
default
=
' '
,
selected_color
=
color
.
green
,
ignore_paused
=
True
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
on_off_trail
=
SwithButton
((
' '
,
'...'
),
default
=
' '
)
self
.
on_off_trail
.
on_value_changed
=
self
.
on_off_trail_changed
self
.
point_button
=
Button
(
text
=
'寻找'
,
origin
=
(
0
,
0
),
y
=
2
,
...
...
@@ -61,6 +42,7 @@ class UrsinaUI:
self
.
reset_button
=
Button
(
text
=
'重置'
,
origin
=
(
0
,
0
),
y
=
2
,
on_click
=
self
.
on_reset_button_click
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
))
self
.
on_off_switch
.
on_value_changed
=
self
.
on_off_switch_changed
wp
=
WindowPanel
(
title
=
''
,
content
=
(
...
...
@@ -79,9 +61,28 @@ class UrsinaUI:
),
ignore_paused
=
True
,
color
=
color
.
rgba
(
0.0
,
0.0
,
0.0
,
0.5
)
)
wp
.
y
=
0.5
# wp.panel.scale_y / 2 * wp.scale_y # center the window panel
wp
.
x
=
-
wp
.
scale_x
wp
.
x
=
0.6
# wp.scale_x + 0.1
# wp.x = 0#wp.panel.scale_x / 2 * wp.scale_x
self
.
wp
=
wp
def
__init__
(
self
):
self
.
ui_component_init
()
# self.pause_handler = Entity(ignore_paused=True)
# 加载中文字体文件
# text_time_scale = "1"
# self.text_time_scale_info = None
# self.pause_handler.input = self.pause_handler_input
# self.show_text_time_scale_info()
# key_info_str = "退出[按2次ESC] 方位控制[鼠标QWEASD] 开始暂停[空格] 控制倍率[Tab - +]"
# key_info = Text(text=key_info_str, position=(-0.8, 0.5), origin=(-1, 1), background=True)
# # self.show_button()
# slider_text = Text(text='自转速度', scale=1, position=(-0.6, 0.3))
# slider = Slider(scale=0.5, position=(-0.6, 0), min=0, max=10, step=1, text=slider_text)
def
on_off_trail_changed
(
self
):
if
self
.
on_off_trail
.
value
==
"..."
:
UrsinaConfig
.
show_trail
=
True
...
...
simulators/ursina_simulator.py
浏览文件 @
00341327
...
...
@@ -19,7 +19,7 @@ from common.system import System
import
time
import
datetime
import
math
from
ursina
import
EditorCamera
,
PointLight
,
SpotLight
,
AmbientLight
,
DirectionalLight
# , SunLight
from
ursina
import
EditorCamera
,
PointLight
,
SpotLight
,
AmbientLight
,
DirectionalLight
from
scenes.func
import
ursina_run
...
...
@@ -143,22 +143,7 @@ class UrsinaSimulator(Simulator):
return
lights
# def create_asteroids(self):
# """
# 小行星
# :return:
# """
# from simulators.views.ursina_mesh import create_torus,create_body_torus
# textureAsteroids = '../textures/asteroids.png'
# body_torus = create_torus(9, 10, 64)
# asteroids = Entity(model=body_torus, texture=textureAsteroids, scale=10, rotation=(90, 0, 0), double_sided=True)
# asteroids.x = 0
# asteroids.y = 0
# asteroids.z = 0
# asteroids.set_light_off()
def
run
(
self
,
dt
,
**
kwargs
):
from
ursina
import
EditorCamera
,
PointLight
,
SpotLight
,
AmbientLight
,
DirectionalLight
# 设定时间间隔为0.01秒
interval
=
0.01
self
.
evolve_dt
=
dt
*
interval
...
...
@@ -185,66 +170,9 @@ class UrsinaSimulator(Simulator):
if
cosmic_bg
is
not
None
and
os
.
path
.
exists
(
cosmic_bg
):
self
.
cosmic_background
(
cosmic_bg
)
# self.create_asteroids()
ui
=
UrsinaUI
()
# mouse.visible = True
EditorCamera
(
ignore_paused
=
True
)
# pause_handler = Entity(ignore_paused=True)
# # 加载中文字体文件
# Text.default_font = 'simsun.ttc'
# # text_time_scale = "1"
# text_time_scale_info = None
#
# def show_text_time_scale_info():
# nonlocal text_time_scale_info
# if text_time_scale_info is not None:
# text_time_scale_info.disable()
# text_time_scale = "控制倍率:" + str(application.time_scale).ljust(4, " ")
# text_time_scale_info = Text(text=text_time_scale, position=(-0.8, 0.5), origin=(-1, 1), background=True)
#
# # 按空格键则暂停
# def pause_handler_input(key):
# nonlocal text_time_scale_info
# time_scales = [0.05, 0.1, 0.2, 0.5, 1, 5, 10, 20, 30]
# # print(key)
# if key == 'space':
# application.paused = not application.paused # Pause/unpause the game.
# elif key == 'tab':
# # application.time_scale 属性控制游戏时间流逝的速度。
# # 具体来说,它是一个浮点数,用于调整游戏时间流逝速度的比例,其默认值为 1.0,表示正常速度。
# # 当你将它设置为小于 1.0 的值时,游戏时间会变慢,而设置为大于 1.0 的值时,游戏时间则会变快。
# for idx, time_scale in enumerate(time_scales):
# if float(application.time_scale) == time_scale:
# if idx < len(time_scales) - 1:
# application.time_scale = time_scales[idx + 1]
# break
# else:
# application.time_scale = time_scales[0]
# elif key == '+':
# UrsinaConfig.run_speed_factor *= 2
# elif key == "= up":
# UrsinaConfig.body_spin_factor *= 2
# # if application.time_scale in time_scales:
# # idx = time_scales.index(application.time_scale)
# # if idx < len(time_scales) - 1:
# # application.time_scale = time_scales[idx + 1]
# elif key == '-':
# UrsinaConfig.run_speed_factor *= 0.5
# elif key == "- up":
# UrsinaConfig.body_spin_factor *= 0.5
# # if application.time_scale in time_scales:
# # idx = time_scales.index(application.time_scale)
# # if idx > 0:
# # application.time_scale = time_scales[idx - 1]
#
# show_text_time_scale_info()
#
# pause_handler.input = pause_handler_input
# show_text_time_scale_info()
# key_info_str = "退出[按2次ESC] 方位控制[鼠标QWEASD] 开始暂停[空格] 控制倍率[Tab - +]"
# key_info = Text(text=key_info_str, position=(-0.8, 0.5), origin=(-1, 1), background=True)
self
.
app
.
run
()
...
...
simulators/views/ursina_view.py
浏览文件 @
00341327
...
...
@@ -160,6 +160,7 @@ class Planet(Entity):
try
:
pos
=
self
.
position
except
Exception
as
e
:
print
(
self
.
body_view
.
body
)
self
.
destroy_all
()
return
trails_keys
=
self
.
trails
.
keys
()
...
...
@@ -226,6 +227,7 @@ class Planet(Entity):
# 天体旋转
self
.
rotation_y
-=
self
.
rotspeed
except
Exception
as
e
:
print
(
self
.
body_view
.
body
)
self
.
destroy_all
()
return
...
...
@@ -281,6 +283,7 @@ class Planet(Entity):
# 删除拖尾
for
entity
,
pos
in
self
.
trails
.
items
():
destroy
(
entity
)
self
.
trails
.
clear
()
def
destroy_all
(
self
):
# 从天体系统中移除自己(TODO:暂时还不能移除)
...
...
@@ -290,6 +293,8 @@ class Planet(Entity):
# 如果有行星环,则删除行星环
if
hasattr
(
self
,
"ring"
):
destroy
(
self
.
ring
)
self
.
body_view
.
body
.
appeared
=
False
self
.
body_view
.
appeared
=
False
# 最后删除自己
destroy
(
self
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录