我正在使用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;
或者是否有一个单行语句也能正常工作?
答案 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);
其中alpha
,beta
和gamma
是double
值,表示以度为单位的角度(小心,不是以弧度表示)。
注意:您可以通过自己的方法包装来创建单行内容:
static QQuaternion fromEuler(double alpha, double beta, double gamma);