Урок 3 (Анимация. Движение по криволинейной)

Содержание

Слайд 2

Функция GetTickCount

DWORD function GetTickCount();
Функция Windows API, возвращающая количество миллисекунд с момента старта Windows.

DWORD – беззнаковый целочисленный тип, размером

Функция GetTickCount DWORD function GetTickCount(); Функция Windows API, возвращающая количество миллисекунд с
двойное машинное слово.

Слайд 3

Равномерное движение по кривой, заданной в параметрическом виде

Самая простая криволинейная траектория -

Равномерное движение по кривой, заданной в параметрическом виде Самая простая криволинейная траектория
это окружность или эллипс. Окружность является частным случаем эллипса.
Параметрическое уравнение эллипса в прямоугольной системе координат имеет вид:

Параметр t является углом между положительным направлением оси абсцисс и радиус-вектором данной точки.

Слайд 4

Перед нами стоит задача – изобразить круг, движущийся по эллиптической орбите с

Перед нами стоит задача – изобразить круг, движущийся по эллиптической орбите с
некоторой угловой скоростью.
У нас уже имеется функция рисования круга:
void DrawRound(double x, double y, double radius, double r, double g, double b)
{
// передаются координаты центра, радиус и цвет круга
int n = 50;//количество вершин полигона
glBegin(GL_POLYGON);
glColor3d(r, g, b);
for (int i = 0; i glVertex2d(x + radius*cos(i * 2 * 3.14159 / n),
y + radius*sin(i * 2 * 3.14159 / n));
glEnd();
}

Используем ее для рисования движущегося круга.

Слайд 5

Функция movePound()- движение круга по эллиптической орбите:

//добавьте глобальные переменные
const float PI=3.14159f;
float v1

Функция movePound()- движение круга по эллиптической орбите: //добавьте глобальные переменные const float
= 90;//скорость в градусах
float startTime = 0.0f;//время запуска программы
void moveRound()
{
float dt = (GetTickCount() - startTime)/1000.f;
float x1 = 10 * cos(dt*v1*PI/180);//если PI взять =3, то получим(dt*v1/60)
float y1 = 5 * sin(dt*v1*PI/180);
DrawRound(x1,y1,0.5,1,1,0);
}

Слайд 6

Отредактируйте функцию main:

void main()
{
startTime=GetTickCount();
RunOpenGL();
}

Отредактируйте функцию display (или Draw):

void CALLBACK

Отредактируйте функцию main: void main() { startTime=GetTickCount(); RunOpenGL(); } Отредактируйте функцию display
display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
moveRound();//движующийся круг
osi(10);//оси координат
auxSwapBuffers();
}

Слайд 7

Результат работы программы
Траектория движения круга – эллипс с большой полуосью =10, малой

Результат работы программы Траектория движения круга – эллипс с большой полуосью =10,
= 5, угловой скоростью v1=90.

Самостоятельно добавьте еще один круг, траектория движения которого, например, эллипс с большой полуосью = 4, малой = 8, угловой скоростью = 45.

Слайд 9

Некоторые кривые, формулы которых можно использовать для задания траектории:

Некоторые кривые, формулы которых можно использовать для задания траектории:

Слайд 11

А как анимировать объект, если он отрисовывается всегда в одном месте, например,

А как анимировать объект, если он отрисовывается всегда в одном месте, например,
в начале координат?

Наш эллипс всегда рисуется в начале координат. Вот наша функция рисования заполненного эллипса:
void DrawEllipseFill(double r1,double r2, double r, double g, double b)
{ // передаются полуоси, цвет эллипса
int n = 50;//количество точек полигона
glBegin(GL_TRIANGLE_FAN);
glColor3d(r, g, b);
for (int i = 0; i glVertex2d(r1*cos(i*2*3.14159/n),r2*sin(i*2*3.14159/n));
glEnd();
}

Слайд 12

Очень просто! Переместим его в нужную нам точку с помощью glTranslated.

const float

Очень просто! Переместим его в нужную нам точку с помощью glTranslated. const
PI=3.14159f;
float v1 = 90;//угловая скорость
float startTime = 0.0f; //время запуска программы
//Функция рисования движущегося эллипса
void moveEllipseFill()
{ float dt = (GetTickCount() - startTime)/1000.f;
float x1 = 10 * cos(dt*v1*PI/180);//если PI взять =3, то (dt*v1/60)
float y1 = 5 * sin(dt*v1*PI/180);
glPushMatrix();//сохранили текущую матрицу
glTranslated(x1, y1, 0);//переместили систему в точку (x1,y1)
DrawEllipseFill(2,1,1,0,1);//нарисовали эллипс нужного размера и цвета
glPopMatrix();//вернули текущую матрицу
}

Слайд 13

Траектория движения эллипса – эллиптическая с большой полуосью =10, малой = 5.

Траектория движения эллипса – эллиптическая с большой полуосью =10, малой = 5.

Слайд 14

Движение по траектории, заданной аналитической функцией y=f(x)

float xFrom=-3*PI,//начальная точка движения
xTo=3*PI;// конечная

Движение по траектории, заданной аналитической функцией y=f(x) float xFrom=-3*PI,//начальная точка движения xTo=3*PI;//
точка движения
float v=4;//скорость ед/c
void moveRound1()
{
float dt = (GetTickCount() - startTime)/1000.f;
float x1=xFrom+dt*v;
//код с if необходим, чтобы объект двигался и в обратном направлении
if ((x1>xTo)&&(xTo>xFrom)||(x1 {
v = -v;
float xTemp = xTo;
xTo = xFrom;
xFrom = xTemp;
startTime = GetTickCount();
}
float y1=x1*sin(x1);// уравнение кривой y=x⋅sin(x)
DrawRound(x1,y1,0.3,1,1,0);
}

Слайд 15

void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
moveRound1();
osi(10);
auxSwapBuffers();
}

Добавьте вызов

void CALLBACK display(void) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); moveRound1(); osi(10); auxSwapBuffers();
moveRound1() в функцию display():
Имя файла: Урок-3-(Анимация.-Движение-по-криволинейной).pptx
Количество просмотров: 32
Количество скачиваний: 0