骨骼动画:如何手动导出Assimp骨骼偏移矩阵

时间:2016-11-25 14:48:35

标签: assimp skeletal-animation

我从http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html处理本教程 不幸的是,它并没有解释Assimp如何得出它的骨骼数据。 我知道全局逆变换是一个默认的矩阵值,混合器用于将y值设置为z值,z值设置为-y。 (或至少是我的测试md5型号使用的)

 GlobalInverseTransform = aiScene->mRootNode->mTransformation;

我试图理解Assimp如何从MD5文件中导出偏移矩阵或反向绑定姿势。例如 BobLampClean.md5mesh 有32个关节和32个偏移矩阵

aiMesh->mBones[i]->mOffsetMatrix;

从我在网上看到的其他样本,他们计算偏移矩阵,就像这样......

void ComputeQuatW(glm::quat& quat)
{
float t = 1.0f - (quat.x * quat.x) - (quat.y * quat.y) - (quat.z * quat.z);
if (t < 0.0f)
    quat.w = 0.0f;
else
    quat.w = -sqrtf(t);
}

glm::mat4 rotation, rotationInv, translationInv, offsetmatrix;
glm::quat MyQuaternion;
//here I chose an arbitrary joint and hard coded its orientation and position
MyQuaternion = glm::quat(glm::quat(-0.535591, -0.462288, -0.534983, 1));
ComputeQuatW(MyQuaternion);
glm::mat4 RotationMatrix = glm::toMat4(MyQuaternion);
rotationInv = glm::transpose(RotationMatrix);
translationInv = glm::translate(translationInv, glm::vec3(-0.014076, -2.592741, -30.241238));
offsetmatrix = rotationInv*translationInv;

我已经将这些偏移矩阵中的每一个输出到Assimp的骨矩阵中,但无济于事。我不太确定我做错了什么......

编辑更新:好的,所以我的操作不正确,我正在调试一个没有使用Assimp的工作代码示例,它可以复制与Assimp数据相同的值。我将更新如何正确计算数据。

1 个答案:

答案 0 :(得分:1)

答案:要创建绑定Pose,我使用了以下代码。数学类和函数是由本系列的作者创建的,这就是他创建offsetMatrices的方法,这是Assimp如何构建它的骨偏移矩阵。他的数学函数可以在评论部分https://www.youtube.com/watch?v=AqavYcdB7tg&t=3474s找到。对于每个骨骼,您可以通过将四元数转换为旋转矩阵,转置它,然后通过位置的倒数平移平移矩阵,然后将两者合并来创建它。

"sheath"    0 ( 11.004813 -3.177138 31.702473 ) ( 0.307041 -0.578614 0.354181 )
//Example bone offset matrix.

Quaternion是最后一组3个数字,你计算W组件然后执行操作。

mlQuaternionToMat4(rotation, joint.orientation);
mlTransposeMat4(rotationInv, rotation);

在这里,您将使用第一组3个数字作为关节位置。

mlTranslationMat4(translationInv, -joint.position[0], -          
joint.position[1], -joint.position[2]);
mlMultiplyMat4_2(finalmatrix, rotationInv, translationInv);
//finalMatrix = aiMesh->bone[sheath]->offsetMatrix