Главная » Processing » Регулируем освещение в Processing

0

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

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

Первое, что нужно сделать, это импортировать библиотеку OpenGL и установить разрешение окна OpenGL равное 640 x 480 пикселей. Перед функцией setup() нам нужно объявить две целочисленные переменные, lightMode и lightDirection, с помощью которых мы будем переключать виды освещения. В функции setup() я присвоил им нулевые значения.

lightMode = 0;

lightDirection = 0;

В первом блоке кода функции draw() мы настроим освещение. Переменная lightMode используется для переключения освещения, а lightDirection устанавливает направление освещения, когда оно направленное.

background( 0 );

switch ( lightMode ) { case 0:

noLights(); break;

case 1: lights(); break;

case 2:

if ( lightDirection == 0 ) {

directionalLight( 255, 128, 0, 0, -1, 0 ); // UP

} else if ( lightDirection == 1 ) { directionalLight( 0, 255, 0, 1, 0, 0 ); // RIGHT

} else if ( lightDirection == 2 ) { directionalLight( 255, 0, 255, 0, 1, 0 ); // DOWN

} else if ( lightDirection == 3 ) { directionalLight( 0, 255, 255, -1, 0, 0 ); // LEFT

}

break; case 3:

ambientLight( 0, 255, 255 ); break;

case 4:

pointLight( 255, 255, 0, 100, height*0.3, 100 ); break;

case 5:

spotLight( 128, 255, 128, 800, 20, 300, -1, .25, 0, PI, 2 );

break; default:

noLights();

}

После установки освещения можно заняться трехмерной геометрией. Я нарисовал куб и сферу в одной и той же точке и использовал функции rotateY() и rotateX() для их вращения.

pushMatrix();

translate( width/2, height/2, 0 );

pushMatrix();

rotateY( radians( frameCount ) ); fill( 255 );

noStroke(); sphere( 100 ); popMatrix();

pushMatrix();

rotateZ( radians( frameCount ) ); rotateX( radians( frameCount/2 ) ); fill( 255 );

noStroke(); box( 150 ); popMatrix();

popMatrix();

И наконец нам нужно сделать что-то вроде интерфейса для переключения видов освещения. Это выполнено в следующем фрагменте кода. Чтобы разобраться, как он работает, вернитесь к примеру Взаимодействие с клавиатурой в Главе 1, Начинаем программировать в Processing 2.

void keyPressed()

{

switch ( key ) { case ‘n':

lightMode = 0; // no lights break;

case ‘l':

lightMode = 1; // lights break;

case ‘d':

lightMode = 2; // directional light break;

case ‘a':

lightMode = 3; // ambient light break;

case ‘p':

lightMode = 4; // point light break;

case ‘s':

lightMode = 5; // spot light break;

}

if ( key == CODED ) { switch ( keyCode ) {

case UP: lightDirection = 0; break;

case RIGHT: lightDirection = 1; break;

case DOWN: lightDirection = 2; break;

case LEFT: lightDirection = 3; break;

}

}

}

Когда закончите ввод программы, вы сможете переключать режимы освещения клавишами N, L, D, A, P и S. Клавиши-стрелки будут изменять направление освещения, когда будет включено направленное.

Как это работает

Самая легкая функция – это lights(). Она просто включает освещение, установленное в Processing по умолчанию. Для отключения освещения есть функция noLights(). Первое, что вы увидите, запустив скетч – это функцию noLights().

Для направленного освещения есть функция directionalLight(). Источник освещения располагается удаленно и освещает все элементы композиции. Он работает так же, как солнце. Первые три параметра – это значения r, g и b источника освещения. Последние три параметра используются для направления освещения вдоль осей x, y и z в вашей трехмерной композиции. Для этих параметров используются величины в диапазоне от -1 до 1.

Функция ambientLight() устанавливает рассеянное освещение вашей композиции. Это освещение идет отовсюду. Обычно оно используется в сочетании с другими видами освещения. Вы можете указать компоненты r, g и b цвета освещения. Метоположение источника рассеянного освещение в трехмерном пространстве указывается в качестве последних трех параметров.

Функция pointLight() похожа на лампочку. Она светит во всех направлениях. Первые три параметра нужны для установки цвета, а вторые три – координат x, y и z местопожения источника в трехмерном пространстве.

Наверное самая сложная функция это spotLight(). Вам придется ввести одиннадцать параметров. Первая тройка параметров устанавливает цвет, вторая – координаты x, y и z источника. Параметры 7, 8 и 9 устанавливают направление луча относительно осей x, y и z, так же, как в функции directionalLight(). Десятый параметр – это угол светового конуса. Обратите внимание, что он указывается в радианах. Последний параметр устанаивает плотность.

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

По теме:

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