Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
宇宙模拟器
提交
70e991aa
宇宙模拟器
项目概览
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看板
提交
70e991aa
编写于
2月 06, 2024
作者:
三月三net
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Python超人-宇宙模拟器
上级
68b368fb
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
158 addition
and
4 deletion
+158
-4
sim_scenes/featured/earth_3d_2.py
sim_scenes/featured/earth_3d_2.py
+143
-0
simulators/ursina/entities/entity_utils.py
simulators/ursina/entities/entity_utils.py
+15
-4
未找到文件。
sim_scenes/featured/earth_3d_2.py
0 → 100644
浏览文件 @
70e991aa
# -*- coding:utf-8 -*-
# title :地球3D效果
# description :地球3D效果
# author :Python超人
# date :2023-11-28
# link :https://gitcode.net/pythoncr/
# python_version :3.8
# ==============================================================================
from
bodies
import
Earth
,
Moon
,
Jupiter
from
common.consts
import
SECONDS_PER_HOUR
,
AU
from
objs
import
CoreValagaClas
from
objs.sci_fi_space_station
import
ScifiSpaceStation
from
sim_scenes.func
import
ursina_run
,
create_sphere_sky
from
sim_scenes.universe_sim_scenes
import
UniverseSimScenes
from
simulators.ursina.entities.entity_utils
import
create_directional_light
from
simulators.ursina.ursina_event
import
UrsinaEvent
if
__name__
==
'__main__'
:
"""
地球3D效果(透视3D地球)
"""
space_station
=
ScifiSpaceStation
(
name
=
"空间站"
,
size_scale
=
0.4
,
# init_position=[0.46 * mars_radius, 0, -3.55e4],
# init_position=[9e3, -2.3e3, -32e3],
init_position
=
[
10.5e3
,
-
1e3
,
-
52e3
],
init_velocity
=
[
0
,
0
,
0
])
\
.
set_ignore_gravity
(
True
).
set_light_disable
(
True
)
space_ship
=
CoreValagaClas
(
name
=
"飞船"
,
mass
=
1e30
,
color
=
(
111
,
140
,
255
),
# init_position=[0, 0, 0],
# init_position=[D, 0, -D],
# init_position=[0, D * 1.15, -D * 2.05],
init_position
=
[
9e3
,
-
1e3
,
-
38e3
],
init_velocity
=
[
0
,
0
,
0
],
# texture="core_valaga_clas_light.jpg",
# size_scale=self.SIZE_SCALE * 1e3
size_scale
=
0.6
).
set_ignore_gravity
(
True
).
set_light_disable
(
True
)
# 创建带有云层的地球
earth
=
Earth
(
# texture="earth_hd.jpg",
# texture="earth_hd_trans.png",
rotation_speed
=
100
,
texture
=
"earth-huge.jpg"
,
rotate_angle
=-
25
,
init_position
=
[
0
,
0
,
0
],
init_velocity
=
[
0
,
0
,
0
],
size_scale
=
1
)
moon
=
Moon
(
init_position
=
[
AU
/
60
,
AU
/
80
,
AU
/
10
],
distance_scale
=
0.01
,
size_scale
=
3
,
init_velocity
=
[
-
(
29.79
+
1.03
)
*
40
,
0
,
0
],
).
set_ignore_gravity
(
True
)
jupiter
=
Jupiter
(
init_position
=
[
3
*
AU
/
100
,
AU
/
20
,
AU
/
5
],
texture
=
"jupiter_hd.jpg"
,
distance_scale
=
0.01
,
size_scale
=
0.2
,
init_velocity
=
[
-
(
29.79
+
1.03
)
*
30
,
0
,
0
],
).
set_ignore_gravity
(
True
)
# 创建云层(texture纹理图使用了透明云层的图片,云层的 size_scale 要稍微比地球大一点)
clouds
=
Earth
(
name
=
"地球云层"
,
texture
=
"earth-huge-cn-flag.png"
,
rotate_angle
=-
25
,
rotation_speed
=
100
,
size_scale
=
1.001
,
parent
=
earth
)
bodies
=
[
earth
,
clouds
,
moon
,
jupiter
,
space_ship
,
space_station
]
# bodies = [earth]
# TODO: 开启3D摄像机
from
simulators.ursina.entities.camera3d
import
Camera3d
# 3D摄像机初始化(两眼到鼻梁的距离为1000公里效果)
Camera3d
.
init
(
eye_distance
=
400
)
# 录制:
# sim_video_3d_cap.bat featured earth_3d earth_3d.mp4
sky
=
None
def
on_ready
():
global
sky
from
ursina
import
application
application
.
time_scale
=
0.0001
# 运行前触发
sky
=
create_sphere_sky
(
texture
=
"bg_pan2.jpg"
,
scale
=
10000
,
rotation_x
=
20
,
rotation_y
=
160
,
rotation_z
=
20
)
# sky = create_sphere_sky(texture="cosmic_pan_02\cosmic_pan_1.jpg", scale=10000, rotation_y=150)
earth
.
planet
.
rotation_y
=
-
100
clouds
.
planet
.
rotation_y
=
-
100
clouds
.
planet
.
alpha
=
0.5
# moon.planet.rotation_x = -90
moon
.
planet
.
rotation_y
=
100
# 为了较好的立体效果,可以增加太阳光线,光线指向木星(target=jupiter)
create_directional_light
(
position
=
(
10.5e3
,
-
1e3
,
-
175e3
),
light_num
=
1
,
target
=
moon
,
look_at_target_always
=
True
)
def
on_timer_changed
(
time_data
):
global
sky
# print(earth.planet.rotation_y)
sky
.
rotation_z
-=
0.004
p
=
space_ship
.
init_position
space_ship
.
init_position
=
(
p
[
0
],
p
[
1
],
p
[
2
]
+
0.5e1
)
space_station
.
planet
.
rotation_z
+=
0.1
p
=
space_station
.
init_position
space_station
.
init_position
=
(
p
[
0
],
p
[
1
],
p
[
2
]
+
0.5e1
)
if
abs
(
earth
.
planet
.
rotation_y
)
>
600
:
exit
(
0
)
print
(
"earth.rotation_y"
,
abs
(
earth
.
planet
.
rotation_y
))
# from ursina import camera, Vec3, time
# camera.parent.position += Vec3(0.0000001 * time_data.dt, 0, -0.0000003 * time_data.dt)
# Camera3d.look_to(earth.planet)
# camera.parent.look_at(earth.planet)
# # camera.rotation_x = 0
# # camera.rotation_y = 0
# camera.rotation_z = 0
UniverseSimScenes
.
set_window_size
((
1920
,
1079
),
False
)
UrsinaEvent
.
on_ready_subscription
(
on_ready
)
UrsinaEvent
.
on_timer_changed_subscription
(
on_timer_changed
)
# 使用 ursina 查看的运行效果
# 常用快捷键: P:运行和暂停 O:重新开始 I:显示天体轨迹
# position = 左-右+、上+下-、前+后-
ursina_run
(
bodies
,
SECONDS_PER_HOUR
/
20
,
# SECONDS_PER_HOUR,
position
=
(
1.90
*
earth
.
radius
,
0
,
-
40000
),
cosmic_bg
=
""
,
# 无背景(黑色)
show_grid
=
False
,
# 不显示网格
show_camera_info
=
False
,
# 不显示摄像机信息
show_control_info
=
False
,
# 不显示控制提示信息
show_exit_button
=
False
,
timer_enabled
=
True
,
view_closely
=
0.001
)
# 近距离观看 view_closely=True或0.001
simulators/ursina/entities/entity_utils.py
浏览文件 @
70e991aa
...
...
@@ -23,7 +23,6 @@ import math
import
numpy
as
np
def
create_name_text
(
parent
):
"""
...
...
@@ -190,7 +189,8 @@ def create_trail_sphere(parent, pos):
# return value, direction
def
create_directional_light
(
position
,
target
=
None
,
shadows
=
False
,
light_num
=
1
,
light_color
=
None
):
def
create_directional_light
(
position
,
target
=
None
,
shadows
=
False
,
light_num
=
1
,
light_color
=
None
,
look_at_target_always
=
False
):
"""
创建平行光(DirectionalLight)
@param position: 光源位置
...
...
@@ -228,13 +228,23 @@ def create_directional_light(position, target=None, shadows=False, light_num=1,
if
target
is
not
None
:
for
light
in
lights
:
if
hasattr
(
target
,
"planet"
):
if
hasattr
(
target
.
planet
,
"main_entity"
):
light
.
look_at
(
target
.
planet
.
main_entity
)
_target
=
target
.
planet
.
main_entity
else
:
light
.
look_at
(
target
.
planet
)
_target
=
target
.
planet
else
:
light
.
look_at
(
target
)
_target
=
target
if
look_at_target_always
:
def
light_update
():
light
.
look_at
(
_target
)
light
.
update
=
light_update
if
shadows
:
return
lit_with_shadows_shader
...
...
@@ -414,9 +424,10 @@ def create_foreground(foreground_img):
texture
=
foreground_img
,
color
=
color
.
white
,
origin
=
(
-
.
48
,
.
48
,
-
.
48
),
scale
=
(
width
*
2
,
height
),
scale
=
(
width
*
2
,
height
),
position
=
(
-
0.86
,
-
0.33
,
0
)
)
# foreground = Entity(model='quad', scale=(1, 1), texture=foreground_img, eternal=True)
# 设置前景图片层的位置和缩放
...
...
@@ -493,8 +504,8 @@ def create_trail_info(body, trail):
if
__name__
==
'__main__'
:
from
ursina
import
*
app
=
Ursina
()
create_foreground
(
"sun.jpg"
)
EditorCamera
()
app
.
run
()
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录