2015-10-31 160 views
2

我想收到一个四个三角形的小动画。我编写了几个版本的代码,但这些版本都不起作用。结果我有一个空白的黑屏。 我的代码:OpenGL with GLUT - 黑色屏幕

#define GLUT_DISABLE_ATEXIT_HACK 
#define TIMERSECS 20 

#include <windows.h> 
#include <GL/glut.h> 
#include <GL/gl.h> 
#include <GL/GL.H> 
#include <stdlib.h> 

float arc = 0.0f; 

void draw_traingle(float x0, float y0, float x1, float y1, float x2, float y2) { 
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f); //Blue 
    glVertex2f(x0, y0); 
    glVertex2f(x1, y1); 
    glVertex2f(x2, y2); 
} 

void draw(void) { 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glRotatef(arc, 1.0f,0.0f,0.0f); 

    glBegin(GL_POLYGON); 

    float center_x = 300.0f; 
    float center_y = 300.0f; 

    float up_x = center_x; 
    float up_y = 250.0f; 

    float down_x = center_x; 
    float down_y = 350.0f; 

    float right_x = 350.0f; 
    float right_y = center_y; 

    float left_x = 250.0f; 
    float left_y = center_y; 
    glPushMatrix(); 
    draw_traingle(up_x, up_y, right_x, right_y, center_x, center_y); 
    draw_traingle(right_x, right_y, down_x, down_y, center_x, center_y); 
    draw_traingle(down_x, down_y, left_x, left_y, center_x, center_y); 
    draw_traingle(left_x, left_y, up_x, up_y, center_x, center_y); 
    glPopMatrix(); 
    glEnd(); 
    glFlush(); 
    glutSwapBuffers(); 
} 

void handleKeypress(unsigned char key, int x, int y) { 
    switch (key) { 
    case 27: 
     exit(0); 
    } 
} 
void init(void) { 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glViewport(0, 0, 600, 600); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); //=1 
    gluOrtho2D(0.0, 600.0, 0.0, 600.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); //=1 
} 
void update(int value) { 
    arc += 2.0f; 
    if (arc > 360.f) { 
     arc -= 360; 
    } 
    glutPostRedisplay(); 
    glutTimerFunc(TIMERSECS, update, 0); 
} 
int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //single buffer and RGBA 
    glutInitWindowSize(600, 600); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Window"); 
    init(); 
    glutDisplayFunc(draw); 
    glutTimerFunc(TIMERSECS, update, 0); 
    glutKeyboardFunc(handleKeypress); 
    glutMainLoop(); 
    return 0; 
} 

我想创建一个动画在我的rectange从traingles建造将为每一些小时间2度旋转。我想旋转它像钟表的作品。我知道问题不及时(不小),但在glRotatef - 我不知道它应该采取什么参数给我一个适当的效果。

在此先感谢! :)

回答

0
#include <GL/glut.h> 
#include <GL/gl.h> 
#include <stdlib.h> 
//#define TIMERSECS 200 prefer not to use preprocessor macros 
//instead you can use: 
static const int TIMERSECS = 200; 

float arc = 0.0f; 

void draw_traingle(float x0, float y0, float x1, float y1, float x2,  float y2) { 
    glBegin(GL_POLYGON); 
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f); //Blue 
    glVertex2f(x0, y0); 
    glVertex2f(x1, y1); 
    glVertex2f(x2, y2); 
    glEnd(); 
} 

void draw(void) { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glTranslatef(300, 300, 0); 
    glRotatef(arc, 0.0f,0.0f,1.0f); 
    glTranslatef(-300, -300, 0); 

    float center_x = 300.0f; 
    float center_y = 300.0f; 

    float up_x = center_x; 
    float up_y = 250.0f; 

    float down_x = center_x; 
    float down_y = 350.0f; 

    float right_x = 350.0f; 
    float right_y = center_y; 

    float left_x = 250.0f; 
    float left_y = center_y; 
    draw_traingle(up_x, up_y, right_x, right_y, center_x,  center_y); 
    draw_traingle(right_x, right_y, down_x, down_y, center_x, center_y); 
    draw_traingle(down_x, down_y, left_x, left_y, center_x, center_y); 
    draw_traingle(left_x, left_y, up_x, up_y, center_x, center_y); 

    glutSwapBuffers(); 
} 

void handleKeypress(unsigned char key, int x, int y) { 
    switch (key) { 
    case 27: 
      exit(0); 
    } 
} 

void init() { 
    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glViewport(0, 0, 600, 600); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); //=1 
    gluOrtho2D(0.0, 600.0, 0.0, 600.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); //=1 
} 
void update(int value) { 
    arc += 2.0f; 
    if (arc > 360.f) { 
      arc -= 360; 
    } 
    glutPostRedisplay(); 
    glutTimerFunc(200, update, 1); 
} 
int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); //single buffer and RGBA 
    glutInitWindowSize(600, 600); 
    glutCreateWindow("Window"); 
    init(); 
    glutDisplayFunc(draw); 
    glutTimerFunc(TIMERSECS, update, 1); 
    glutKeyboardFunc(handleKeypress); 
    glutMainLoop(); 
    return 0; 
} 

旋转总是相对于您正在使用的坐标系。 Transforimations始终以相反的顺序应用。当我们使用rotatef函数旋转对象时,它总是相对于坐标系的中心。所以首先我们需要将它翻译到由translatef(-300,-300,0)完成的中心。现在物体位于中心。然后我们使用rotatef将对象旋转到x,y或z轴。然后我们再次将对象转换为转换前的位置。最后,我们按照相反的顺序编写函数。你是好去:)

+0

您好,感谢响应;)我已经改变了我的代码,现在它看起来像 - http://pastebin.com/gNcjWLad - 现在,它推出后 - 它冻结..:< – user3025978

+0

该死的:P首先用glutSwapBuffers()替换glflush()(后者在没有调用的情况下导致刷新)。替换main中的init()调用,并将其作为glutReshapeFunc(init)中的一个参数。在draw()(函数的line1)中删除第一个glLoadIdentity()。 Draw_triangle应该有一个开头(GL_TRIANGLE)跟着一个glEnd()。 – KostasRim

+0

嗨! :D这仍然不好 - http://pastebin.com/CfEqHKzW或mabye我做错了什么..?在绘制三角形之前使用glEnd()前面的 – user3025978