2015-04-03 112 views
0

绘制一个形状后,我无法在我的显示功能中绘制任何更多的形状。但它在其他方法中被完美绘制,但不是在我的glutidlefunction(myDispalay)中。在这里呆了两天左右。任何人都可以帮助我离开这里吗?opengl代码编译问题

下面是代码:

include < stdio.h> 

include< math.h> 

include < GL/glut.h> 

define PI 3.1416 

float x,y,r,y2,r2; 

void drawCircle(float x, float y, float radius) 

{ 
    int i; 

    int triangleAmount = 1000; //# of triangles used to draw circle 

    float twicePi = 2.0f * PI; 

    glBegin(GL_TRIANGLE_FAN); 

    for(i = 0; i <= triangleAmount;i++) 

    { 
     glVertex2f(x + (radius * cos(i * twicePi/triangleAmount)), 
      y + (radius * sin(i * twicePi/triangleAmount))); 
    } 
    glEnd(); 
} 

void drawthrower() 

{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glColor3f(0.0,1.0,0.0); 
    drawCircle(x,y,r); 
    glBegin(GL_LINES); 
     glVertex2i(x-12,y-28); 
     glVertex2i(x-12,y-70); 

     glVertex2i(x+12,y-28); 
     glVertex2i(x+12,y-70); 
    glEnd(); 
    drawCircle(x,y2,r2); 
    glutSwapBuffers(); 
} 

void myDisplay() 
{ 

     while ((x+r)<=1024) 
     { 
      x+=8; 
      drawthrower(); 
     } 

    while ((x-r)>=0) 
     { 
      x-=8; 
      drawthrower(); 
     } 

} 


void myInit() 
{ 

    glClearColor(1,1,1,1); 

    x=50,y=693,r=30,x=50,y2=623,r2=12; 

} 

void reshape(int w, int h) 
{ 

    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 

    glMatrixMode(GL_PROJECTION); 

    glLoadIdentity(); 

    glOrtho(0.0, 1024.0, 0.0, 768.0, 0.0, 1.0); 

    glMatrixMode(GL_MODELVIEW); 

} 


int main(int argc, char** argv) 

{ 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(1024,768); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("Graphics_Project"); 
    myInit(); 
    glutReshapeFunc(reshape); 
    glutIdleFunc(myDisplay); 
    glutMainLoop(); 
    return 0; 

} 
+0

您需要在主显示函数结束时每帧调用一次'glutSwapBuffers()'。 – 2015-04-03 19:50:08

+0

在这段代码中,我画了一个阴影,并不断在可见范围内沿x轴移动对象。通过在主显示函数中最后调用一次glutSwapBuffers()并不能解决我的问题。它并没有在屏幕上画出任何新的形状,甚至停止了我刻意塑造的形状的运动。我也尝试过使用单个缓冲区,但它也提取相同的问题 – 2015-04-03 20:14:51

回答

0

当使用GLUT绘图代码应被隔离到显示回调函数。您目前已将显示功能注册为空闲功能。为了让程序调用显示功能,不断地从空闲功能(或者注册glutPostRedisplay 作为空闲功能)调用glutPostRedisplay。您应该将绘图代码限制在显示回调的原因是,根据重绘事件发送时的操作系统,可能会设置特定的特定状态。

另外,虽然在技术上不是错误的,但是风格问题是,应该将glutSwapBuffers移动到显示函数中,以便在维护程序时不会寻找细节,例如缓冲区交换在哪个子例程中执行出。

+0

在这段代码中,我绘制了一个abject并不断在可见范围内沿x轴移动对象。通过在主显示函数中最后调用一次glutSwapBuffers()并不能解决我的问题。它并没有在屏幕上画出任何新的形状,甚至停止了我刻意塑造的形状的运动。我也尝试过使用单个缓冲区,但它也提取了同样的问题。但是如果我在Drawthrower()/ draw circle()除了myDisplay()之外的其他方法上绘制某些东西,我完全可以生成精确的输出。 – 2015-04-03 20:41:46

+0

'#include“mongo/client/dbclient.h” #include #include using namespace std; 使用命名空间mongo; int main(int argc,const char ** argv){ cout <<“迄今为止好”<< endl; client :: GlobalInstance实例; //每次产生分段错误\t if(!instance.initialized()){ std :: cout <<“无法初始化客户端驱动程序:”<< instance.status()<< std :: endl; return EXIT_FAILURE; } \t其他 \t { \t \t的std ::法院<< “成功初始化客户端驱动程序:” << instance.status()<<的std :: ENDL; \t} \t return EXIT_SUCCESS; }' – 2017-01-11 04:41:05