当前位置: 首页 > news >正文

【代码】3d->video

mesh->video

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
import matplotlib.animation as animation
from pywavefront import Wavefront
import osname='dog'
# 读取OBJ文件并将其转换为numpy数组
obj_folder =f'path/{name}/'
obj_files = os.listdir(obj_folder)# 使用列表推导式筛选出以 'e300.obj' 结尾的文件
e300_obj_files = [file for file in obj_files if file.endswith('e300.obj')]# 定义一个函数用来从文件名中提取frame后的数字
def extract_frame_number(filename):# 从文件名中找到"frame_"和第一个"_"之后的位置start = filename.find('frame_') + 6end = filename.find('_', start)# 提取并返回数字部分return int(filename[start:end])# 使用自定义函数对文件列表进行排序
sorted_e300_obj_files = sorted(e300_obj_files, key=extract_frame_number)meshes = []
for obj_file in sorted_e300_obj_files:obj = Wavefront(obj_folder + obj_file, collect_faces=True)vertices = np.array(obj.vertices)faces = np.array(obj.mesh_list[0].faces)meshes.append((vertices, faces))fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')# 初始化绘图函数
def init():ax.clear()ax.set_xlabel('X')ax.set_ylabel('Y')ax.set_zlabel('Z')# 动画更新函数
def update(frame):ax.clear()vertices, faces = meshes[frame]x, y, z = vertices[:, 0], vertices[:, 1], vertices[:, 2]ax.plot_trisurf(x, y, z, triangles=faces, shade=True, color='gray')ax.set_title(f'{name} Frame {frame}')ax.set_xlim(x.min(), x.max())ax.set_ylim(y.min(), y.max())ax.set_zlim(z.min(), z.max())# ax.view_init(elev=20, azim=45)  # 设置视角# 创建动画
ani = FuncAnimation(fig, update, frames=len(meshes), init_func=init, blit=False)# 使用FFmpeg写入视频文件
writervideo = animation.FFMpegWriter(fps=10) 
ani.save(f'n_{name}.mp4', writer=writervideo)

joints->video

import os
from os.path import join as pjoin
from tqdm import tqdm
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation, PillowWriter
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
import mpl_toolkits.mplot3d.axes3d as p3
def plot_3d_motion(save_path, kinematic_tree, joints, title, figsize=(10, 10), fps=120, radius=4):title_sp = title.split(' ')if len(title_sp) > 10:title = '\n'.join([' '.join(title_sp[:10]), ' '.join(title_sp[10:])])def init():ax.set_xlim3d([-radius / 2, radius / 2])ax.set_ylim3d([0, radius])ax.set_zlim3d([0, radius])fig.suptitle(title, fontsize=20)ax.grid(False)def plot_xzPlane(minx, maxx, miny, minz, maxz):verts = [[minx, miny, minz],[minx, miny, maxz],[maxx, miny, maxz],[maxx, miny, minz]]xz_plane = Poly3DCollection([verts])xz_plane.set_facecolor((0.5, 0.5, 0.5, 0.5))ax.add_collection3d(xz_plane)data = joints.copy().reshape(len(joints), -1, 3)fig = plt.figure(figsize=figsize)ax = fig.add_subplot(111, projection='3d')init()MINS = data.min(axis=0).min(axis=0)MAXS = data.max(axis=0).max(axis=0)colors = ['red', 'blue', 'black', 'red', 'blue',  'darkblue', 'darkblue', 'darkblue', 'darkblue', 'darkblue','darkred', 'darkred', 'darkred', 'darkred', 'darkred']frame_number = data.shape[0]height_offset = MINS[1]data[:, :, 1] -= height_offsettrajec = data[:, 0, [0, 2]]data[..., 0] -= data[:, 0:1, 0]data[..., 2] -= data[:, 0:1, 2]def update(index):ax.cla()  # 清除当前轴init()  # 重新初始化轴ax.view_init(elev=120, azim=-90)ax.dist = 7.5plot_xzPlane(MINS[0]-trajec[index, 0], MAXS[0]-trajec[index, 0], 0, MINS[2]-trajec[index, 1], MAXS[2]-trajec[index, 1])if index > 1:ax.plot3D(trajec[:index, 0]-trajec[index, 0], np.zeros_like(trajec[:index, 0]), trajec[:index, 1]-trajec[index, 1], linewidth=1.0, color='blue')for i, (chain, color) in enumerate(zip(kinematic_tree, colors)):linewidth = 4.0 if i < 5 else 2.0ax.plot3D(data[index, chain, 0], data[index, chain, 1], data[index, chain, 2], linewidth=linewidth, color=color)plt.axis('off')ax.set_xticklabels([])ax.set_yticklabels([])ax.set_zticklabels([])ani = FuncAnimation(fig, update, frames=frame_number, interval=1000/fps, repeat=False)ani.save(save_path, fps=fps)plt.close()
http://www.lryc.cn/news/372965.html

相关文章:

  • 算法01 递推算法及相关问题详解【C++实现】
  • 自动化测试火狐下载文件
  • 基于JSP技术的定西扶贫惠农推介系统
  • Linux 终端窗口设置为透明
  • MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?
  • 强化RAG:微调Embedding还是LLM?
  • 提取 Excel单元格文本下的超链接
  • 一键安全体检!亚信安全携手鼎捷软件推出企业安全体检活动 正式上线
  • numpy - array(1)
  • 师彼长技以助己(6)递归思维
  • Kali Linux 2024.2
  • 【Spine学习08】之短飘,人物头发动效制作思路
  • chatgpt的命令词
  • 用python把docx批量转为pdf
  • 项目采购管理
  • Elasticsearch 认证模拟题 - 18
  • Python基础-速记笔记
  • 青少年编程与数学 01-001开始使用计算机 02课题、计算机操作系统3_3
  • 填表统计预约打卡表单系统(FastAdmin+ThinkPHP+UniApp)
  • IO模型和多路转接
  • 如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题
  • SpringCloud微服务架构(eureka、nacos、ribbon、feign、gateway等组件的详细介绍和使用)
  • flinksql BUG : flink hologres-cdc source FINISHED
  • 现代密码学-国密算法
  • Postman简介
  • oracle 删除当前用户下所有表
  • 探索C嘎嘎的奇妙世界:第二关---C++的输入与输出
  • 实现思路:Vue 子组件高度不固定下实现瀑布流布局
  • 构建实时搜索与推荐系统:Elasticsearch与业务结合
  • 鸿蒙 如何将base64的图片保存到相册