我从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数据相同的值。我将更新如何正确计算数据。
答案 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