glPushMatrix()和glutSolidSphere()不能一起工作。为什么?

时间:2013-07-02 10:24:41

标签: opengl glut

当我编写以下代码时,一切正常,并显示一个椭圆体。

void HandModelCreator::drawModel(){
    palm();
}
void HandModelCreator::palm(){
    glColor4f(0.6, 0.0, 0.0, 0.0);
    glScalef(1.0, 0.3, 0.45);
    glutSolidSphere (0.4, 20, 20);
}

我正在尝试创建一个分层模型&需要使用glPushMatrix()和glPopMatrix()。所以,我尝试了以下代码,但没有真正有效。没有显示椭圆体。为什么?我做错了什么?

void HandModelCreator::drawModel(){
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glPushMatrix();
        palm();
    glPopMatrix();
}
void HandModelCreator::palm(){
    glColor4f(0.6, 0.0, 0.0, 0.0);
    glScalef(1.0, 0.3, 0.45);
    glutSolidSphere (0.4, 20, 20);
}

2 个答案:

答案 0 :(得分:2)

为什么在推送堆栈中的矩阵之前调用glLoadIdentity()?堆栈的想法是,在您进行更改之前,您需要先进行更改。

此外,我认为你根本不需要glLoadIdentity(),因为这会重置整个模型视图矩阵(即你所拥有的任何转换层次都会消失):

这更接近你真正需要的东西:

void HandModelCreator::drawModel(){
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
        palm();
    glPopMatrix();
}

答案 1 :(得分:1)

在推送矩阵之前,将其设置为identity(使用glLoadIdentity)。这当然会取消累积到模型视图矩阵中的所有先前的变换,并且很可能是您看不到任何内容的原因。

我建议你深入研究一下OpenGL转换管道和矩阵转换的工作方式。