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

时间:2013-06-01 10:53:06

标签: c++ animation 3d rotation

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

但是,现在我想在这些帧之间进行动画处理。 我想要的是 : 在X秒内从第1帧到第2帧进行插值。我怎样才能在C ++中实现它? 我找到了类似http://www-scf.usc.edu/~amahajan/mocap/mocap4.html的东西......但我不知道如何用c ++

写这个

1 个答案:

答案 0 :(得分:0)

好吧我解决了这个问题...... Eigen库已经有了Quaternion1.slerp(Quaternion2,float T)函数。如果您不知道SLERP是什么:slerp在一个四元数和另一个四元数之间进行插值,则浮点T可以被视为增量,它应该插入多少。例如:如果给slerp一个单位四元数,Y 90°四元数,并且浮点数T为“0.5”值,则结果为四元数,Y为45°。有关slerp的详细信息,您应该谷歌,它是众所周知的。

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

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());
    }