0

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

但是,现在我想在这些帧之间制作动画。我想要什么:在 X 秒内从第 1 帧插入到第 2 帧。我如何在 C++ 中实现这个?我发现了类似http://www-scf.usc.edu/~amahajan/mocap/mocap4.html ...但我不知道如何用 C++ 编写它

4

1 回答 1

0

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

如果您使用 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());
    }
于 2013-06-03T09:00:10.580 回答