Android 如何在两个轴上旋转一个四元数

Android 如何在两个轴上旋转一个四元数,android,c++,qt,qglwidget,Android,C++,Qt,Qglwidget,我正在使用qglwidget和android应用程序的各种手势,四元数的主题完全令人困惑,所以它主要是猜测和检查。我已经能够使用以下工具绕一个轴旋转若干度: rotation=QQuaternion::fromAxisAndAngle(QVector3D(1,0,0),delta.y())*rotation; 这与x方向上的相同语句一样具有所需的结果 我的问题是,首先,旋转的正确方法是什么?第二,如果我想在两个轴上旋转,我只需要做: rotation=QQuaternion::fromAxis

我正在使用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;

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

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

在3D应用程序中,从一组Euler角度创建四元数是非常常见的,我们只需将最基本的旋转相乘即可,因为它的计算成本非常低(除非您进行了大量计算,并通过分析确定这部分对性能至关重要)。例如,如果您使用的是约定Z-X-Z(如第一张图片所示),那么您将编写:

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);

首先,在这个问题中,你对轴的定义不太正确。跳过所有次要细节,轴只是一个规范化的向量。尝试执行
…(QVector3D(.707.707,0)、QVector3D(delta.x()、delta.y()、delta.z())
。我假设
delta
是您正在旋转的某个
QVector3D
,而
x()
y()
z()
是getter。什么是旋转?对不起,那不对;我只是查找了您正在使用的库(并实际读取了函数名lol)。
delta
是一组欧拉角吗?旋转是我传递给矩阵的。在绘制调用时旋转。然后,矩阵作为program.setUniformValue(“mvp_矩阵”,投影*矩阵)在gl中使用。delta的单位是来自触摸事件的任意单位,但给定它们的值,我假设它们以弧度为单位。如果delta是Euler角,那么像OP中那样有3行代码(每行一行)的转换就差不多了。有多种方法可以将Euler角度转换为四元数,但该过程所需的计算量大致相同,并且基本上是相同的(将每个旋转分量转换为四元数,并合成整个过程)。