如何在两个轴上旋转QQuaternion

时间:2013-07-10 19:03:16

标签: android c++ qt qglwidget

我正在使用qglwidget和各种手势的Android应用程序和Quaternions的主题是彻底混淆所以它主要是猜测和检查。我已经能够使用以下几度将一个轴旋转一定的度数:

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;

或者是否有一个单行语句也能正常工作?

1 个答案:

答案 0 :(得分:1)

是的,你是以正确的方式做到的,没有一行声明: - )

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

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

其中alphabetagammadouble值,表示以度为单位的角度(小心,不是以弧度表示)。

注意:您可以通过自己的方法包装来创建单行内容:

static QQuaternion fromEuler(double alpha, double beta, double gamma);