c++中的动画,用旋转矩阵插值关键帧
Animations in c++, interpolating keyframes with rotation matrices
在我的应用程序中,我有一个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());
}
相关文章:
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 将使用太多的纹理插值器 - 带旋转的着色器
- 升压插值条件变量可以虚假唤醒吗?
- 如何获得插值极坐标?
- 如何线性插值到不恒定的目的地
- 向心Catmull-Rom样条曲线插值alpha参数
- 使用 OpenGL 插值数据缓冲区?
- 缩放和插值数组
- 骨骼动画:变换矩阵(collada)之间的插值
- 从一组点C++平面插值
- 从 C++14 到 C++98 的端口字符串插值
- 将矢量的数据扩展到指定大小(插值)
- 双线性插值实现的错误
- 如何避免线性插值"trap"?
- 使用 DirectX 11 插值背景颜色?
- OpenGL 缺陷 - 不需要的插值
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- 将 N 个公式替换为一个(字符串插值)
- C++ - 处理几何插值中的浮点误差
- c++中的动画,用旋转矩阵插值关键帧