最短路径的四元数 slerp 不起作用

Posted

技术标签:

【中文标题】最短路径的四元数 slerp 不起作用【英文标题】:Quaternion slerp with shortest path not working 【发布时间】:2018-08-16 20:44:32 【问题描述】:

我的 slerp 程序如下。根据我的阅读,对 > 0 的检查应该处理它,因此它总是采用最短路径。但它永远不会。在我穿过“极点”的情况下,四元数会翻转并产生具有 NAN 值的角度。

quat quat::slerp(quat dest, float t)

  const quat &from = *this;
  static const double epsilon = 0.0001;
  double theta, cosTheta, sinTheta;
  double p, q;

  cosTheta = from.x*dest.x + from.y*dest.y + from.z*dest.z + from.w*dest.w;

  if(cosTheta < 0.0)
  
    dest =  -from.x, -from.y, -from.z, -from.w ;
    cosTheta = -cosTheta;
  

  if((1.0-fabs(cosTheta)) > epsilon)
  
    theta = acos(cosTheta);
    sinTheta = sin(theta);
    q = sin((1-t) * theta) / sinTheta;
    p = sin(t*theta) / sinTheta;
  
  else
  
    q = 1-t;
    p = t;
  

  quat qo;
  qo.w = (float)((q * from.w) + (p * dest.w));
  qo.x = (float)((q * from.x) + (p * dest.x));
  qo.y = (float)((q * from.y) + (p * dest.y));
  qo.z = (float)((q * from.z) + (p * dest.z));

  return qo;

【问题讨论】:

【参考方案1】:

也许还有其他错误,但这一行肯定有一个:

dest =  -from.x, -from.y, -from.z, -from.w ;

它用-from 覆盖dest,这是不正确的。应该是:

dest =  -dest.x, -dest.y, -dest.z, -dest.w ;

【讨论】:

耶稣...是的,这很可能。让我解决这个问题。

以上是关于最短路径的四元数 slerp 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

欧拉角与四元数互转,及四元数slerp球面线性插值算法

如何插值旋转?

让炮台口逐渐转向玩家(四元数)

python中的四元数运算

Unity四元数和向量相乘作用及其运算规则

结合具有不同枢轴点的四元数