在OpenGL中,在对象自己的轴上旋转对象



所以我有一个立方体,我希望围绕它的三个轴中的任何一个旋转(立方体的轴,而不是窗口)。正如许多其他类似的问题所说,只要我只朝一个方向旋转,我的旋转就会起作用,但当我开始混合它们时,我会得到奇怪的结果。特别是,无论立方体是如何旋转的,围绕y轴的旋转始终围绕窗口的y轴旋转。

我的绘图代码如下:

glMatrixMode(GL_MODELVIEW) ;
glLoadIdentity();
gluLookAt(0.0, 5.0, 15.0,  
          0.0, 0.0, 0.0,  
          0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(theta_y,0,1,0); 
glRotatef(theta_x,1,0,0);
glRotatef(theta_z,0,0,1);
draw_cube();
glPopMatrix();

这个问题似乎完全描述了我想做什么,公认的答案似乎是我想做的,然而他提供的链接已经失效。

根据我在链接问题中收集到的信息,我的z旋转是首先执行的,这意味着在我的x旋转(下一个)中,我需要绕(1,0,0)旋转,而不是绕(-sin(theta_z),cos(theta\oz),0)旋转。但对于第三轮,他只给出了链接,说它变得"非常复杂"。现在链接已经死了,我不知道如何进行第三轮。

编辑:根据回复,我添加了三个矢量:cube_xcube_ycube_z,以保持多维数据集的当前轴。它们初始化如下:

float cube_x[] = {1.0f,0.0f,0.0f,0.0f};
float cube_y[] = {0.0f,1.0f,0.0f,0.0f};
float cube_z[] = {0.0f,0.0f,1.0f,0.0f};

回到绘图功能中,我对其进行了更改,使旋转围绕这些轴进行,而不是像以前那样围绕全局轴进行。在执行了三次旋转之后,我调用glGetFloatv来获得当前矩阵,并使用一个新函数update_vector来用它们的新值填充我的立方体向量。这一切都包括在下面:

void update_vector(float vector[],float matrix[]) {
    vector[0] = matrix[0]*vector[0] + matrix[1]*vector[1] + matrix[2]*vector[2] + matrix[3]*vector[3];
    vector[1] = matrix[4]*vector[0] + matrix[5]*vector[1] + matrix[6]*vector[2] + matrix[7]*vector[3];
    vector[2] = matrix[8]*vector[0] + matrix[9]*vector[1] + matrix[10]*vector[2] + matrix[11]*vector[3];
    vector[3] = matrix[12]*vector[0] + matrix[13]*vector[1] + matrix[14]*vector[2] + matrix[15]*vector[3];
}
void my_display(void) {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) ;
    glMatrixMode(GL_MODELVIEW) ;
    glLoadIdentity();
    gluLookAt(0.0, 5.0, 15.0,  
          0.0, 0.0, 0.0,  
          0.0, 1.0, 0.0); 
    glPushMatrix();
    glRotatef(theta_y,cube_y[0],cube_y[1],cube_y[2]); 
    glRotatef(theta_x,cube_x[0],cube_x[1],cube_x[2]);
    glRotatef(theta_z,cube_z[0],cube_z[1],cube_z[2]);
    //get the current matrix
    float my_matrix[16];
    glGetFloatv(GL_MODELVIEW_MATRIX, my_matrix);
    //Multiply the matrix by each of my vectors
    update_vector(cube_x,my_matrix);
    update_vector(cube_y,my_matrix);
    update_vector(cube_z, my_matrix);
    make_cube();
    glPopMatrix();
    /* buffer is ready */
    glutSwapBuffers();
    return ;
}

现在,当我试图绕y轴旋转时,立方体似乎沿着几个轴摆动了一段时间,最后才变成绕x轴旋转。绕Z轴旋转也会做同样的事情。似乎只有绕x轴旋转才有效。

编辑:解决方案:

在下面的评论中,Gavin提到Y轴旋转总是首先发生。这就是问题的全部。通过添加标志ROT并根据我试图绕哪个轴旋转来设置它,我可以对旋转进行排序,以便最后完成绕哪个轴的旋转。

LookAt之后,您必须平移到立方体的负位置,进行旋转,然后平移回立方体的位置。

我不知道什么应该很复杂。OpenGL为您进行矩阵运算。记住矩阵乘法是关联的,所以如果Rx等是围绕坐标轴的旋转,那么Rx.Ry的意思是围绕y然后x旋转。无论你的形状在这段时间内结束在哪里,它总是围绕坐标轴。顺便说一句,OpenGL ES是右手的,不同于传统的OpenGL。

最新更新