glPush / PopMatrix()和glRotatef()似乎是单独移动对象而不是glPush / PopMatrix()中包含的所有对象

时间:2014-03-17 07:08:52

标签: c++ opengl

我昨天才开始使用OpenGL和C ++,所以我可能只是错过了一些东西,但在我看来,代码应该以完全相同的方式运行。< / p>

我有一些嵌套的glPush/PopMatrix()功能,我用这些功能将一些气缸设置为皮克斯灯的基本版本。我想做的是旋转然后围绕它们顶部的圆柱点旋转,但这似乎只发生在底部圆柱体和顶部圆柱体上,更高,它们似乎只是移动关于不同的轴。

我认为我没有正确解释,所以我在代码下面添加了一些图片。

glPushMatrix();
glTranslatef(g_translate_x, g_translate_y, 0.0);
glRotatef(g_dof3_angle, 1, 0, 0);

    //base cylinder
    glPushMatrix();
    draw_bigcylinder(0, 0, 0);
    glRotatef(g_dof4_angle, 0.0, 0.0, 1.0);

        //body cylinder
        glPushMatrix();
        draw_cylinder(0, 0, 90);
        glRotatef(g_dof5_angle, 0.0, 0.0, 1.0);


            //neck cylinder
            glPushMatrix();
            draw_cylinder(0, 9, 45);
            glRotatef(g_dof6_angle+90, 0, 1.0, 0);
            glTranslatef(0, 16, 4);

                glPushMatrix();
                gluCylinder(qobj, 2, 4, 7, 16, 16);

                glPopMatrix();

            glPopMatrix();

        glPopMatrix();

    glPopMatrix();
glPopMatrix();

OpenGL Lamp

编辑:这是draw_cylinder()功能:

void draw_cylinder(float translate_x,float translate_y,float dof3_angle){

    GLUquadricObj * qobj = gluNewQuadric();

    glPushMatrix();
    glTranslatef(translate_x, translate_y, 0.0);
    glRotatef(dof3_angle, 0.0, 0.0, 1.0);

        glPushMatrix();
        glRotatef(90, 0.0, 1.0, 0.0);
        gluCylinder(qobj, 1.0, 1.0, 10.0, 16, 16);
        gluQuadricOrientation(qobj, GLU_INSIDE);
        gluDisk(qobj, 0.0, 1.0, 16, 16);
        glTranslatef(0.0, 0.0, 10.0);
        gluQuadricOrientation(qobj, GLU_OUTSIDE);
        glPopMatrix();

    glPopMatrix();

}

1 个答案:

答案 0 :(得分:1)

您需要将参考框架转换为第二个圆柱体的顶部。 为此,在您创建第二个气缸后,执行pushMatrix,然后在该参考系中再次转换为气缸中心(由第三个气缸的半长度平移)。再次在那里创建圆柱并执行popMatrix。现在,您将转到您想要旋转第三个圆柱体的原始参照系。将旋转功能放在此推/弹块上。