首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的动画,使用旋转矩阵插值关键帧

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

Stack Overflow用户
提问于 2013-06-01 18:53:06
回答 1查看 1.5K关注 0票数 0

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

但是,现在我想在这些帧之间设置动画。我想要的:在X秒内从第1帧插值到第2帧。如何在C++中实现此功能??我找到了像http://www-scf.usc.edu/~amahajan/mocap/mocap4.html ...but这样的东西,我不知道怎么用c++写这个

EN

回答 1

Stack Overflow用户

发布于 2013-06-03 17:00:11

好的,我解决了浮点库已经有一个this...the 1.slerp(Quaternion2,this...the T)函数。如果你不知道SLERP是什么: slerp在一个四元数和另一个四元数之间进行插值,浮点T可以看作是增量,它应该插值多远。例如:如果你给slerp一个单位四元数,一个Y 90°四元数,和一个"0.5“值的浮动T,结果是一个Y 45°的四元数。有关slerp的详细信息,您应该在google上搜索它,这是众所周知的。

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

代码语言:javascript
复制
Matrix3f m;
Quaternion<float> q1=m.toRotationMatrix();

有了这个,我简单地创建了一个从0.01到1.00的循环,增量为0.01。您应该在另一个线程中完成此工作:

代码语言:javascript
复制
    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());
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16871891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档