来自向量 x y z 分量的四元数 - 在 Qt 中
Quaternion from vector x y z components - in Qt
我想知道当我有 x,y,z 时,是否有一种直接的方法来获取表示位于其中一个轴(例如 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++ 实现它。
谢谢
要计算从向量到向量的旋转,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
对我来说,输出看起来很合理...
我想知道当我有 x,y,z 时,是否有一种直接的方法来获取表示位于其中一个轴(例如 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++ 实现它。 谢谢
要计算从向量到向量的旋转,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
对我来说,输出看起来很合理...