我可以通过在关键帧之间进行插值,使用 assimp 加载蒙皮模型的动画。现在,我一直在尝试从用户定义的变换矩阵中定向或定位骨骼,而不仅仅是从动画文件中加载它。例如,将手臂旋转一定角度,该角度将由用户指定。我将模型加载为绑定姿势:
void recursion(aiNode* gNode)
{
std::string gNodeName(gNode->mName.data);
if(boneMapping.find(gNodeName) != boneMapping.end())
{
//if node corresponds to a bone,
Matrix4f boneMatrix = IdentityMatrix;
aiNode* tempNode = gNode;
//find combined transform of a bone
while(tempNode != NULL)
{
Matrix4f NodeMatrix(tempNode->mTransformation);
boneMatrix = NodeMatrix * boneMatrix;
tempNode = tempNode->mParent;
}
pBoneData[boneId].FinalTransform = GlobalInverseTransform * boneMatrix * pBoneData[boneId].OffsetMatrix;
}
for(int i = 0; i < gNode->mNumChildren; i++)
{ //repeat this process for child nodes
recursion(gNode->mChildren[i]);
}
}
为了使用变换矩阵来定位模型的其中一个网格,我尝试搜索与网格的父骨骼相对应的骨骼名称,然后将其节点矩阵替换为所需的矩阵。然而,这根本不起作用,因为它在不同的网格上使骨骼变形。
右侧的模型处于 T 姿势,我打算通过将颈部骨骼旋转 45 度角来修改它,但它保持不变,并且腿部变形,如左侧模型所示。因此,任何指向现有文章或答案的链接都可能非常有用。