C++ c+中的动画+;,使用旋转矩阵插值关键帧

C++ c+中的动画+;,使用旋转矩阵插值关键帧,c++,animation,3d,rotation,C++,Animation,3d,Rotation,在我的应用程序中,我有一个3D模型,我可以通过手动设置值来旋转、缩放和平移。我还可以提取给定点的旋转。所以我现在可以存储关键帧,每个关节都有4x4矩阵 但是,现在我想在这些帧之间设置动画。 我想要的是: 在X秒内从第1帧插值到第2帧。如何在C++中实现这个? 我发现了这样的东西……但是我不知道如何用c++编写这个函数。好的,我解决了这个问题……Eigen库已经有了一个四元数1.slerp(四元数2,float T T)函数。如果您不知道什么是SLERP:SLERP在一个四元数和另一个四元数之间插

在我的应用程序中,我有一个3D模型,我可以通过手动设置值来旋转、缩放和平移。我还可以提取给定点的旋转。所以我现在可以存储关键帧,每个关节都有4x4矩阵

但是,现在我想在这些帧之间设置动画。 我想要的是: 在X秒内从第1帧插值到第2帧。如何在C++中实现这个?
我发现了这样的东西……但是我不知道如何用c++编写这个函数。

好的,我解决了这个问题……Eigen库已经有了一个四元数1.slerp(四元数2,float T T)函数。如果您不知道什么是SLERP:SLERP在一个四元数和另一个四元数之间插值,则可以将浮点T视为增量,即它应该插值的距离。例如:如果给slerp一个单位四元数、一个Y 90°四元数和一个“0.5”值的浮点T,则结果是一个Y 45°的四元数。有关slerp的详细信息,您应该在谷歌上搜索它,这是众所周知的

如果使用Eigen,可以简单地从旋转矩阵中生成四元数:

Matrix3f m;
Quaternion<float> q1=m.toRotationMatrix();
Matrix3f-m;
四元数q1=m.旋转矩阵();
通过这个,我简单地创建了一个从0.01到1.00的循环,增量为0.01。 您应该在另一个线程中执行此工作:

    for(double i=0.0;i<1.0;i=i+0.01)
    {
        //let this thread sleep for 10 millisec, this gives us a 100hertz rate
        //with this, the whole animation is over in 1 second
        boost::this_thread::sleep(boost::posix_time::millisec(10));
        //q1= first frame, q2 = second frame
        Quaternion<float> q3(q1.slerp(i,q2));
        //now apply the quaternion
        // for each "bone", or node you need to apply a SLERPed quaternion
        m_node->setRotation(q3.toRotationMatrix());
    }
for(双i=0.0;isetRotation(q3.toRotationMatrix());
}