我正在尝试在 3D 应用程序中使用变形动画来实现面部表情。我一直在研究 assimp 库,并在 aiAnimation 中找到了 aiMeshMorphKey 结构。您能否提供一个代码示例来演示如何使用 aiMeshMorphKey 创建变形动画,例如随着时间的推移改变角色的面部表情?
for (int i = 0; i < pAnimation->mNumMorphMeshChannels; ++i)
{
if (nodeName + "*0" == pAnimation->mMorphMeshChannels[i]->mName.C_Str())
{
std::map<float, glm::mat4> morphMeshKeys;
for (int j = 0; j < pAnimation->mMorphMeshChannels[i]->mNumKeys; ++j)
{
std::cout << pAnimation->mMorphMeshChannels[i]->mName.data << std::endl;
std::cout << pAnimation->mMorphMeshChannels[i]->mKeys[j].mTime << std::endl;
std::cout << pAnimation->mMorphMeshChannels[i]->mKeys->mValues << std::endl;
std::cout << pAnimation->mMorphMeshChannels[i]->mKeys->mWeights << std::endl;
}
}
}
不幸的是,官方文档仅限于此声明。 C_STRUCT aiMeshMorphAnim ** mMorphMeshChannels 变形网格动画通道。
每个通道影响单个网格。该数组的大小为 mNumMorphMeshChannels。
我这里也有同样的问题,也在尝试添加面部动画:)
您应该在模型的网格中找到一个(或多个)
mNumAnumMeshes
大于零的网格。变形网格存储在该网格的 mAnimMeshes
数组中,具有与主网格相同的顶点数。
只需在主网格和变形网格之间混合顶点位置(可能加上法线,或者动画网格中您需要的任何内容)。
GLSL 着色器中的
glm::mix()
或 mix()
之类的东西应该可以解决问题。