В Главе 1, Начинаем программировать в Processing 2, мы рассказывали о системе координат в Processing. В этом примере мы рассмотрим третье измерение и наруем объекты в трехмерном пространстве.
Как это делается
Первое, что нужно сделать – импортировать библиотеку OpenGL. Это позволит вам использовать третье измерение. Вы уже делали это в примере Рисуем кривые в Главе 2, Рисуем текст, кривые и фигуры в 2D. Для импорта библиотеки с помощью кода выберите Sketch | Import Library | OpenGL:
import processing.opengl.*;
Следущее, что мы сделаем – объявим две переменные перед функцией setup() и присвоим им значения. Обратите внимание, что функция size() несколько отличается от той, что была в Главе 2.
float depth; float zSpeed;
void setup()
{
size( 640, 480, OPENGL );
depth = 0;
zSpeed = -1;
}
Первое действие в блоке draw() это обновление значения переменной depth для реализации анимации. Следующий фрагмент кода изменяет эту величину от 0 до 1000 и сбрасывает снова в 0.
void draw()
{
depth += zSpeed;
if ( depth <= -1000 || depth >= 0 ) { zSpeed *= -1;
}
}
Дальше мы очистим фон и нарисуем несколько трехмерных прямоугольников. Они не бут закрашены, мы будем видеть только их грани. Добавьте этот фрагмент кода далее в функцию draw().
background( 255 );
noFill(); stroke( 0 );
for ( int i = 0; i < 10; i++ ) { pushMatrix();
translate( 0, 0, -i * 100 );
rect( 0, 0, width, height ); popMatrix();
}
Следующий фрагмент кода в функции draw() приведен ниже. Мы просто нарисуем четыре прямоугольника, по одному в каждом углу окна. Каждый будет с разным цветом.
pushMatrix();
translate( 0, 0, depth );
fill( 255, 0, 0 );
rect( 0, 0, 80, 80 );
fill( 0, 255, 0 );
rect( width-80, 0, 80, 80 );
fill( 255, 255, 0 );
rect( width-80, height-80, 80, 80 );
fill( 0, 255, 255 );
rect( 0, height-80, 80, 80 ); popMatrix();
Когда вы запустите скетч, вы увидите приближающиеся и отдаляющиеся прямоугольники.
Как это работает
Для работы в трехмерном пространстве Processing нужно добавить к функции size() третий параметр, установив рендерер. В этом случае этим параметром будет OPENGL. Не забудьте импортировать библиотеку OpenGL, имаче скетч не будет работать.
Вы могли заметить, что функции типа rect() или ellipse() в предыдущей главе имеют только координаты x и y. Для рисования этих фигур в трехмерном пространстве координата z не используется. Если вы хотите нарисовать эти двумерные фигуры в треерном пространстве, сместите систему координат с помощью функции translate(). Используя функцию translate() между функциями pushMatrix() и popMatrix(), я вращал графические блоки.
Функция pushMatrix() сохраняет текущее положение системы координат. Она используется в паре с функцией popMatrix(), восстанавливающей положение системы координат, сохраненное с помощью функции pushMatrix().
Функция translate(), когда вы с ней работаете в 3D, имеет три параметра. Это координаты x, y и z новой опорной точки, которую вы будете использовать. Для анимации цветных квадратов я использовал переменную depth для указания z-координаты в функции translate(). Посмотрите на красный квадрат в процессе работы скетча: он всегда нисован в точке (0, 0), но это незаметно, потому что мы смещаем опорную точку по оси z.
Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.