为了从一个向量旋转到另一个向量,可以使用
QQuaternion
中的现成方法:
QQuaternion::rotationTo()
。
我制作了一个
MCVE来验证和演示这个方法。
#include <QQuaternion>
#include <QMatrix3x3>
#include <QVector3D>
int main()
{
QVector3D from(0.0f, 0.0f, 1.0f);
qDebug() << "from: " << from;
QVector3D to(1.0f, 0.0f, 1.0f);
qDebug() << "to : " << to;
QQuaternion rot = QQuaternion::rotationTo(from, to);
qDebug() << "rot. (Quat.): " << rot;
float x, y, z, angle;
rot.getAxisAndAngle(&x, &y, &z, &angle);
qDebug() << "rot. axis: " << QVector3D(x, y, z);
qDebug() << "rog. ang.: " << angle;
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
对我来说,输出看起来很合理...
QQuaternion::rotationTo()
这个函数怎么样?对我来说,它恰好就是你要查找的函数。(这是一个静态成员函数。) - Scheff's Cat