使用特征插入旋转(slerp)
Interpolating rotations(slerp) using Eigen
我正在尝试使用本征在 2 个四元数之间切换(认为这是最简单的)。
我发现了两个不同的例子
一
for(int i = 0; i < list.size(); i++)
{
Matrix3f m;
Quaternion<float,0> q1 = m.toRotationMatrix();
Quaternion<float,0> q3(q1.slerp(1,q2));
m_node->Rotation(q3.toRotationMatrix());
}
第二
Vec3 slerp(const Vec3& a, const Vec3& b, const Real& t)
{
Quaternionf qa;
Quaternionf qb;
qa = Quaternionf::Identity();
qb.setFromTwoVectors(a,b);
return (qa.slerp(t,qb)) * a;
}
我真的不能说哪一个是正确的。关于这一点的文档并不多。谁能告诉我是否应该使用不同的库?或者我如何使用特征进行勒普。
在
两个四元数之间执行 SLERP 只是调用 slerp 方法的问题:
Quaterniond qa, qb, qres;
// initialize qa, qb;
qres = qa.slerp(t, qb);
其中 t 是插值参数。
使用第二个变体。
两个代码片段都实现了 SLERP,但是第一个代码片段对列表中的元素执行某些操作,而您的代码段不会显示这些元素。此外,第二个变体是计算效率更高的变体,因为它不会绕道旋转矩阵。
我认为GLM是openGL应用程序中的最佳选择,因为GLM函数与GLSL中的功能相同。
glm slerp 将 argouments 作为混合函数(这是 lerp 的 glm 函数)。混合功能为您提供,对于像
result = mix (first, second, alpha); // result = (1-alpha)*first + alpha*second;
alpha 参数的工作方式与 slerp 相同,因此使用 slerp 随时间在四元数之间进行插值的典型示例可以是
glm::quat interpolated_quaternion; //the result
std::vector<glm::quat> my_quaternion; //vector of quaternions, one per frame.
float frame_time; //the time passed since the previous frame
int frame; //the actual frame
interpolated_quaternion = slerp( my_quaternion[frame],my_quaternion[frame+1],frame_time);
相关文章:
- 与互斥锁相比,旋转锁可以保证上下文切换
- 绘制旋转的三角形
- Unity在虚幻引擎4中的"Vector3.Slerp"等效C++?
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 发布旋转矩阵(openGL/glm)
- 顺时针迭代旋转 3 位数字
- 形状对象的旋转和缩放不正确C++
- 如何在 OpenSceneGraph 中缩放/旋转/移动资产
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 子轴围绕父轴而不是他自己的轴旋转
- 将使用太多的纹理插值器 - 带旋转的着色器
- SFML 向下移动时如何围绕屏幕中心旋转?
- 如何在OpenGL中正确旋转和缩放对象?
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 按时间自动旋转形状,同时在 OpenGL 中使用C++移动它们
- 如何使用增强::几何计算多边形的旋转固体体积?
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 使用特征插入旋转(slerp)