-1

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

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);
}
4

2 回答 2

2

为什么glLoadIdentity()在将矩阵推入堆栈之前调用?堆栈的想法是,您在进行稍后想要恢复的更改之前推送。

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

这更接近您的实际需要:

void HandModelCreator::drawModel(){
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
        palm();
    glPopMatrix();
}
于 2013-07-02T11:28:03.807 回答
1

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

我建议您更深入地研究 OpenGL 的转换管道和矩阵转换在一般工作中的工作方式。

于 2013-07-02T11:28:12.737 回答