3D头模加载

devtools/2024/10/20 5:22:01/

目录

mesh参数

psbody加载

psbody示例

trimesh加载

加载动画:

openmesh


mesh参数

5023个顶点

9976个面。

from psbody.mesh import Mesh选择相机参数:
python
Copy code
if template_type == "flame":camera_params = {'c': np.array([400, 400]),'k': np.array([-0.19816071, 0.92822711, 0, 0, 0]),'f': np.array([4754.97941935 / 2, 4754.97941935 / 2])}
elif template_type == "biwi":camera_params = {'c': np.array([400, 400]),'k': np.array([-0.19816071, 0.92822711, 0, 0, 0]),'f': np.array([4754.97941935 / 8, 4754.97941935 / 8])}
这里根据 template_type 变量的值来设置相机参数:
camera_params: 是一个包含相机参数的字典。
'c': 表示相机的光心坐标(以像素为单位)。
'k': 表示镜头的畸变系数数组,其中可能包含径向和切向畸变参数。
'f': 表示焦距,以像素为单位。
设置视锥体:
python
Copy code
frustum = {'near': 0.01, 'far': 3.0, 'height': 800, 'width': 800}
frustum 是一个字典,用于定义相机的视锥体参数:
'near': 表示相机的近平面距离。
'far': 表示相机的远平面距离。
'height' 和 'width': 表示视锥体的高度和宽度。
Mesh 对象创建:
python
Copy code
mesh_copy = Mesh(mesh.v, mesh.f)
这行代码创建了一个 Mesh 对象,它是 mesh_copy 的副本:
Mesh: 是一个类,表示一个 3D 网格模型。
mesh.v: 传递给 Mesh 构造函数的第一个参数,表示网格的顶点。
mesh.f: 传递给 Mesh 构造函数的第二个参数,表示网格的面。
mesh_copy 是 mesh 对象的副本,可以在后续操作中对其进行修改或渲染。

psbody加载

codetalker

from psbody.mesh import Meshif cfg.dataset == "BIWI":template_file = os.path.join(cfg.data_root, "BIWI.ply")elif cfg.dataset == "vocaset":template_file = os.path.join(cfg.data_root, "FLAME_sample.ply")print("rendering: ", test_name)template = Mesh(filename=template_file)

psbody示例

from psbody.mesh import Mesh
from psbody.mesh.meshviewer import MeshViewertemplate_file = r'BIWI/BIWI.ply'
template_file = r'E:\project\audio\audio2face\CodeTalker-main\vocaset\FLAME_sample.ply'
# template_file = r'E:\project\audio\audio2face\CodeTalker-main\BIWI\BIWI.ply'target_mesh = Mesh(filename=template_file)
target_mesh.set_vertex_colors('white')
viewer = MeshViewer()
# viewer.set_background_color((1.0, 1.0, 1.0),blocking=False)viewer.set_static_meshes([target_mesh], blocking=True)
# viewer.set_dynamic_meshes(target_mesh)
viewer.set_background_color((1.0, 1.0, 1.0))
viewer.show()

这个显示是黑屏,不能显示物体

trimesh加载

FaceDiffuser

import trimeshif __name__ == '__main__':template_file=f"data/BIWI/templates/face_template.obj"ref_mesh = trimesh.load_mesh(template_file, process=False)scene = trimesh.scene.scene.Scene([ref_mesh])# 显示场景scene.show()

报错:

ImportError: `trimesh.viewer.windowed` requires `pip install "pyglet<2"`

解决方法:

pip install "pyglet<2"

加载动画:


import trimeshimport numpy as npdef load_mesh(file_path):"""加载PLY文件并返回网格对象。"""return trimesh.load(file_path, process=False)def apply_smile(mesh, intensity=0.5):"""模拟微笑通过向上移动模型嘴角附近的顶点。"""# 假设嘴角的顶点索引已知mouth_corner_indices = [1500, 2300]  # 示例索引,需要根据实际模型调整movement = np.array([0, intensity, 0])  # 向上移动for idx in mouth_corner_indices:print(f"Vertex_o {idx}: {mesh.vertices[idx]}")  # 打印原始顶点位置# 更新嘴角顶点位置for idx in range(mouth_corner_indices[0],mouth_corner_indices[1]):mesh.vertices[idx] += movementfor idx in mouth_corner_indices:print(f"Vertex {idx}: {mesh.vertices[idx]}")  # 打印更新后的顶点位置
def main():# 路径替换为你的PLY文件路径mesh = load_mesh(r'E:\BIWI.ply')# 应用微笑表情变换apply_smile(mesh, intensity=0.1)  # 强度根据模型尺度调整# 使用trimesh提供的简单pyglet窗口显示结果mesh.show()if __name__ == "__main__":main()

openmesh

pip install openmesh

win11直接安装报错

从巴塞尔面模型 (BFM) 转换为 FLAME 头部模型

https://github.com/TimoBolkart/BFM_to_FLAME


http://www.ppmy.cn/devtools/27379.html

相关文章

vscode连接远程Linux服务器时,没有权限新建文件夹或者文件

参考链接&#xff1a; VS code 保存或新建文件没有权限的问题 vscode连接远程Linux服务器时&#xff0c;没有权限新建文件夹或者文件&#xff1a; 用一条命令解决&#xff1a; sudo chown -R myuser /path/to/foldermyuser是当前用户名&#xff0c; /path/to/folder是 需要操…

排序-八大排序FollowUp

FollowUp 1.插入排序 (1).直接插入排序 时间复杂度:最坏情况下:0(n^2) 最好情况下:0(n)当数据越有序 排序越快 适用于: 待排序序列 已经基本上趋于有序了! 空间复杂度:0(1) 稳定性:稳定的 public static void insertSort(int[] array){for (int i 1; i < array.length; i…

区块链 | IPFS 工作原理入门

&#x1f98a;原文&#xff1a;What is the InterPlanetary File System (IPFS), and how does it work? &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 去中心化互联网 尽管万维网是一个全球性的网络&#xff0c;但在数据存储方面&#…

MT3608B 航天民芯代理 1.2Mhz 24V输入 升压转换器

深圳市润泽芯电子有限公司为航天民芯一级代理商 技术支持欢迎试样~Tel&#xff1a;18028786817 简述 MT3608B是恒定频率的6针SOT23电流模式升压转换器&#xff0c;用于小型、低功耗应用。MT3608B开关频率为1.2MHz&#xff0c;允许使用微小、低电平成本电容器和电感器高度不…

Web前后端交互

前端与后端之间的交互是Web应用程序中至关重要的组成部分&#xff0c;它们通过一系列技术和协议进行数据交换&#xff0c;以实现用户界面与服务器端业务逻辑及数据存储的协同工作。以下是一些常见的交互方式&#xff1a; ### 1. HTTP请求&#xff08;主要包括AJAX、Fetch API&…

flutter开发实战-混淆minifyEnabled及shrinkResources

flutter开发实战-混淆minifyEnabled及shrinkResources 最近开发中&#xff0c;出现了在Debug模式下完全正常&#xff0c;打包build后出现插件代码调用提示未实现。 No implementation found for method login on channel app_plugin 经过查找发现在build apk时候出现了混淆的问…

网络通信基础

网络基本的概念: ip地址&#xff1a;标志网络上设备当前的位置 端口号&#xff1a;用来指定一个特定的应用程序 认识协议&#xff1a;在网络通信中&#xff0c;信息交互需要遵守的协议 OSI模型 (Open System Interconnection&#xff0c;开放系统互连) OSI模型只是在逻辑上把网…

[Java、Android面试]_24_Compose为什么绘制要比XML快?(高频问答)

欢迎查看合集&#xff1a; Java、Android面试高频系列文章合集 本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&am…