Я пытаюсь сделать развевающийся флаг Новой Зеландии с помощью 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: Мне нужно будет добавить к нему некоторую звезду в середине также (также неведомо, как рисовать ее так это волна)
Вы можете отобразить прямоугольник? Можете ли вы отобразить его под углом (от камеры)? Можете ли вы отобразить его статически в виде синусоидальной волны? Сделайте шаг за шагом, чтобы достичь последнего, тогда вы всего на один шаг от фактического оживления флага. –
Я могу показать флаг статически прямо сейчас. – Coder123
Затем попробуйте показать флаг, искаженный с помощью какой-либо синусоиды, статически (т. Е. Не анимированной) вдоль оси Y. Затем последним шагом является получение этого «искажения» для анимации, путем корректировки эффекта синусоидальной волны в вашей функции 'free '. Честно говоря, я никогда не делал этого до себя, но так я и сделал бы это. –