【问题标题】:Interpolating rotations(slerp) using Eigen使用 Eigen 插值旋转(slerp)
【发布时间】:2013-10-20 10:13:59
【问题描述】:

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

【问题讨论】:

    标签: c++ opengl eigen quaternions


    【解决方案1】:

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

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

    其中 t 是您的插值参数。

    【讨论】:

      【解决方案2】:

      使用第二种变体。

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

      【讨论】:

      • 我有不止一个四元数,所以我将它们保存在一个列表中。我想从 q1 搬到 q2,当我来到 q2 时,我想搬到 q3
      • @james456:这是一个经典的分段插值问题。您将四元数存储在t, q 对列表中,其中 t 指定相关四元数的起始“时间”。然后将范围从t_{n} … t_{n+1} 映射到范围0 … 1 并将其与给定的q 相乘。
      【解决方案3】:

      我认为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);
      

      【讨论】:

      • 我尝试使用 slerp glm。但是想不通怎么用。可以举个例子吗?
      • 当我得到插值四元数时,该函数是移动相机本身还是需要为它编写一个函数
      • @james456 你需要自己移动相机。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多