我的渲染随机polgons的代码无法正常工作

时间:2015-12-08 10:16:48

标签: c++ opengl graphics glut glu

我正在研究opengl c ++并试图制作一个代码来在终端上渲染随机多边形。我正在使用CodeBlocks 13.12。

int width=800;
int height=600;

void RandomPolygons()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    GLint x[100],y[100],n,r,g,b;
    GLint i,j;
    cout<<"Enter the sides of the polygon to be displayed:"<<endl;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        x[i]=rand()%800;
        cout<<"x["<<i<<"]=  "<<x[i]<<endl;
        y[i]=rand()%600;
        cout<<"y["<<i<<"]=  "<<y[i]<<endl;
    }
    x[i]=x[1];
    cout<<"x["<<i<<"]=  "<<x[i]<<endl;
    y[i]=y[1];
    cout<<"y["<<i<<"]=  "<<y[i]<<endl;

    r=rand()%2;
    g=rand()%2;
    b=rand()%2;

    glColor3f(r,g,b);
    glBegin(GL_POLYGON);
    for(j=1;j<=n;j++)
    {
        glVertex2i(x[j],y[j]);
    }
    glVertex2i(x[j],y[j]);
    glEnd();
    glFlush();
    glutSwapBuffers();
}


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

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DEPTH|GLUT_RGBA|GLUT_DOUBLE);
    glutInitWindowSize(width,height);
    glutInitWindowPosition(100,100);
    glutCreateWindow("Random_Polygons!!!!");
    glClearColor(0,0,0,0);
    gluOrtho2D(0,800,0,600);
    glutDisplayFunc(RandomPolygons);
    glutIdleFunc(RandomPolygons);
    glutMainLoop();
}

输出

它只是没有响应(渲染屏幕),另一方面终端工作正常....

enter image description here

2 个答案:

答案 0 :(得分:2)

glutKeyboardFunc阻止,直到用户输入内容为止。由于应用程序被阻止,因此不执行Windows消息循环,窗口停止响应。

当您需要在OpenGL应用程序中输入时,您必须听取glutSpecialFunc和{{1}}并从那里构建输入。

答案 1 :(得分:0)

  1. 我同意@BDL

    cin 阻止处理 ...您应该分开顶点生成和多边形渲染。现在,您调用的是没有预定义种子的随机多边形,这将改变每个帧的顶点,使其变得模糊 。更不用说每个帧都需要用户输入键盘

  2. 除此之外

    您正在创建随机点作为顶点,而这些顶点并不总是会创建OpenGL无法正确处理的多边形。为避免出现问题,请使用GL_TRIANGLE_FAN代替GL_POLYGON并按角度对顶点进行排序(或生成已排序的顶点),例如:

    GLfloat x[100],y[100],a,r;
    GLint i,n=5;
    randseed(10); // init random generator with some value or do this not inside rendering instead
    for (i=0,a=0.0;i<n;a+=rand(6.28/n),i++)  
     {
     r=rand(0.5);
     x[i]=r*cos(a);
     y[i]=r*sin(a);
     }
    // render
    glBegin(GL_TRIANGLE_FAN);
    glVertex2f(0.0,0.0);
    for (i=0;i<n;i++)  glVertex2f(x[i],y[i]);
    glVertex2f(x[0],y[0]);
    glEnd();
    

    或扔掉顶点,将多边形转换为凹面一个。