Базовые преобразования объектов (вращение, смещение и масштабирование в анимации)
Масштабирование вращающихся звезд в случайной точки окна
#define _USE_MATH_DEFINES
#include <cmath>
#include<time.h>
#include "glut.h"
using namespace std;
#define xmax 10
#define xmin -10
#define ymax 10
#define ymin -10
static float fi=0;
const int countStar=250;
float x[countStar];
float y[countStar];
float scale[countStar];
int color[countStar*3];
void init()
{
glClearColor(1.0, 1.0, 1.0, 0.0);
gluOrtho2D(xmin, xmax, ymin, ymax);
/* initialize random seed: */
srand (time(NULL));
for(int i=0;i<countStar;i++)
{
x[i]=rand()%20-10;//
//LO + static_cast <float> (rand()) /( static_cast <float> (RAND_MAX/(HI-LO)));
y[i]=rand()%20-10;
scale[i]=rand() % 100/100.; //от 0 до 0.99 float
}
for(int i=0;i<countStar*3;i++)
{
color[i]=rand()%255;
}
}
void Circle(float r,float x=0, float y=0)
{
glPushMatrix();//запомнили систему координат
glBegin(GL_TRIANGLE_FAN);
glVertex2f(x, y);
for (float alfa=0;alfa<=2*M_PI;alfa+=2*M_PI/72)
glVertex2f(r*sin(alfa), r*cos(alfa));
glEnd();
glPopMatrix();//восстановили первоначальную систему
}
void star()
{
for (float alfa=0;alfa<=2*M_PI;alfa+=2*M_PI/5)
Circle(2,6*sin(alfa), 6*cos(alfa));
}
void draw()
{
// очистка экрана цветом из буфера
glClear(GL_COLOR_BUFFER_BIT);
//горизонтальная сетка
glColor3f(0.0, 1.0, 0.0);
glBegin(GL_LINES);
for (float x=xmin;x<=xmax;x+=xmax/10)
{
glVertex2f(x, ymax);
glVertex2f(x, ymin);
}
//вертикальная сетка
for (float y=ymin;y<=ymax;y+=ymax/10)
{
glVertex2f(xmax, y);
glVertex2f(xmin, y);
}
glEnd();
for(int i=0;i<countStar;i++)
{
glPushMatrix();
glTranslatef(x[i], y[i],0);
glRotatef(fi,0,0,1);//вращаем по оси Z*(rand()%2-1)
glScalef(scale[i]*fi/100, scale[i]*fi/100, scale[i]*fi/100);
glColor3ub(color[i*3], color[i*3+1], color[i*3+2]);
star();
glPopMatrix();
}
if (fi>360)fi=0;
fi+=1;
glFlush();//показать кадр
glutSwapBuffers();
}
void timf(int value) // Timer
{
glutPostRedisplay();
glutTimerFunc(20, timf, 0);
}
void main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH | GLUT_MULTISAMPLE);
glutInitWindowPosition(150, 50);
glutInitWindowSize(600,600);
glutCreateWindow("translate rotate scale");
init();
glutDisplayFunc(draw);
glutTimerFunc(40, timf, 0);
glutMainLoop();
}
Для самостоятельной работы:
1. Создайте анимацию масштабирования окружности.
2. Создайте анимацию передвижения квадрата.
3. Создайте анимацию вращения розы.