Компьютерная графика (лекция 3)

Содержание

Слайд 2

Слайд 3

Преобразование плоскости называется аффинным, если оно взаимно однозначно; образом любой прямой

Преобразование плоскости называется аффинным, если
оно взаимно однозначно;
образом любой прямой

является прямая.
Преобразование называется взаимно однозначным, если
разные точки переходят в разные;
в каждую точку переходит какая-то точка.
Слайд 4

Однородные координаты Однородные координаты — координаты, обладающие тем свойством, что определяемый

Однородные координаты


Однородные координаты — координаты, обладающие тем свойством,

что определяемый ими объект не меняется при умножении всех координат на одно и то же число.
Слайд 5

Примеры движений. Примеры аффинных преобразований

Примеры движений.
Примеры аффинных преобразований

Слайд 6

Простейшие преобразования Сжатие/растяжение Поворот Параллельный перенос Отражение

Простейшие преобразования
Сжатие/растяжение
Поворот
Параллельный перенос
Отражение

Слайд 7

1) каждое из приведенный преобразований имеет простой и наглядный геометрический смысл

1) каждое из приведенный преобразований имеет простой и наглядный геометрический смысл
2)

любое преобразование всегда можно представить как последовательное исполнение простейших преобразований
Слайд 8

Сжатие/растяжение Это преобразование умножает соответствующие координаты точек на коэффициенты масштабирования по

Сжатие/растяжение

Это преобразование умножает соответствующие координаты точек на коэффициенты масштабирования по

осям: (x, y) -> (ax * x, ay * y). Матрица преобразования :
[  ax   0    0  ]     
[  0    ay   0  ]
[  0    0    1  ] 
ax – растяжение по оси x,
ay  – растяжение по оси y.
Слайд 9

Поворот Матрица преобразования : [cos(а) sin(а) 0 ] [-sin(а) cos(а) 0

Поворот

Матрица преобразования :
[cos(а)  sin(а)   0  ]    
[-sin(а)  cos(а)  0 ]

[  0         0        1  ] 
а – угол поворота
Слайд 10

Параллельный перенос Исходный вектор (x, y) переходит в (x + dx,

Параллельный перенос

Исходный вектор (x, y) переходит в
(x

+ dx, y + dy).
Матрица преобразования: 
[  1    0    0  ]    
[  0    1    0  ]
[  dx   dy   1  ]
Слайд 11

Отражение [ -1 0 0 ] [ 1 0 0 ]

Отражение

[  -1    0    0  ]     [   1    0    0 


[   0    1    0  ] [   0   -1    0  ]
[   0    0    1  ] [   0    0    1  ]
относительно оси x относительно оси y
Слайд 12

Общий вид аффинного преобразования f(x) = x * R + t,

Общий вид аффинного преобразования

f(x) = x * R + t,

где R – обратимая матрица 2x2, а t – произвольный вектор.
Матрица преобразования:
[ 0 ] [ х ] [ x’ ]
[    0 ] [ y ] = [ y’ ]
[ tx    ty      1 ] [ 1 ] [ 1 ]
Слайд 13

glRotate Функция glRotate поворачивает текущую матрицу на заданный угол вокруг заданного

glRotate

Функция glRotate поворачивает текущую матрицу на заданный угол вокруг заданного

вектора. Имеет следующие формы:
glRotated (GLdouble angle, GLdouble x, GLdouble y, double z)
glRotatef (GLfloat angle, GLfloat x, GLdouble y, GLfloat z)
angle - угол поворота
x, y, z – вектор, задающий ось поворота
Слайд 14

Примеры вызова функции glRotate glRotated(45, 1, 0, 0) – поворот на

Примеры вызова функции glRotate

glRotated(45, 1, 0, 0) – поворот на 45

градусов против часовой стрелки относительно оси x.
glRotated(90, 0, 0, -1) – поворот на 90 градусов по часовой стрелке относительно оси z.
Слайд 15

В функции glRotate вычисляется матрица поворота: выполняющая поворот на угол angle

В функции glRotate вычисляется матрица поворота:
выполняющая поворот на угол

angle против часовой стрелки вокруг вектора, направление которого задано точкой (x, y, z). Эта матрица вычисляется следующим образом:
Слайд 16


Слайд 17

glTranslate Функция glTranslate вносит дополнительное смещение в текущую матрицу. Имеет следующие

glTranslate

Функция glTranslate вносит дополнительное смещение в текущую матрицу. Имеет

следующие формы:
glTranslated(GLdouble x, GLdouble y, GLdouble z)
glTranslatef(GLfloat x, GLfloat y, GLfloat z)
x, y, z - координаты вектора сдвига
Слайд 18

Функция glTranslate выполняет сдвиг текущей матрицы на вектор (x, y, z).

Функция glTranslate выполняет сдвиг текущей матрицы на вектор (x, y,

z). Этот вектор сдвига используется для составления матрицы сдвига:
Слайд 19

glScale Функция glScale масштабирует текущую матрицу. Имеет следующие формы: glScaled(GLdouble x,

glScale

Функция glScale масштабирует текущую матрицу. Имеет следующие формы:

glScaled(GLdouble x, GLdouble y, GLdouble z)
glScalef(GLfloat x, GLfloat y, GLfloat z)
x, y, z - Коэффициенты масштабирования по соответствующим осям
Слайд 20

В функции glScale вычисляется матрица масштабирования:

В функции glScale вычисляется матрица масштабирования:

Слайд 21

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

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

записывается в текущую матрицу. Таким образом, если M — текущая матрица, а R — матрица преобразования, то матрица M будет заменена на M*R.
Если режим текущей матрицы GL_MODELVIEW , то все примитивы, нарисованные после вызова glScale, glRotate, glTranslated, будут соответствующим образом масштабированы
Слайд 22

glLoadIdentity Функция glLoadIdentity заменяет текущую матрицу на единичную. glLoadIdentity ()

glLoadIdentity

Функция glLoadIdentity заменяет текущую матрицу на единичную.
glLoadIdentity ()

Слайд 23

glPushMatrix, glPopMatrix Функции glPushMatrix и glPopMatrix предназначены для помещения матриц в

glPushMatrix, glPopMatrix

Функции glPushMatrix и glPopMatrix предназначены для помещения матриц

в стек и извлечения из него.
glPushMatrix( )
glPopMatrix( )
Слайд 24

Примеры преобразований void DrawGrid(GLdouble r, GLdouble g, GLdouble b) { GLdouble

Примеры преобразований

void DrawGrid(GLdouble r, GLdouble g, GLdouble b)
{
GLdouble dx = 1;
for

(int i = -10; i<=10; i++)
DrawLine(i*dx, -10, 0, i*dx, 10, 0, r, g, b);
}
Слайд 25

Примеры преобразований void Draw() { glTranslated(0, 0, -30); glRotated(GetTickCount()/10.f , 0.1,

Примеры преобразований

void Draw()
{ glTranslated(0, 0, -30);
glRotated(GetTickCount()/10.f , 0.1, 0.2,

0.3);
glTranslated(0, 0, -10); DrawGrid(1, 1, 1); glRotated(90, 0, 0, 1); DrawGrid(1, 1, 1);
glPushMatrix(); glTranslated(0, 0, -20);
DrawGrid(1, 0, 0); glRotated(90, 0, 0, 1);
DrawGrid(1, 0, 0);
glPopMatrix(); glTranslated(-10, 0, -10);
glRotated(90, 0, 1, 0); DrawGrid(0, 1, 0);
glRotated(90, 0, 0, 1); DrawGrid(0, 1, 0);
glTranslated(0, 0, 20); DrawGrid(0, 0, 1); glRotated(90, 0, 0, 1); DrawGrid(0, 0, 1);
}
Слайд 26

Слайд 27

Слайд 28

Слайд 29

Слайд 30

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

Равномерное движение

Равномерное движение — механическое движение, при котором тело

за любые равные отрезки времени проходит одинаковое расстояние.
Равномерное движение материальной точки — это движение, при котором величина скорости точки остаётся неизменной.
Расстояние, пройденное точкой за время t, задаётся в этом случае формулой L=vt.
Слайд 31

Функция GetTickCount() function GetTickCount: Longint; Возвращает вpемя, пpошедшее с момента запуска

Функция GetTickCount()

function GetTickCount: Longint;
Возвращает вpемя, пpошедшее с момента запуска системы

в миллисекундах.
float x = GetTickCount()/1000.f;
x — дробное время в секундах.
Слайд 32

Равномерное движение Необходимые переменные: float xfrom = 0; float xto =

Равномерное движение

Необходимые переменные:
float xfrom = 0;
float xto

= 10;
float v = 2;
int startTime = 0;
Слайд 33

Равномерное движение DrawRect(xfrom - 1.2, 0, 0.4, 10); DrawRect(xto + 1.2,

Равномерное движение

DrawRect(xfrom - 1.2, 0, 0.4, 10);
DrawRect(xto + 1.2, 0,

0.4, 10);
float x = 0, y = 0;
if (startTime==0) startTime = GetTickCount();
float dt = (GetTickCount() - startTime)/1000.f;
x = xfrom + v*dt;
if (x>xto) startTime = GetTickCount();
DrawRound(x, y, 1);
Слайд 34

Равномерное движение

Равномерное движение


Слайд 35

Равномерное движение DrawRect(xfrom - 1.2, 0, 0.4, 10); DrawRect(xto + 1.2,

Равномерное движение

DrawRect(xfrom - 1.2, 0, 0.4, 10);
DrawRect(xto + 1.2, 0,

0.4, 10);
float x = 0, y = 0;
if (startTime==0) startTime = GetTickCount();
float dt = (GetTickCount() - startTime)/1000.f;
x = xfrom + v*dt;
if (((x>xto) &&(xto>xfrom)) || ((x {
v = -v; float xtemp = xto; xto = xfrom; xfrom = xtemp;
startTime = GetTickCount();
}
DrawRound(x, y, 1);
Слайд 36

Равномерное движение

Равномерное движение


Слайд 37

Равномерное движение

Равномерное движение


Слайд 38

Равномерное движение в плоскости Необходимые переменные: float xfrom = 0; float

Равномерное движение в плоскости

Необходимые переменные:
float xfrom = 0;
float xto =

10;
float vx = 5;
float yfrom = 0;
float yto = 10;
float vy = 3;
int startTimex = 0;
int startTimey = 0;
Слайд 39

Равномерное движение в плоскости DrawRect(0-1.2, 5, 0.4, 12.8); DrawRect(10+1.2, 5, 0.4,

Равномерное движение в плоскости

DrawRect(0-1.2, 5, 0.4, 12.8);
DrawRect(10+1.2, 5,

0.4, 12.8);
DrawRect(5, 0-1.2, 12, 0.4);
DrawRect(5, 10+1.2, 12, 0.4);
float x, y = 0;
if (startTimex==0) startTimex = GetTickCount();
if (startTimey==0) startTimey = GetTickCount();
float dtx = (GetTickCount() - startTimex)/1000.f;
float dty = (GetTickCount() - startTimey)/1000.f;
Слайд 40

Равномерное движение в плоскости x = xfrom + vx*dtx; y =

Равномерное движение в плоскости

x = xfrom + vx*dtx;
y

= yfrom + vy*dty;
if (((x>xto) &&(xto>xfrom)) || ((x {
vx = -vx;
float xtemp = xto;
xto = xfrom;
xfrom = xtemp;
startTimex = GetTickCount();
}
Слайд 41

Равномерное движение в плоскости if (((y>yto) &&(yto>yfrom)) || ((y { vy

Равномерное движение в плоскости


if (((y>yto) &&(yto>yfrom)) || ((y {
vy =

-vy;
float ytemp = yto;
yto = yfrom;
yfrom = ytemp;
startTimey = GetTickCount();
}
DrawRound(x, y, 1);
Слайд 42

Равномерное движение в плоскости

Равномерное движение в плоскости

Слайд 43

Равномерное движение по эллипсу Необходимые переменные: float vr = 90; int

Равномерное движение по эллипсу

Необходимые переменные:
float vr = 90;
int

startTime = 0;
float rx = 10;
float ry = 5;
float dt = (GetTickCount() - startTime)/1000.f;
float x = rx * sin(dt*vr/60.f);
float y = ry * cos(dt*vr/60.f);
DrawRound(x, y, 0.5);
Слайд 44

Равномерное движение по эллипсу

Равномерное движение по эллипсу


Слайд 45

Равномерное движение по криволинейной траектории float dt = (GetTickCount() - startTime)/1000.f;

Равномерное движение по криволинейной траектории


float dt = (GetTickCount()

- startTime)/1000.f;
float x = rx*sin(dt*vx/0.7);
float y = ry*cos(dt*vy/1.2);
DrawRound(x, y, 0.5);
Слайд 46

Равномерное движение по криволинейной траектории

Равномерное движение по криволинейной траектории


Слайд 47

Равномерное движение по криволинейной траектории если убрать очистку цвета glClear( /*GL_COLOR_BUFFER_BIT |*/ GL_DEPTH_BUFFER_BIT );

Равномерное движение по криволинейной траектории

если убрать очистку цвета
glClear( /*GL_COLOR_BUFFER_BIT

|*/ GL_DEPTH_BUFFER_BIT );
Слайд 48

Поворот и изменение размеров float scale = (sin(GetTickCount()/1000.f) + 2)/2.f; glScaled(scale,

Поворот и изменение размеров


float scale = (sin(GetTickCount()/1000.f) +

2)/2.f;
glScaled(scale, scale, 1);
glRotated(GetTickCount()/10.f, 0, 0, 1);
DrawOneKube();
Слайд 49

Поворот и изменение размеров

Поворот и изменение размеров


Слайд 50

Пример движения планет DrawRound(vertex(0, 0, 0), 1, clRed); float angle =

Пример движения планет

DrawRound(vertex(0, 0, 0), 1, clRed);
float angle = GetTickCount()

/ 100.f;
float r = 10.0;
float x = r*sin(angle*M_PI / 180);
float y = r*cos(angle*M_PI / 180);
glPushMatrix();
glTranslated(x, y, 0);
DrawRound(vertex(0, 0, 0), 1, clBlue);
Слайд 51

Пример движения планет angle = GetTickCount() / 30.f; r = 3.0;

Пример движения планет

angle = GetTickCount() / 30.f;
r = 3.0;
x =

r*sin(angle*M_PI / 180); y = r*cos(angle*M_PI / 180);
glTranslated(x, y, 0);
DrawRound(vertex(0, 0, 0), 0.5, clGrey);
glPopMatrix();
angle = GetTickCount() / 70.f;
r = 7.0;
x = r*sin(angle*M_PI / 180); y = r*cos(angle*M_PI / 180);
glTranslated(x, y, 0);
DrawRound(vertex(0, 0, 0), 0.8, clGreen);