用于水平滚动文本的OpenGL动画不能滚动

gfttwv5a  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(217)

我正在尝试将文本滚动为横幅。我使用了带有Glut的OpenGL来实现这一点。如果我使用像正方形这样的图形,整个代码都可以工作。正方形在屏幕上滚动。

现在我想用文本来做这件事。每次这个节目开始的时候。文本出现在它的起始位置,但当计时器启动时,它消失了。这可能是因为屏幕在每个时钟时刻都会被清除,但屏幕不会再次堆积起来。

有人能帮我翻译这个动画和文字吗?


# include <stdio.h>

# include <string.h>

# include <math.h>

# include <iostream>

# ifdef WIN32

# include <windows.h>

# endif

# include <GL/gl.h>

# include <GL/glut.h>

using namespace std;

static int font_index = 0;
int state = 1;

void print_bitmap_string(/*void* font,*/ const char* s)
{

    while (*s) {
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *s);
        s++;
    }

}

void my_reshape(int w, int h)
{
    GLdouble size;
    GLdouble aspect;

    /* Use the whole window. */
    glViewport(0, 0, w, h);

    /* We are going to do some 2-D orthographic drawing. */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    size = (GLdouble)((w >= h) ? w : h) / 2.0;
    if (w <= h) {
        aspect = (GLdouble)h / (GLdouble)w;
        glOrtho(-size, size, -size * aspect, size * aspect, -100000.0, 100000.0);
    }
    else {
        aspect = (GLdouble)w / (GLdouble)h;
        glOrtho(-size * aspect, size * aspect, -size, size, -100000.0, 100000.0);
    }

    /* Make the world and window coordinates coincide so that 1.0 in */
    /* model space equals one pixel in window space.                 */
    glScaled(aspect, aspect, 1.0);

    /* Now determine where to draw things. */
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

}

float yild;
float ystep;
float x_pos = -200;
float y_pos = 70;

void draw()
{
    const char* bitmap_font_names[7] = { "Hello train" };

    /* Draw the strings, according to the current mode and font. */
    glTranslatef(0.5, -100, 0);
    //set the text color
    glColor4f(0.0f, 255.0f, 140.0f, 1.0f);

    ystep = 100.0;
    yild = 20.0;
    glRasterPos2f(x_pos, y_pos + 1.25 * yild);
    print_bitmap_string(bitmap_font_names[0]);
}

void display(void)
{
    //change background color
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    draw();
    glColor3f(0.0, 1.0, 0.0);
    glBegin(GL_POLYGON);

    glVertex2f(x_pos + 0.5f, 0.0f);
    glVertex2f(x_pos+1.0f, 0.5f);
    glVertex2f(x_pos+0.5f, 0.5f);

    glEnd();
    glutSwapBuffers();
}

void timer(int) {
    glutPostRedisplay();
    glutTimerFunc(1000 , timer, 0);
    switch (state) {
    case 1:
        if (x_pos > -295) {
            x_pos -= 1;
        }
        else {
            state = -1;
        }
        break;
    case -1:
        x_pos = 180;
        state = 1;
        break;
    }

    cout << x_pos << endl;
}

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

    glutInitWindowSize(500, 150);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("Train Display");
    glutDisplayFunc(display);
    glutReshapeFunc(my_reshape);
    glutTimerFunc(1000, timer, 0);
    glutMainLoop();

    return 0;
}
5uzkadbs

5uzkadbs1#

glTranslate不仅设置平移矩阵,还将当前矩阵乘以平移矩阵。您需要在glTranslatef之前加载带有glLoadIdentity的单位矩阵,或者使用glPushMatrix/glPopMatrix保存和恢复当前矩阵:

void draw()
{
    const char* bitmap_font_names[7] = { "Hello train" };

    glPushMatrix();

    /* Draw the strings, according to the current mode and font. */
    glTranslatef(0.5, -100, 0);
    //set the text color
    glColor4f(0.0f, 255.0f, 140.0f, 1.0f);

    ystep = 100.0;
    yild = 20.0;
    glRasterPos2f(x_pos, y_pos + 1.25 * yild);
    print_bitmap_string(bitmap_font_names[0]);

    glPopMatrix();
}

相关问题