2016-07-06 2 views
0

Я пытаюсь сделать развевающийся флаг Новой Зеландии с помощью openGL и c (или C++), Я сделал флаг, используя матрицу, но я не знаю, как сделать волновой эффект, здесь весь мой код, я попытался изменить параметры матрицы в пустой функции, но я не могу сделать эффект (он меняет весь мой флаг других оттенков, которые я меняю там:Развевающийся флаг в openGL (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(); 
} 

Любые идеи \ пожелания \ решение (lol) как я могу заставить его волноваться?

ps: Мне нужно будет добавить к нему некоторую звезду в середине также (также неведомо, как рисовать ее так это волна)

+0

Вы можете отобразить прямоугольник? Можете ли вы отобразить его под углом (от камеры)? Можете ли вы отобразить его статически в виде синусоидальной волны? Сделайте шаг за шагом, чтобы достичь последнего, тогда вы всего на один шаг от фактического оживления флага. –

+0

Я могу показать флаг статически прямо сейчас. – Coder123

+0

Затем попробуйте показать флаг, искаженный с помощью какой-либо синусоиды, статически (т. Е. Не анимированной) вдоль оси Y. Затем последним шагом является получение этого «искажения» для анимации, путем корректировки эффекта синусоидальной волны в вашей функции 'free '. Честно говоря, я никогда не делал этого до себя, но так я и сделал бы это. –

ответ

1

Вы можете играть с цветами, что делает некоторые из них темнее, что-то вроде этого (извините beucause это спагетти-код, вам придется настроить и оптимизировать его):

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

Смежные вопросы