我想知道是否有直接的方法来获得四元数表示位于其中一个轴(例如Z轴)上的矢量的旋转,当我有x,y,z分量时结果向量。
在上面的图片中,我有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 ++实现它。 谢谢
答案 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;
}
对我来说,输出看起来合理......