Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
宇宙模拟器
提交
28e024d5
宇宙模拟器
项目概览
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看板
提交
28e024d5
编写于
10月 27, 2023
作者:
三月三net
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Python超人-宇宙模拟器
上级
2cc1c635
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
87 addition
and
10 deletion
+87
-10
sim_scenes/solar_system/halley_comet_sim_02.py
sim_scenes/solar_system/halley_comet_sim_02.py
+77
-6
simulators/ursina/entities/world_grid.py
simulators/ursina/entities/world_grid.py
+10
-4
未找到文件。
sim_scenes/solar_system/halley_comet_sim_02.py
浏览文件 @
28e024d5
...
...
@@ -7,7 +7,7 @@
# python_version :3.9
# ==============================================================================
import
time
import
math
from
ursina
import
camera
,
application
from
bodies
import
Sun
,
Mercury
,
Venus
,
Earth
,
Mars
,
Jupiter
,
Saturn
,
Uranus
,
Neptune
,
Pluto
...
...
@@ -17,6 +17,7 @@ from common.func import calculate_distance
from
objs
import
HalleComet
,
Obj
from
sim_scenes.func
import
camera_look_at
,
two_bodies_colliding
,
create_text_panel
from
sim_scenes.func
import
ursina_run
,
create_sphere_sky
from
simulators.ursina.entities.world_grid
import
WorldGrid
from
simulators.ursina.ursina_config
import
UrsinaConfig
from
simulators.ursina.ursina_event
import
UrsinaEvent
from
simulators.ursina.ursina_mesh
import
create_orbit_line
...
...
@@ -44,9 +45,9 @@ class HalleyCometSim:
self
.
pluto
=
Pluto
(
size_scale
=
1e5
,
show_trail
=
False
)
self
.
bodies
=
[
self
.
sun
,
# 太阳
self
.
mercury
,
# 水星
self
.
venus
,
# 金星
self
.
earth
,
# 地球
#
self.mercury, # 水星
#
self.venus, # 金星
#
self.earth, # 地球
self
.
mars
,
# 火星
self
.
jupiter
,
# 木星
self
.
saturn
,
# 土星
...
...
@@ -82,6 +83,39 @@ class HalleyCometSim:
self
.
build_solar_system
()
self
.
build_halley_comet
()
def
calculate_rotation_angles
(
self
,
point1
,
point2
):
dx
=
point2
.
x
-
point1
.
x
dy
=
point2
.
y
-
point1
.
y
dz
=
point2
.
z
-
point1
.
z
roll
=
math
.
atan2
(
dy
,
dz
)
pitch
=
math
.
atan2
(
dx
,
math
.
sqrt
(
dy
**
2
+
dz
**
2
))
yaw
=
math
.
atan2
(
math
.
sin
(
roll
),
math
.
cos
(
roll
))
return
roll
,
pitch
,
yaw
def
calculate_angles
(
self
,
point1
,
point2
):
import
numpy
as
np
# 计算向量AB
AB
=
point1
-
point2
# 计算向量AB与x轴、y轴和z轴之间的夹角
angle_x
=
np
.
arctan2
(
AB
.
y
,
AB
.
x
)
*
180
/
np
.
pi
angle_y
=
np
.
arctan2
(
AB
.
z
,
np
.
sqrt
(
AB
.
x
**
2
+
AB
.
y
**
2
))
*
180
/
np
.
pi
angle_z
=
np
.
arctan2
(
np
.
sqrt
(
AB
.
x
**
2
+
AB
.
y
**
2
),
AB
.
z
)
*
180
/
np
.
pi
return
angle_x
,
angle_y
,
angle_z
def
calculate_angles
(
self
,
point1
,
point2
):
import
numpy
as
np
# 计算向量AB
AB
=
point2
-
point1
# 计算向量AB与x轴、y轴和z轴之间的夹角
angle_x
=
np
.
degrees
(
np
.
arctan2
(
AB
.
y
,
AB
.
x
))
angle_y
=
np
.
degrees
(
np
.
arctan2
(
AB
.
z
,
np
.
sqrt
(
AB
.
x
**
2
+
AB
.
y
**
2
)))
angle_z
=
np
.
degrees
(
np
.
arctan2
(
np
.
sqrt
(
AB
.
x
**
2
+
AB
.
y
**
2
),
AB
.
z
))
return
angle_x
,
angle_y
,
angle_z
def
on_ready
(
self
):
"""
事件绑定后,模拟器运行前会触发
...
...
@@ -95,13 +129,49 @@ class HalleyCometSim:
# camera.clip_plane_near = 0.1
camera
.
clip_plane_far
=
1000000
create_sphere_sky
(
scale
=
200000
)
WorldGrid
().
draw_axises
(
10
)
application
.
time_scale
=
5
self
.
orbit_lines
=
[]
for
body
in
self
.
bodies
[
1
:]:
if
isinstance
(
body
,
HalleComet
):
continue
print
(
"create_orbit_line"
,
body
)
orbit_line
=
create_orbit_line
(
self
.
sun
,
body
,
rotation_x
=
70
)
"""
# 在 ursina 中,我以 sun.position 为中心, body.position 的所在位置(x,y,z) 画一个圆环(orbit_line)。
到 sun 中心点(x,y,z) 为半径,返回一个圆形轨道 orbit_line
orbit_line = create_orbit_line(sun, body)
# 帮我解决下面的问题,怎么修改下面的值,让 orbit_line 轨道线的倾斜和 body 匹配
orbit_line.rotation_x = ?
orbit_line.rotation_y = ?
orbit_line.rotation_z = ?
body.position - sun.position
"""
orbit_line
=
create_orbit_line
(
self
.
sun
,
body
)
angle_x
,
angle_y
,
angle_z
=
self
.
calculate_angles
(
self
.
sun
.
planet
.
position
,
body
.
planet
.
position
)
# # 获取body相对于self.sun的位置向量
# relative_position = body.planet.position - self.sun.planet.position
#
# rotation_x = -math.degrees(
# math.atan2(relative_position.y, math.sqrt(relative_position.x ** 2 + relative_position.z ** 2)))
# rotation_y = math.degrees(math.atan2(relative_position.x, relative_position.z))
# # 计算旋转角度
# orbit_line.rotation_x = rotation_x + 90
# orbit_line.rotation_z = 0
# orbit_line.rotation_y = rotation_y + 120
# #
# angle = math.atan2(relative_position.y, relative_position.x)
orbit_line
.
rotation_x
=
angle_x
+
90
orbit_line
.
rotation_y
=
angle_y
+
180
orbit_line
.
rotation_z
=
angle_z
orbit_line
.
body
=
body
self
.
orbit_lines
.
append
(
orbit_line
)
...
...
@@ -155,4 +225,5 @@ if __name__ == '__main__':
show_camera_info
=
False
,
show_control_info
=
False
,
show_timer
=
True
,
show_grid
=
False
)
show_grid
=
False
)
simulators/ursina/entities/world_grid.py
浏览文件 @
28e024d5
...
...
@@ -16,15 +16,21 @@ class WorldGrid(Singleton, Entity):
创建一个宇宙网格对象
"""
def
draw_axises
(
self
):
def
draw_axises
(
self
,
scale_factor
=
1
):
"""
画坐标轴
@return:
"""
arrow_x
,
line_x
,
text_x
=
create_arrow_line
((
0
,
0
,
0
),
(
10
,
0
,
0
),
label
=
"X"
,
color
=
color
.
red
)
arrow_y
,
line_y
,
text_y
=
create_arrow_line
((
0
,
0
,
0
),
(
0
,
10
,
0
),
label
=
"Y"
,
color
=
color
.
green
)
arrow_z
,
line_z
,
text_z
=
create_arrow_line
((
0
,
0
,
0
),
(
0
,
0
,
10
),
label
=
"Z"
,
color
=
color
.
yellow
)
len_scale
=
0.5
*
scale_factor
arrow_scale
=
1
*
scale_factor
text_scale
=
50
*
scale_factor
arrow_x
,
line_x
,
text_x
=
create_arrow_line
((
0
,
0
,
0
),
(
10
,
0
,
0
),
label
=
"X"
,
len_scale
=
len_scale
,
arrow_scale
=
arrow_scale
,
text_scale
=
text_scale
,
color
=
color
.
red
)
arrow_y
,
line_y
,
text_y
=
create_arrow_line
((
0
,
0
,
0
),
(
0
,
10
,
0
),
label
=
"Y"
,
len_scale
=
len_scale
,
arrow_scale
=
arrow_scale
,
text_scale
=
text_scale
,
color
=
color
.
green
)
arrow_z
,
line_z
,
text_z
=
create_arrow_line
((
0
,
0
,
0
),
(
0
,
0
,
10
),
label
=
"Z"
,
len_scale
=
len_scale
,
arrow_scale
=
arrow_scale
,
text_scale
=
text_scale
,
color
=
color
.
yellow
)
def
__init__
(
self
,
position
=
None
,
scale
=
None
):
super
().
__init__
()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录