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

时间:2014-10-10 06:15:50

标签: c++ opengl graphics 3d rotation

所以我有一个立方体,我希望围绕它的三个轴(立方体的轴,而不是窗口)旋转。正如许多其他类似问题所述,只要我只在一个方向旋转,我的旋转就会起作用,但是当我开始混合它们时,我会得到奇怪的结果。特别是,无论立方体如何旋转,围绕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();

This问题似乎正好描述了我正在尝试做的事情,接受的答案似乎就是我想做的事情,但是他提供的链接已经死了。

从我在链接问题中可以收集的信息中,首先执行z旋转,这意味着我需要进行x旋转(这将是下一个),而不是旋转大约(1,0,0),我会旋转(-sin(theta_z),cos(theta_z),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轴旋转似乎有效。

编辑:解决方案:

在下面的评论中,加文提到Y轴旋转总是首先发生。这是整个问题。通过添加一个标志ROT并根据我试图围绕哪个轴进行设置,我能够对旋转进行排序,以便最后旋转的轴是最后一次完成的。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我不知道应该复杂的是什么。 OpenGL为您完成矩阵数学运算。记住矩阵乘法是关联的,所以如果Rx等是关于坐标轴的旋转,那么Rx.Ry意味着围绕y旋转然后旋转x。无论你的形状在哪里结束,它总是围绕坐标轴。与传统的OpenGL不同,BTW,OpenGL ES是右手。