折线仅在调整窗口大小后完全呈现

时间:2016-12-30 13:21:35

标签: c++ opengl

我在OpenGL中创建一个包含地面的3d项目(绘制为线环)。我遇到的问题是,当项目开始时,只绘制一条线,如下图所示:

enter image description here

当我调整窗口大小或最大化时,实际的地面会显示如下:

enter image description here

知道如何解决这个问题吗?我是OpenGL编程的初学者。

以下是代码:

void drawHook(void);
void timer(int);
void drawFlorr();
float L = 100;

const int screenWidth = 1000;      // width of screen window in pixels 
const int screenHeight = 1000;     // height of screen window in pixels
float ww = 800;
float wh = 800;
float f = 520, n = 10.0;
static GLdouble ort1[] = { -200, 200, -33, 140 };
static GLdouble viewer[] = { 525, 25, -180 };
static GLdouble objec[] = { 525.0, 25, -350 };
float x, y = 0.0, z, z1;
float xmax = screenWidth - 200.0;
float zmax = screenWidth - 200.0;
float xmin, zmin;
float step = 5.0;

float fov = 80;

 void myInit(void)
 {
        glClearColor(0.0,0.0,0.0,0.0);       // background color is white

    glPointSize(2.0);                 // a 'dot' is 2 by 2 pixels
    glMatrixMode(GL_PROJECTION);       
    glLoadIdentity();
     gluOrtho2D(0.0, screenWidth, 0.0, screenHeight);//dino window
     glViewport(0, 0, screenWidth, screenHeight);

}

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity(); 
    gluLookAt(viewer[0], viewer[1], viewer[2], objec[0], objec[1], objec[2], 0, 1, 0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(fov, 1.333, n, f);
    glPointSize(2.0);
    glMatrixMode(GL_MODELVIEW);

    drawFlorr();


    glutSwapBuffers();


}

int main(int argc, char** argv)
{

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // set display mode
    glutInitWindowSize(screenWidth, screenHeight); // set window size
    glutInitWindowPosition(10, 10); // set window position on screen
    glutCreateWindow("Dino Line Drawing"); // open the screen window
    glutDisplayFunc(myDisplay);     // register redraw function
    myInit();            
    //glutTimerFunc(1,timer,1);
    glutMainLoop();              // go into a perpetual loop
    return 1;
}
void drawFlorr()
{

    xmin = -100;
    zmin = -100;

    for (x = xmin; x < xmax; x += step)
    {
        for (z = zmin; z < zmax; z += step)
        {
            z1 = -z;

            glBegin(GL_LINE_LOOP);

            glVertex3f(x, y, z1);
            glVertex3f(x, y, z1-step+1.0);
            glVertex3f(x + step - 1.0, y, z1 - step + 1.0);
            glVertex3f(x+step-1.0, y, z1);

            glEnd();


        }
    }
}

1 个答案:

答案 0 :(得分:2)

您的代码在很多方面都被破坏了:

  1. 您的myDisplay函数使用当前矩阵模式设置视图矩阵。
  2. 最初,您将矩阵模式保留为GL_PROJECTION
  3. 中的myInit()

    这两者一起意味着对于第一帧,您只需将身份用作MODELVIEW矩阵,并且只需两次覆盖投影矩阵。调整大小后,再次绘制框架a,您的代码确实可能是您想要的。

    然而,还有更多:

    1. 您没有任何调整大小处理程序,因此在调整窗口大小时您的视口不会更改。
    2. 您正在为投影设置一个正交矩阵,但您根本不打算使用它。
    3. ,最重要的一点:

      1. 您的所有代码都依赖于已弃用的功能,而这些功能在现代OpenGL中根本不可用。你真的不应该在2016年使用它,而是学习现代的OpenGL(用&#34;现代&#34;意思&#34;只有十年之久&#34;在这里)。