我试图使用Eigen在2个四元数之间进行sler(认为这是最简单的)。
我找到了两个不同的例子
一,
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;
}
我真的不能说哪一个是正确的。关于此的文档并不多。任何人都可以告诉我是否应该使用不同的库?或者我怎样才能使用eigen进行slerp。
答案 0 :(得分:10)
在两个四元数之间执行SLERP只需要调用slerp方法:
Quaterniond qa, qb, qres;
// initialize qa, qb;
qres = qa.slerp(t, qb);
其中t是插值参数。
答案 1 :(得分:1)
使用第二种变体。
两个代码段都实现了SLERP,但是第一个代码片段对列表中的元素执行某些操作,而您的代码段不会显示。第二种变体也是计算效率更高的变量,因为它不会绕过旋转矩阵。
答案 2 :(得分:0)
我认为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);