在openGL中挥舞旗帜(C)

时间:2016-07-06 21:50:32

标签: c opengl

我正在尝试使用openGL和c(或c ++)挥动新西兰国旗, 我使用矩阵制作旗帜,但我不知道如何制作波浪效果, 这是我的整个代码,我尝试在空闲函数中更改矩阵的参数,但我无法产生效果(它将我的整个标志更改为我正在更改的其他阴影:

#include "GLUT.H"
#include <math.h>

#define HEIGHT 600
#define WIDTH 600

unsigned char matrix[HEIGHT][WIDTH][3]; // r,g,b
double offset=0;

void init()
{
    int i,j;

    for(i=0;i<200;i++)
        for(j=0;j<WIDTH;j++)
        {
            matrix[i][j][0] = 0; // red
            matrix[i][j][1] = 255; // green
            matrix[i][j][2] = 0; // blue
        }

    for(i=200;i<400;i++)
        for(j=0;j<WIDTH;j++)
        {
            matrix[i][j][0] = 255; // red
            matrix[i][j][1] = 255; // green
            matrix[i][j][2] = 255; // blue
        }

    for(i=400;i<600;i++)
        for(j=0;j<WIDTH;j++)
        {
            matrix[i][j][0] = 0; // red
            matrix[i][j][1] = 0; // green
            matrix[i][j][2] = 255; // blue
        }

    glClearColor(0,0,0.4,0);
    glOrtho(-1,1,-1,1,-1,1);
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawPixels(WIDTH,HEIGHT,GL_RGB,GL_UNSIGNED_BYTE,matrix);
    glutSwapBuffers();
}

void idle()
{
    int i,j;
    double dist;
    offset-=0.14;

    for(i=0;i<HEIGHT;i++)
        for(j=0;j<WIDTH;j++)
        {
            dist = sqrt((double)(i-HEIGHT/2)*(i-HEIGHT/2)+(j-WIDTH/2)*(j-WIDTH/2));
            //matrix[i][j][0] = 0;//int(255*(1+sin((2*j)*0.03+offset))/2); // red
            //matrix[i][j][1] = dist;//int(255*(1+sin((2*dist)*0.03+offset))/2); // green
            //matrix[i][j][2] = 0;//int(255*(1+sin((j)*0.03+offset))/2); // blue
        }


    glutPostRedisplay();
}


void main( int argc, char* argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
    glutInitWindowSize(WIDTH,HEIGHT);
    glutInitWindowPosition(100,100);
    glutCreateWindow("ok");
    glutDisplayFunc(display);
    glutIdleFunc(idle);
    init();
    glutMainLoop();
}

任何想法\建议\解决方案(笑)我怎么能让它挥手?

p.s:我还需要在中间添加一些星星(也无法如何绘制它以便它会波动)

1 个答案:

答案 0 :(得分:1)

你可以玩颜色,让它们中的一些更暗,像那样(抱歉因为它是一个spagetti代码,你将不得不调整和优化它):

void idle()
{
    static float count = 0.0;

    int i,j;
    count += 0.05;
    offset-=0.14;

    for(i=0;i<200;i++)
        for(j=0;j<WIDTH;j++)
        {
            matrix[i][j][0] = 0; // red
            matrix[i][j][1] = 200 + 55 * sin(count + j * 0.02); // green
            matrix[i][j][2] = 0; // blue
        }

    for(i=200;i<400;i++)
        for(j=0;j<WIDTH;j++)
        {
            matrix[i][j][0] = 200 + 55 * sin(count + j * 0.02); // red
            matrix[i][j][1] = 200 + 55 * sin(count + j * 0.02); // green
            matrix[i][j][2] = 200 + 55 * sin(count + j * 0.02); // blue
        }

    for(i=400;i<600;i++)
        for(j=0;j<WIDTH;j++)
        {
            matrix[i][j][0] = 0; // red
            matrix[i][j][1] = 0; // green
            matrix[i][j][2] = 200 + 55 * sin(count + j * 0.02); // blue
        }

    glutPostRedisplay();
}

void idle() { static float count = 0.0; int i,j; count += 0.05; offset-=0.14; for(i=0;i<200;i++) for(j=0;j<WIDTH;j++) { matrix[i][j][0] = 0; // red matrix[i][j][1] = 200 + 55 * sin(count + j * 0.02); // green matrix[i][j][2] = 0; // blue } for(i=200;i<400;i++) for(j=0;j<WIDTH;j++) { matrix[i][j][0] = 200 + 55 * sin(count + j * 0.02); // red matrix[i][j][1] = 200 + 55 * sin(count + j * 0.02); // green matrix[i][j][2] = 200 + 55 * sin(count + j * 0.02); // blue } for(i=400;i<600;i++) for(j=0;j<WIDTH;j++) { matrix[i][j][0] = 0; // red matrix[i][j][1] = 0; // green matrix[i][j][2] = 200 + 55 * sin(count + j * 0.02); // blue } glutPostRedisplay(); }