2015-10-31 161 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