OpenGL with GLUT - 黑屏问题

3

我希望能得到一个由四个三角形组成的小动画。我写了几个版本的代码,但是没有一个版本能够正常运行。结果就是我只看到了一个黑色的空白屏幕。 我的代码:

#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;
}

我想创建一个动画,其中我的矩形由三角形构建,每个小时间内旋转2度。我希望像钟表一样旋转它。 我知道问题不在时间(不是太小),而是在glRotatef-我不知道它应该使用什么参数才能给我一个合适的效果。

提前感谢!:)

1个回答

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;
}

旋转始终是相对于您使用的坐标系的。变换总是按照相反的顺序应用。当我们使用rotatef函数旋转对象时,它始终相对于坐标系的中心。因此,首先我们需要将其平移到中心位置,这可以通过translatef(-300,-300,0)完成。现在对象位于中心位置。然后我们使用rotatef将对象旋转到x,y或z轴。然后我们再次将对象平移回变换前的位置。最后,我们以相反的顺序编写函数。您可以开始了 :)


嗨,谢谢回复;)我已经更改了我的代码,现在它看起来像这样 - http://pastebin.com/gNcjWLad - 现在,在启动后它会冻结.. :< - user3025978
我修复了它,让我编辑帖子以便我可以解释。给我5分钟。 - KostasRim
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/93918/discussion-between-user3025978-and-kostasrim。 - user3025978
如果你需要任何帮助,请告诉我,我会尽力协助你的 :) - KostasRim
我刚刚看到了你的消息,我已经回复了 :) - KostasRim
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接