Танцюючі частинки в Processing

У цьому прикладі ми створимо скетч з фігурами, що реагують на звук Цей скетч буде для вас хорошим стартом, якщо ви хочете створювати програми для перформансів Він схожий на приклад з БПФ, але картинка буде цікавішою

Як це робиться

Почнемо з імпорту бібліотеки minim, оголошення обєкта Minim, обєкта AudioPlayer та обєкта FFT Також нам потрібен масив для зберігання обєктів Particle і змінна типу boolean для включення ефекту ісчезанія або відключення його шляхом оновлення кольору фону в кожному кадрі Нижче наведена перша частина коду скетчу

import ddfminim*

import ddfminimsignals* import ddfminimanalysis* import ddfminimeffects*

Minim minim AudioPlayer player FFT fft

Particle[] particles boolean fade = false

void setup()

{

size( 640, 480 )

smooth() background( 0 )

colorMode( HSB, 360, 100, 100, 100 )

minim = new Minim( this )

player = minimloadFile(&quotsongmp3&quot, 512 ) playerloop()

fft = new FFT( playerbufferSize(), playersampleRate() ) particles = new Particle[ fftspecSize() ]

for ( int i = 0 i &lt fftspecSize() i++ ) {

particles[i] = new Particle( i )

}

}

Функція draw () буде відрізнятися від прикладу з ШПФ Для перемикання кольору в режимі RGB я використовував комбінацію функцій pushStyle () і popStyle (), це дозволяє з легкістю включати чорний фон або прозорий чорний прямокутник у разі вибору ефекту ісчезанія Для роботи зі спектром частот, оновлення та відображення фігур застосований цикл for

void draw()

{

pushStyle() colorMode( RGB, 255 ) if ( fade ) {

noStroke() fill( 0, 8 )

rect( 0, 0, width, height )

} else { background( 0 )

}

popStyle()

fftforward( playermix )

for ( int i = 0 i &lt fftspecSize() – 1 i++ ) { particles[i]update(fftgetBand(i), playermixget( i*2 )) particles[i]render()

}

}

Далі ми додамо невеликий інтерфейс для включення ефекту ісчезанія Ми зробимо це за допомогою функції keyPressed () І, як завжди з бібліотекою Minim, потрібно додати функцію stop ()

void keyPressed()

{

if ( key == f ) { fade = fade

}

}

void stop()

{

playerclose() minimstop()

superstop()

}

Потім напишемо клас Particle Це дозволить відстежувати місце розташування, радіус і колір кожної фігури Увімкніть нову вкладку за допомогою поєднання Cmd + Shift + N на Mac OS X або Ctrl + Shift + N на Windows або Linux і додайте наступний код

class Particle

{

PVector loc PVector vel

float radius float h float s float b

Particle( int id )

{

loc = new PVector( map( id, 0, fftspecSize(), 0, width ), height/2 )

vel = new PVector( random( -1, 1 ), random( -1, 1 ) )

h = map( id, 0, fftspecSize(), 0, 360 )

s = 100

b = 100

}

void update( float _r, float _b )

{

locadd( vel )

if ( locx &lt 0 || locx &gt width ) { velx *= -1

}

if ( locy &lt 0 || locy &gt height ) { vely *= -1

}

radius = _r

radius = constrain( radius, 2, 100 )

b = map( _b, -1, 1, 0, 100 )

}

void render()

{

stroke( h, s, b, 50 )

fill( h, s, b, 20 )

ellipse( locx, locy, radius*2, radius*2 )

}

}

Коли ви запустите скетч, ви побачите частки, що рухаються по екрану Кожна частка реагує на певну частоту спектра Натисканням клавіші F ви можете включити / відключити ефект ісчезанія

Як це працює

Ви дійшли до цієї частини книги, тому код основного скетчу повинен бути вам зрозумілий Клас Particle включає кілька нових речей, тому ми розглянемо їх подроее Перше, що ви бачите перед конструктором – Змінні для обєкта Particle Нам потрібен один обєкт PVector для місця розташування і ще один для швидкості частинки Це буде використовуватися для анімації часток Дізнатися більше про класі PVector можна по адресою: http:// processingorg / reference / PVectorhtml Також нам потрібно кілька речових змінних для тону, насиченості і яскравості кольору частинки і ще одна для радіусу

PVector loc PVector vel

float radius float h float s float b

Конструктор класу Particle має ціле число як параметр Воно буде використовуватися для установки початкового положення і кольору частинки Для створення вектора швидкості я використовував випадкові числа в діапазоні від -1 до +1

Particle( int id )

{

loc = new PVector( map( id, 0, fftspecSize(), 0, width ), height/2 )

vel = new PVector( random( -1, 1 ), random( -1, 1 ) )

h = map( id, 0, fftspecSize(), 0, 360 )

s = 100

b = 100

}

Метод update () класу Particle має два параметри, один для радіусу і один для яскравості частинки Вони проходитимуть через обєкт в процесі роботи функції draw () нашого основного скетчу Перша дія в методі update () це додавання вектора швидкості до вектора місця розташування Після цього проводиться швидка перевірка, чи перебуває частинка в межах вікна скетчу Якщо вона вийшла за межі екрану, ми змінимо компоненти вектора швидкості так, щоб вона зіткнулася з кордоном вікна Нарешті, в соотстветствіі з величинами вихідних параметрів методу змінюються радіус і яскравість

void update( float _r, float _b )

{

locadd( vel )

if ( locx &lt 0 || locx &gt width ) {

velx *= -1

}

if ( locy &lt 0 || locy &gt height ) { vely *= -1

}

radius = _r

radius = constrain( radius, 2, 100 )

b = map( _b, -1, 1, 0, 100 )

}

Частинки виводяться на екран за допомогою методу render () Він встановлює колір штриха і заливки частинки і малює еліпс на основі розрахованого радіусу частинки

void render()

{

stroke( h, s, b, 50 )

fill( h, s, b, 20 )

ellipse( locx, locy, radius*2, radius*2 )

}

Джерело: Ян Вантомм, Processing 2: креативне програмування, переклад з англійської Олександри Мішутіної, Published by Packt Publishing Ltd, 2012, BIRMINGHAM – MUMBAI

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*