Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 四元数旋转问题,对象轴不随对象旋转_C++_3d_Rotation_Quaternions_Euler Angles - Fatal编程技术网

C++ 四元数旋转问题,对象轴不随对象旋转

C++ 四元数旋转问题,对象轴不随对象旋转,c++,3d,rotation,quaternions,euler-angles,C++,3d,Rotation,Quaternions,Euler Angles,假设我有一个对象,该对象有一个表示其方向的四元数 目前,我可以在没有万向节锁的情况下在所有3个轴上旋转,但是,任何轴上的每个旋转都应该旋转其他2个旋转轴 我的意思是,如果我把一个物体朝着相机倾斜,然后将物体偏转90度,那么倾斜物体仍然会使它相对于以前的位置旋转,而不是现在的位置 下面是我的问题的一个直观示例: 我使用的是四元数,而不是euler旋转,因为这些对象可以在所有3个轴上旋转,我不想框架锁定/到达奇点 我旋转对象的方向四元数,如下所示: orientation = Quaternion

假设我有一个对象,该对象有一个表示其方向的四元数

目前,我可以在没有万向节锁的情况下在所有3个轴上旋转,但是,任何轴上的每个旋转都应该旋转其他2个旋转轴

我的意思是,如果我把一个物体朝着相机倾斜,然后将物体偏转90度,那么倾斜物体仍然会使它相对于以前的位置旋转,而不是现在的位置

下面是我的问题的一个直观示例:

我使用的是四元数,而不是euler旋转,因为这些对象可以在所有3个轴上旋转,我不想框架锁定/到达奇点

我旋转对象的方向四元数,如下所示:

orientation = Quaternion(Vector(0,1,0),angle) * orientation;
然后,我触发对象向量的重建,并在相对于三维空间原点变换对象后将其应用于这些向量:

Quaternion Point = Quaternion(( orientation * (Vertex) ) * (orientation.inverse()));

vertices[x] = QVector3D(round(Point.v.x),round(Point.v.y),round(Point.v.z));
当我用其他四元数乘以我的四元数时,这是乘法运算符的函数:

Quaternion Quaternion::operator*(Quaternion& q) const
{
    Quaternion r;

    //"w" is the angle, "v" is the vector
    r.w = w*q.w - glm::dot(v, q.v);
    r.v = v*q.w + q.v*w + glm::cross(v,q.v);
    //r.normalize();

    return r;
}

我向上帝发誓,我之所以发帖,是因为这个话题把我弄糊涂了。巩固这个系统会让我无比高兴。

这就是旋转的工作原理……旋转必须按照特定的顺序进行,因为围绕每个轴旋转会在另一个轴上产生后续影响。如果您希望撤消旋转,则必须按相反的顺序执行。为了澄清,其他应用程序实际上并没有执行您认为它正在执行的旋转。可能是用了欧拉角,这可能有点帮助@immibis其他类似的程序使用四元数来避免万向节锁。例如,该应用程序没有达到万向节锁,我过去使用过的任何其他编辑器也没有。我正在努力实现他们都实现的目标。