Компьютерная графика в Processing, часть 5. Анимация
1. Компьютерная графика
Анимация
Jordi Linares i Pellicer
Escola Politècnica Superior d’Alcoi
Dep. de Sistemes Informàtics i Computació
jlinares@dsic.upv.es
http://www.dsic.upv.es/~jlinares
2. Анимация
•
•
•
•
•
В processing очень легко делать анимацию через функцию
draw()
Если мы определим в приложении функцию draw(),
она будет постоянно запускаться в бесконечном цикле
(в отдельном потоке))
Изначально для draw() частота повторения равняется
60 раз в секунду
Это поведение можно изменить функцией frameRate()
frameRate() лишь задаёт цель, но будет ли она
достигнута, зависит от возможностей компьютера —
сможет ли он вызывать draw() с указанной частотой.
3. Анимация
//
//
//
//
Классический пример:
прыгающий мячик
Если хотим работать с анимацией, мы
должны определить функции setup() и draw()
// Местоположение
int px, py;
// Скорость
int vx, vy;
// Диаметр мяча
int diametre = 20;
void setup()
{
size(600, 300);
fill(255);
noStroke();
// Изначальное
// местоположение мяча
px = width/4;
py = height/2;
// Начальная скорость
vx = vy = 1;
}
// Рисование
void draw()
{
background(0);
// Обнаружение столкновений
// и прыгание
if (px + diametre/2 > width - 1 ||
px - diametre/2 < 0)
vx *= -1;
if (py + diametre/2 > height - 1 ||
py - diametre/2 < 0)
vy *= -1;
// Обновление местоположений
px += vx;
py += vy;
// Рисование мяча
ellipse(px, py, diametre, diametre);
}
4. Анимация
// Эффект следа...
// Заменяем background(0)
// на следующее:
...
void draw()
{
// заполняем всё окно
// цветом RGB (0, 0, 0) и
// прозрачностью 20
fill(0, 20);
rect(0, 0, width, height);
// Заполняем 255, чтобы нарисовать
// мяч
fill(255);
...
5. Практика 5-1
•
•
•
Измените предыдущую программу так, чтобы рисовать
n прыгающих мячей. Используйте массивы, чтобы
изменять скорость и местоположение каждого мяча
Изначальные местоположения должны быть случайны,
с учётом диаметра мячей и размера окна
Скорости тоже должны быть случайны, со значениями
от -4 до 4 (не включая нуля)
9. Анимация
•
•
Чтобы поведение было более реалистичным, нужно
учитывать торможение, связанное с проходом мяча
через жидкость (атмосферу)
Этого эффекта можно достигнуть простым уменьшением
скорости, как в этом примере:
// Обновляем местоположение
vy += gravity;
vy *= 0.98; // Это - новое !
px += vx;
py += vy;
10. Анимация
// Постоянно вращающийся эллипс
float angle = 0.0;
void setup()
{
size(400, 400);
}
// Внимание!
// draw() сбрасывает матрицу
// моделирования до единичной
void draw()
{
fill(0, 20);
noStroke();
rect(0, 0, width, height);
noFill();
stroke(255);
// Вращаем вокруг центра окна,
// так что нужно
// сделать там центр (0,0).
// Мы должны учитывать
// порядок операций
// (снизу вверх)
translate(width/2, height/2);
rotate(angle+=0.1);
translate(-width/2, -height/2);
ellipse(width/2, height/2, 100, 300);
}