矢量x y z分量的四元数 - 在Qt中

时间:2017-07-18 11:18:59

标签: qt 3d rotation quaternions euler-angles

我想知道是否有直接的方法来获得四元数表示位于其中一个轴(例如Z轴)上的矢量的旋转,当我有x,y,z分量时结果向量。

enter image description here

在上面的图片中,我有x,y,z组件,我想将原点在0,0,0并且与Z轴平行的对象(例如一支笔)旋转到一支笔中图中矢量的方向相同。

我可以肯定使用组件来获得3个欧拉角(tan-1(y / z),tan-1(y / x),tan-1(x / z)),然后转换为四元数。 但我想知道是否有更好的方法。 我使用Qt(http://doc.qt.io/qt-5/qquaternion.html),但如果有一个简单的公式,我可以用C ++实现它。 谢谢

1 个答案:

答案 0 :(得分:2)

要计算从向量到向量的旋转,QQuaternion中有一个就绪方法: QQuaternion::rotationTo()

我做了MCVE来检查这一点并演示:

Error

在VS2013中编译和测试:

#include <QQuaternion>
#include <QMatrix3x3>
#include <QVector3D>

int main()
{
  QVector3D from(0.0f, 0.0f, 1.0f); // z axis
  qDebug() << "from: " << from;
  QVector3D to(1.0f, 0.0f, 1.0f); // arbitrary target vector
  qDebug() << "to  : " << to;
  QQuaternion rot = QQuaternion::rotationTo(from, to);
  qDebug() << "rot. (Quat.): " << rot;
  // Unfortunately, I cannot read quaternions.
  // so output as axis/angle:
  float x, y, z, angle;
  rot.getAxisAndAngle(&x, &y, &z, &angle);
  qDebug() << "rot. axis: " << QVector3D(x, y, z);
  qDebug() << "rog. ang.: " << angle;
  // done
  return 0;
}

对我来说,输出看起来合理......