5

我正在尝试使用 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; 
 }

我真的不能说哪个是正确的。关于此的文档并不多。谁能告诉我是否应该使用其他库?或者我如何使用 eigen 进行 slerp。

4

3 回答 3

13

在两个四元数之间进行 SLERP 只需调用 slerp 方法即可:

Quaterniond qa, qb, qres;
// initialize qa, qb;
qres = qa.slerp(t, qb);

其中 t 是您的插值参数。

于 2013-10-20T11:59:42.160 回答
1

使用第二种变体。

两个代码片段都实现了 SLERP,但是第一个代码片段对列表中的元素做了一些事情,而您的代码片段没有显示。第二种变体也是计算效率更高的变体,因为它不会绕道旋转矩阵。

于 2013-10-20T10:54:56.010 回答
0

我认为GLM是 openGL 应用程序中的最佳选择,因为 GLM 功能与 GLSL 中的相同。

glm slerp 将参数作为混合函数(这是 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);
于 2013-10-20T19:42:16.720 回答