复现原始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插件自动绑定得到