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

Animations in c++, interpolating keyframes with rotation matrices

本文关键字:插值 关键帧 旋转 动画 c++      更新时间:2023-10-16

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

然而,现在我想在这些帧之间动画。我想要的:在X秒内从第一帧插入到第二帧。我如何在c++中实现这个??我找到了类似http://www-scf.usc.edu/~amahajan/mocap/mocap4.html的东西…但是我不知道怎么用c++写

好了,我解决了这个…Eigen库已经有了一个Quaternion1。slerp(Quaternion2, float T)函数。如果你不知道SLERP是什么:SLERP在一个四元数和另一个四元数之间插入,浮点数T可以被认为是增量,它应该插入多少。例如:如果你给slerp一个单位四元数,一个Y 90°的四元数,浮点数T是一个"0.5"的值,结果是一个Y 45°的四元数。关于睡眠的详细信息,你应该谷歌一下,它是众所周知的。

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

Matrix3f m;
Quaternion<float> q1=m.toRotationMatrix();

我简单地创建了一个从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());
    }