Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Python_超人
宇宙模拟器
提交
c57f3e76
宇宙模拟器
项目概览
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看板
提交
c57f3e76
编写于
6月 11, 2023
作者:
三月三net
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Python超人-宇宙模拟器
上级
ea8fa9bb
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
293 addition
and
0 deletion
+293
-0
common/video_recorder.py
common/video_recorder.py
+285
-0
sim_scenes/func.py
sim_scenes/func.py
+8
-0
未找到文件。
common/video_recorder.py
0 → 100644
浏览文件 @
c57f3e76
from
ursina
import
Entity
,
time
,
application
,
Path
import
os
,
shutil
import
builtins
import
numpy
as
np
class
VideoRecorder
(
Entity
):
def
__init__
(
self
,
temp_dir
=
"video_temp"
,
file_name
=
"test"
,
asset_folder
=
None
,
save_as_dir
=
None
):
self
.
temp_dir
=
temp_dir
self
.
file_name
=
file_name
self
.
save_as_dir
=
save_as_dir
if
asset_folder
is
None
:
asset_folder
=
application
.
asset_folder
# G:\works\gitcode\universe_sim\sim_scenes\science
self
.
file_path
=
Path
(
asset_folder
)
/
self
.
temp_dir
self
.
duration
=
1.0
self
.
fps
=
30
self
.
sd
=
6
self
.
t
=
0
self
.
i
=
0
if
getattr
(
builtins
,
'base'
,
None
)
is
not
None
:
if
self
.
file_path
.
exists
():
# os.rmdir(self.file_path)
shutil
.
rmtree
(
self
.
file_path
)
self
.
file_path
.
mkdir
()
base
.
movie
(
namePrefix
=
f
'
\\
{
self
.
temp_dir
}
\\
{
self
.
file_name
}
'
,
duration
=
self
.
duration
,
fps
=
self
.
fps
,
format
=
'png'
,
sd
=
self
.
sd
)
def
screenshot
(
self
):
self
.
t
+=
time
.
dt
if
self
.
t
>=
1
/
self
.
fps
:
base
.
screenshot
(
namePrefix
=
f
'
\\
{
self
.
temp_dir
}
\\
{
self
.
file_name
}
_'
+
str
(
self
.
i
).
zfill
(
self
.
sd
)
+
'.png'
,
defaultFilename
=
0
,
)
self
.
t
=
0
self
.
i
+=
1
def
save_as_video
(
self
):
import
imageio
if
not
os
.
path
.
exists
(
self
.
file_path
):
return
if
self
.
save_as_dir
is
None
:
self
.
save_as_dir
=
"."
writer
=
imageio
.
get_writer
(
Path
(
f
'
{
self
.
save_as_dir
}
/
{
self
.
file_name
}
.mp4'
),
fps
=
self
.
fps
)
for
filename
in
os
.
listdir
(
self
.
file_path
):
im
=
imageio
.
imread
(
self
.
file_path
/
filename
)
if
len
(
im
.
shape
)
==
2
:
# 可能为透明图片(无影像数据)
continue
writer
.
append_data
(
im
)
writer
.
close
()
print
(
'Saved VIDEO to:'
,
Path
(
f
'
{
self
.
save_as_dir
}
/
{
self
.
file_name
}
.mp4'
))
def
save_as_gif
(
self
):
import
imageio
images
=
[]
if
not
os
.
path
.
exists
(
self
.
file_path
):
return
if
self
.
save_as_dir
is
None
:
self
.
save_as_dir
=
self
.
file_path
.
parent
for
filename
in
os
.
listdir
(
self
.
file_path
):
images
.
append
(
imageio
.
imread
(
self
.
file_path
/
filename
))
imageio
.
mimsave
(
Path
(
f
'
{
self
.
save_as_dir
}
/
{
self
.
file_name
}
.gif'
),
images
)
# shutil.rmtree(self.file_path) # delete temp folder
print
(
'Saved GIF to:'
,
Path
(
f
'
{
self
.
save_as_dir
}
/
{
self
.
file_name
}
.gif'
))
if
__name__
==
'__main__'
:
# Path("G:\\works\\gitcode\\universe_sim\\sim_scenes\\science")
vr
=
VideoRecorder
(
asset_folder
=
"G:
\\
works
\\
gitcode
\\
universe_sim
\\
sim_scenes
\\
science"
)
# vr.save_as_gif()
vr
.
save_as_video
()
# from ursina import *
# import os, shutil
# import numpy as np
#
# # import imageio # gets imported in convert_to_gif
# # from panda3d.core import PNMImage
# # pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com imageio-ffmpeg
# import shutil
#
#
# class VideoRecorder(Entity):
# def __init__(self, duration=50, name='untitled_video', **kwargs):
# os.environ["PATH"] = os.environ["PATH"] + ";" + "F:\\Tools\\ffmpeg"
# super().__init__()
# self.recording = False
# self.file_path = Path(application.asset_folder) / 'video_temp'
#
# if os.path.exists(self.file_path):
# shutil.rmtree(self.file_path)
#
# os.mkdir(self.file_path)
#
# # if os.path.exists(self.file_path):
# # os.rmdir(self.file_path)
# #
# # os.mkdir(self.file_path)
#
# self.i = 0
# self.duration = duration
# self.fps = 50
# self.video_name = name
# self.t = 0
#
# for key, value in kwargs.items():
# setattr(self, key, value)
#
# self.max_frames = int(self.duration * self.fps)
# self.frames = []
#
# def start_recording(self):
# print('start recording,', self.duration, self.file_path)
# window.fps_counter.enabled = False
# window.exit_button.visible = False
# self.frames = []
# self.max_frames = self.duration * self.fps
# if not self.file_path.exists():
# self.file_path.mkdir()
# base.movie(namePrefix=f'\\video_temp\\{self.video_name}', duration=self.duration, fps=self.fps, format='png', sd=4)
#
# self.recording = True
# invoke(self.stop_recording, delay=self.duration)
#
# def stop_recording(self):
# self.recording = False
# window.fps_counter.enabled = True
# window.exit_button.visible = True
# print('stop recording')
# # self.convert_to_gif()
# self.convert_to_vid()
#
# def update(self):
# if not self.recording:
# return
#
# self.t += time.dt
# if self.t >= 1 / 30:
# base.screenshot(
# namePrefix='\\video_temp\\' + self.video_name + '_' + str(self.i).zfill(4) + '.png',
# defaultFilename=0,
# )
# self.t = 0
# self.i += 1
#
# def convert_to_gif(self):
# import imageio
# images = []
# if not os.path.exists(self.file_path):
# return
#
# for filename in os.listdir(self.file_path):
# images.append(imageio.imread(self.file_path / filename))
#
# imageio.mimsave(Path(f'{self.file_path.parent}/{self.video_name}.gif'), images)
# shutil.rmtree(self.file_path) # delete temp folder
# print('saved gif to:', Path(f'{self.file_path.parent}/{self.video_name}.gif'))
#
# def convert_to_vid(self):
# import imageio
# images = []
# if not os.path.exists(self.file_path):
# return
#
# writer = imageio.get_writer('test.mp4', fps=self.fps)
# for file in os.listdir(self.file_path):
# im = imageio.imread(self.file_path / file)
# writer.append_data(im)
# writer.close()
# print('Video saved!!')
#
#
# class VideoRecorderUI(WindowPanel):
# def __init__(self, **kwargs):
# self.duration_label = Text('duration:')
# self.duration_field = InputField(default_value='5')
# self.fps_label = Text('fps:')
# self.fps_field = InputField(default_value='30')
# self.name_label = Text('name:')
# self.name_field = InputField(default_value='untitled_video')
#
# self.start_button = Button(text='Start Recording [Shift+F12]', color=color.azure, on_click=self.start_recording)
#
# super().__init__(
# title='Video Recorder [F12]',
# content=(
# self.duration_label,
# self.duration_field,
# self.fps_label,
# self.fps_field,
# self.name_label,
# self.name_field,
# Space(1),
# self.start_button,
# ),
# )
# self.y = .5
# self.scale *= .75
# self.visible = False
#
# def input(self, key):
# if key == 'f12':
# self.visible = not self.visible
#
# if held_keys['shift'] and key == 'f12':
# self.start_button.on_click()
#
# def start_recording(self):
# print(self.name_field)
# if self.name_field.text == '':
# self.name_field.blink(color.color(0, 1, 1, .5), .5)
# print('enter name')
# return
#
# # self.start_button.color=color.lime
# self.visible = False
# application.video_recorder.duration = float(self.duration_field.text)
# application.video_recorder.video_name = self.name_field.text
# application.video_recorder.frame_skip = 60 // int(self.fps_field.text)
# application.video_recorder.recording = True
#
#
# if __name__ == '__main__':
# app = Ursina()
# # window.size = (1600/3,900/3)
# # cube = primitives.RedCube()
# # cube.animate_x(5, duration=5, curve=curve.linear)
# # cube.animate_x(0, duration=5, curve=curve.linear, delay=5)
# # vr = VideoRecorder()
# # invoke(setattr, vr, 'recording', True, delay=1)
# # invoke(os._exit, 0, delay=6)
# # vr.recording = True
# window.size *= .5
# from ursina.prefabs.first_person_controller import FirstPersonController
# from ursina.shaders import lit_with_shadows_shader
#
# random.seed(0)
# Entity.default_shader = lit_with_shadows_shader
#
# ground = Entity(model='plane', collider='box', scale=64, texture='grass', texture_scale=(4, 4))
#
# editor_camera = EditorCamera(enabled=False, ignore_paused=True)
# player = FirstPersonController(model='cube', z=-10, color=color.orange, origin_y=-.5, speed=8)
# player.collider = BoxCollider(player, Vec3(0, 1, 0), Vec3(1, 2, 1))
#
# gun = Entity(model='cube', parent=camera, position=(.5, -.25, .25), scale=(.3, .2, 1), origin_z=-.5,
# color=color.red, on_cooldown=False)
#
# shootables_parent = Entity()
# mouse.traverse_target = shootables_parent
#
# for i in range(16):
# Entity(model='cube', origin_y=-.5, scale=2, texture='brick', texture_scale=(1, 2),
# x=random.uniform(-8, 8),
# z=random.uniform(-8, 8) + 8,
# collider='box',
# scale_y=random.uniform(2, 3),
# color=color.hsv(0, 0, random.uniform(.9, 1))
# )
#
# sun = DirectionalLight()
# sun.look_at(Vec3(1, -1, -1))
# Sky()
#
# vr = VideoRecorder(duration=10)
#
#
# def input(key):
# if key == '5':
# vr.start_recording()
# if key == '6':
# vr.stop_recording()
#
#
# app.run()
sim_scenes/func.py
浏览文件 @
c57f3e76
...
...
@@ -117,6 +117,7 @@ def ursina_run(bodies,
show_timer
=
False
,
timer_enabled
=
False
,
save_as_json
=
None
,
save_as_video
=
False
,
view_closely
=
False
):
"""
ursina 模拟器运行天体
...
...
@@ -155,6 +156,10 @@ def ursina_run(bodies,
view_azimuth
=
0
# 暂时未用
player
=
UrsinaPlayer
(
position
,
view_azimuth
,
simulator
.
ursina_views
)
if
save_as_video
:
from
common.video_recorder
import
VideoRecorder
vr
=
VideoRecorder
()
def
callback_update
():
UrsinaEvent
.
on_application_run
()
for
ursina_view
in
simulator
.
ursina_views
:
...
...
@@ -162,6 +167,9 @@ def ursina_run(bodies,
if
ursina_view
.
appeared
:
ursina_view
.
update
()
if
save_as_video
:
vr
.
screenshot
()
import
sys
from
simulators.ursina.ursina_config
import
UrsinaConfig
from
simulators.ursina.ursina_event
import
UrsinaEvent
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录