2

我正在使用 qglwidget 和 Android 应用程序的各种手势,四元数的主题完全令人困惑,所以它主要是猜测和检查。我已经能够使用以下方法围绕一个轴旋转一定度数:

rotation=QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),delta.y())*rotation;

这与 x 方向上的相同语句具有所需的结果。

我的问题是,其中一个是正确的轮换方式吗?第二,如果我想在两个轴上旋转,我只是这样做:

rotation=QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),delta.y())*rotation;
rotation=QQuaternion::fromAxisAndAngle(QVector3D(0,1,0),delta.x())*rotation;

或者是否有一个同样有效的单行语句?

4

1 回答 1

2

是的,你的做法是正确的,没有一行语句:-)

在 3D 应用程序中从一组欧拉角创建四元数是很常见的,我们只需将最基本的旋转相乘即可,因为无论如何计算起来都很便宜(除非你做了很多,而且通过分析确定这部分对性能至关重要)。例如,如果您使用约定 ZXZ(如这里的第一张图片所示,那么您将编写:

QQuaternion rotation =
    QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), alpha) *
    QQuaternion::fromAxisAndAngle(QVector3D(1,0,0), beta) * 
    QQuaternion::fromAxisAndAngle(QVector3D(0,0,1), gamma);

其中alpha,betagammadouble表示角度的值(请注意,不是弧度)。

注意:您可以通过将其包装在自己的方法中来自己创建单行:

static QQuaternion fromEuler(double alpha, double beta, double gamma);
于 2013-07-11T07:50:42.633 回答