0

我正在尝试从 .obj 格式加载 3D 模型,它在屏幕上绘制对象没有任何问题,但是当我调整屏幕大小时,一切都消失了。这是代码:

Obj* object = new Obj();
GLuint  texture[1]; 

void handleResize(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(double)w / (double)h,1.0,200.0);
}
void initRendering() {
object->GetObj("cube.obj");
glShadeModel(GL_LINEAR);                            
glClearColor(0.0f, 0.0f, 0.0f,     0.5f);                           
glEnable(GL_DEPTH_TEST);
}
void handleKeypress(unsigned char key, int x, int y) {
switch (key) {
    case 27:
        {
        exit(0);
        break;
        }
}
}

void drawScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();
glPushMatrix();
glRotatef(45.0,0.0,1.0,0.0);
object->DrawObj();
glPopMatrix();
glutSwapBuffers();
glFlush();

}
int _tmain(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);


glutCreateWindow("3D");
initRendering();

glutReshapeFunc(handleResize);
glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutMainLoop();
return 0;
}

这是 Obj.DrawObj() 的代码:

glBegin(GL_TRIANGLES);
for(int i = 0;i < faces.capacity()-1;i++)
{
        glVertex3f(vertices[faces[i].vertex1].cordinate1,vertices[faces[i].vertex1].cordinate2,vertices[faces[i].vertex1].cordinate3);
    glVertex3f(vertices[faces[i].vertex2].cordinate1,vertices[faces[i].vertex2].cordinate2,vertices[faces[i].vertex2].cordinate3);
      glVertex3f(vertices[faces[i].vertex3].cordinate1,vertices[faces[i].vertex3].cordinate2,vertices[faces[i].vertex3].cordinate3);  
}
glEnd;
4

2 回答 2

1

在您的绘图代码中,您设置了投影矩阵,这很好。但是,您将其设置为身份。在调整大小处理程序中,您也设置了投影矩阵,但您不应该在那里这样做;是的,我知道教程里都有,但这是非常糟糕的风格。您应该将当前在 reshape 处理程序中的所有代码移动到绘图处理程序中,替换投影矩阵的当前设置。

于 2012-05-26T07:47:18.223 回答
1

我可以看到您仍然对阅读 PasteBin 感到困惑。让我试着解释一下:

之所以第一次绘制就可以看到对象,是因为没有设置投影矩阵。因此,您的对象直接在标准化设备坐标(-1 到 1 范围)中绘制。

调整大小时,您是第一次设置投影矩阵,这会改变绘制到屏幕上的查看区域。您最初绘制的对象位于投影矩阵定义的查看区域之外(它位于相机顶部,我猜在近平面的前面。您必须将对象移回远离相机以便它在视锥体内。这就是 datenwolf 的建议。

然而,与此同时,您在代码中引入了其他错误,尤其是您停止在 handleResize 中重置投影矩阵。在调用 gluPerspective 之前,您必须始终清除投影矩阵,否则您将得到一个虚假的结果。

如果你从你的 pastebin 中获取确切的代码,并添加一个 glLoadIdentity 到 handleResize,我认为这应该可以工作:

void handleResize(int w, int h) {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);   //<--- add
    glLoadIdentity();              //<--- add
    gluPerspective(45.0,(double)w / (double)h,1.0,200.0);
} 

此外,您仍在 drawScene 函数期间清除投影矩阵。当您清除矩阵时,您将丢弃刚刚在 handleResize 中设置的透视设置,您不想这样做。

所以基本上:

  1. 在 handleResize 和初始化时设置投影矩阵
  2. 不要触摸drawScene中的投影矩阵
  3. 平移对象,使其适合视锥体。
于 2012-06-08T20:15:56.560 回答