animator及metahuman dna解析

embedded/2024/10/20 8:16:19/

复现原始dna文件转成174 bs dna文件

METAHUMAN51/Source/MetaHumanMeshTracker/Private/api/FaceTrackingAPI.cpp的 pcaRigCreator是将原始dna转为gui control的pca的dna对象

METAHUMAN51/Source/MetaHumanMeshTracker/Private/nls/src/rig/RigLogic.cpp  是读取原始dna文件的代码

METAHUMAN51/Source/MetaHumanMeshTracker/Private/tracking/src/rt/PCARig.cpp  读取174 bs dna文件的代码

METAHUMAN51/Source/MetaHumanMeshTracker/Private/tracking/src/rt/PCARigCreator.cpp  是转换代码,需要复现。

发现了一个config文件缺失,pca_from_dna_configuration.json

blendshape

METAHUMAN51/Source/MetaHumanMeshTracker/Private/nls/src/rig/RigLogic.cpp:里面414行是把rawControl的269系数转成814维系数的代码,
814维系数经过blendshapeControlsToMeshBlendshapeControls映射后得到737维系数,和dna文件中blendshapeMatrixDenseRM的 (72147, 737)大小的 blendshape相乘并加上原始顶点得到最终顶点
blendshape_vertices_flattened += blendshape_matrix @ diff_mesh_blendshapes.value

骨骼蒙皮

dna文件里jointMatrixPerLOD的矩阵和814维度系数相乘,转为870个骨骼点*6(6维前三维是位移,后三维是xyz的欧拉角)= 5220维骨骼系数,

870个骨骼点的初始局部变换矩阵和5220的骨骼系数转换得到的变换矩阵相乘得到局部变换矩阵,每层次叠加变换得到 最终的骨骼点世界变换矩阵,骨骼点世界变换矩阵和dna文件的jointRig2StateInverseBindPoses相乘,得到最终蒙皮变换矩阵state['skinning_matrices'],  大小为870个骨骼点*4*4,从dna文件的getSkinWeightsValues处理得到骨骼点-面片顶点关系及点对权重并存在(面片顶点数*870)的矩阵中,最终变换如下所示:

result += weight * (state['skinning_matrices'][joint_index][:3,:3] @ rest_vertices[vID,: ]+state['skinning_matrices'][joint_index][:3,3])

pca上述815个表情得到176维blendshape,拟合图像表情得到系数后,再转为gui control的系数(怎么转的?)

METAHUMAN51/Source/MetaHumanMeshTracker/Private/posebasedsolver/src/RigPoseBasedSolver.cpp  SolveFrame函数里输入拟合表情后的pca模型顶点数据

再调用METAHUMAN51/Source/MetaHumanMeshTracker/Private/posebasedsolver/include/posebasedsolver/modular_solver.h的solve_frame函数进行转换,该函数用的解算器通过

METAHUMAN51/Source/MetaHumanMeshTracker/Private/api/FaceTrackingAPI.cpp的TrainSolverModels并且使用一些数据(没找到)得到

METAHUMAN51-main\Source\MetaHumanMeshTracker\Private\nls\src\rig\RigLogicSolveControls.cpp的EvaluateGuiControls函数gui control转为raw control

生成阶段代码顺序:先用pca模型拟合人脸,再调用rig logic插件自动绑定得到


http://www.ppmy.cn/embedded/128939.html

相关文章

15分钟学Go 第5天:数据类型

第5天:数据类型 在Go语言中,数据类型是构成程序的重要基础,它们定义了可以在程序中使用的数据特征。了解不同的数据类型及其用途将帮助我们更有效地编写Go代码。在本章节中,我们将详细探讨Go语言的基本数据类型。 1. 数据类型的…

2024软考网络工程师笔记 - 第3章.广域通信网

文章目录 广域网物理层特性1️⃣公共交换电话网 PSTN2️⃣本地回路3️⃣机械特性4️⃣电气特性 🕑流量与差错控制1️⃣流量与差错控制2️⃣流量控制——亭等协议3️⃣流控机制——滑动窗口协议4️⃣差错控制5️⃣差错控制——停等协议6️⃣差错控制——选择重发ARQ协…

three.js 实现一个心形的着色器

three.js 实现一个心形的着色器 源链接:https://z2586300277.github.io/three-cesium-examples/#/codeMirror?navigationThreeJS&classifyshader&idheartShader 国内站点预览:http://threehub.cn github地址: https://github.com/z258630027…

【C++】C++当中的复合类型——引用和指针

C当中的复合类型 最近开始系统地学习 C 的语法,参考的主要资料来自于 C Primer 第五版,对于学习过程中所遇到的较难理解的点,我会以blog的形式对问题和内容进行记录,并进行进一步地探讨。 这一部分的内容对应于参考资料 C Prime…

电子物证的数字化时代:龙信科技引领取证技术革新

文章关键词:电子物证、手机取证、云取证、介质取证、电子数据取证 在信息技术飞速发展的今天,电子物证在司法领域扮演着越来越重要的角色。电子物证是指以存储于介质载体中的电磁记录或光电记录对案件事实起证明作用的电子信息数据及其附属物。与传统物…

leetcode.3194.最小元素和最大元素的最小平均值

#简单 你有一个初始为空的浮点数数组 averages。另给你一个包含 n 个整数的数组 nums,其中 n 为偶数。 你需要重复以下步骤 n / 2 次: 从 nums 中移除 最小 的元素 minElement 和 最大 的元素 maxElement。将 (minElement maxElement) / 2 加入到 avera…

宏基因组分析软件

humann2有参物种功能定量流程 合并质控后的双端数据 conda install humman2 wd/db/humann2 mkdir -p $wd humann2_databases #显示可用数据库 humann2_databases --download chocophlan full $wd #微生物物种核心基因5.37G humann2_databases --download uniref uniref90_di…

React Strict DOM:React Native 通用应用程序的未来

Meta宣布发布了 react-strict-dom。从根本上讲,这将改变我们使用 React Native(以及在网页上使用 React)的方式。它提供了一套统一的 UI 原语,带有样式,可以在网页和移动设备上通用使用!现在,“…