在我的应用程序中,我有一个3D模型,我可以通过手动设置值来旋转,缩放,平移。我也可以在给定点提取旋转。所以我现在可以存储关键帧,每个关节都有4x4矩阵。
但是,现在我想在这些帧之间进行动画处理。 我想要的是 : 在X秒内从第1帧到第2帧进行插值。我怎样才能在C ++中实现它? 我找到了类似http://www-scf.usc.edu/~amahajan/mocap/mocap4.html的东西......但我不知道如何用c ++
写这个答案 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());
}