从向量 x y z 组件生成四元数 - 在 Qt 中

3

我想知道是否有一种直接的方法来获取四元数,表示旋转一个沿着其中一个轴(例如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++中实现它。 谢谢。

很遗憾,我无法查看您的图片(公司安全问题)。QQuaternion::rotationTo()这个函数怎么样?对我来说,它恰好就是你要查找的函数。(这是一个静态成员函数。) - Scheff's Cat
1
使用此答案 https://dev59.com/SnM_5IYBdhLWcg3w6HzT 找到表示从一个向量旋转到另一个向量的四元数。 - minorlogic
1个回答

3
为了从一个向量旋转到另一个向量,可以使用QQuaternion中的现成方法:QQuaternion::rotationTo()
我制作了一个MCVE来验证和演示这个方法。
#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;
}

已在VS2013中编译和测试:

from:  QVector3D(0, 0, 1)
to  :  QVector3D(1, 0, 1)
rot. (Quat.):  QQuaternion(scalar:0.92388, vector:(0, 0.382683, 0))
rot. axis:  QVector3D(0, 1, 0)
rog. ang.:  45

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



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接