2 个 4x4 矩阵之间的插值

Blu*_*pud 1 interpolation matrix quaternions

对于使用 colladas 的骨骼动画,我需要在 2 个矩阵之间进行线性插值。我在某处看到我可以使用四元数在矩阵之间进行插值,但这仅适用于旋转分量,而且我还需要保留变换。这是我的代码,除了翻译部分外,它都有效:

float total = (orderedBones[i]->Animation->keyFrames[nextKeyFrame] - orderedBones[i]->Animation->keyFrames[nextKeyFrame - 1]) * 100.0;
float progress = orderedBones[i]->Animation->accumTime - orderedBones[i]->Animation->keyFrames[nextKeyFrame - 1] * 100.0;
float interpolation = progress / total;

glm::quat firstQuat = glm::quat_cast(orderedBones[i]->Animation->Matrices[nextKeyFrame - 1]);
glm::quat secondQuat = glm::quat_cast(orderedBones[i]->Animation->Matrices[nextKeyFrame]);
glm::quat finalQuat = glm::slerp(firstQuat, secondQuat, interpolation);

orderedBones[i]->Animation->interpoltaedMatrix = glm::mat4_cast(finalQuat);
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点吗?

Blu*_*pud 6

我最终通过更多的网上冲浪解决了我的问题。为了将来参考,这里是如何做到的。

转换组件存储在一个 4x4 矩阵中,如下所示:

r r r t
r r r t
r r r t
0 0 0 1
Run Code Online (Sandbox Code Playgroud)

其中 r 是旋转分量,t 是平移分量。因此,我们可以将平移分量表示为向量。2 向量可以线性插值,因此我们对这两个向量进行插值,然后在完成后将它们推回到旋转矩阵中。这是最终的代码,但有点乱:

r r r t
r r r t
r r r t
0 0 0 1
Run Code Online (Sandbox Code Playgroud)

希望能回答其他人的问题:)