Главная » Processing » Комбинируем 2D и 3D объекты в Processing

0

Иногда поверх вашей трехмерной композиции вам может понадобиться вывести двухмерный объект. В этом примере мы рассмотрим, как это делается. Это удобно, когда нужно написать текст или сделать интерфейс поверх всех объектов.

Как это делается

Первое, что нужно сделать, установить окно OpenGL разрешением 640 x 480 пикселей. Вы знаете это по предыдущим примерам. Также нужно объявить вещественную пеменную n. Мы используем эту переменную для вычисления шума Перлина и анимации размера кубов в нашем 3D-пространстве. Эта часть скетча выглядит так:

import processing.opengl.*; float n;

void setup()

{

size( 640, 480, OPENGL ); n = 0.0f;

}

Следующее – это композиция из кубов. Значение переменной n увеличивается на 0.01 в каждом кадре, поэтому для каждого куда значение шума будет отличаться. Наберите этот код в функции draw() и посмотрите, что получится.

hint( ENABLE_DEPTH_TEST ); n += 0.01;

background( 255 ); lights();

noStroke();

fill( 255, 128, 0 );

pushMatrix();

for ( int i = 0; i < 17; i++ ) { for ( int j = 0; j < 13; j++ ) {

pushMatrix();

fill( i * 15, 0, j * 19 );

translate( i * 40, j * 40 );

rotateY( radians( i * 10 + frameCount ) ); rotateZ( radians( i * 10 + frameCount ) ); box( noise( i, j, n ) * 40 );

popMatrix();

}

}

popMatrix();

В последнем фрагменте кода в функции draw() мы нарисуем несколько прямоугольников. Прямоугольники нарисованы на одной координате z. Первый будет пересекать кубы, а второй будет нарисован поверх всех объектов, заслоняя их собой.

noLights(); fill( 0 );

stroke( 0 );

rect( 320, 40, 200, 200 );

hint( DISABLE_DEPTH_TEST );

fill( 255 );

rect( 320, 240, 200, 200 );

Запуск скетча даст вам изображение, похожее на этот скриншот. Вы, наверное, уже догадались, какие строки кода используеются для вывода белого прямоугольника поверх всего.

Функция hint() может быть использована для реализации различных трюков в текущем рендерере. Чаще всего она используется для включения и отключения свойств определенного рендерера. Я ввел параметр ENABLE_DEPTH_TEST в начале функции draw() и в результате при выводе на экран композиции из кубов и черного квадрата включен буфер z. Параметр DISABLE_ DEPTH_TEST выключает буфер z, что делает возможным нарисовать поверх всех объектов белый квадрат.

Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.

По теме:

  • Комментарии