Главная » Processing » Создаем polygon soup в Processing

0

В примере Простые объекты в 3D мы узнали, что в Processing есть два основных объекта: параллелепипед и сфера. Несмотря на то, что с ними можно сделать много интересного, вам наверняка захочется сделать свою 3D-фигуру. Здесь мы рассмотрим, как создать гибкую функцию для рисования цилиндра.

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

По аналогии предыдущими примерами, мы начнем с импорта библиотеки OpenGL и установки окна разрешением 640 x 480 пикселей. Дальше мы напишем функцию рисания цилиндра. Код для верха и низа цилиндра будет выглядеть похоже, мы делали что подобное в примере Рисуем произвольные фигуры в предыдущей главе. Код боковой стороны цилиндра будет несколько отличаться.

void cylinder( int numSegments, float h, float r )

{

float angle = 360.0 / (float)numSegments;

// top beginShape();

for ( int i = 0; i < numSegments; i++ ) { float x = cos( radians( angle * i ) ) * r; float y = sin( radians( angle * i ) ) * r; vertex( x, y, -h/2 );

}

endShape( CLOSE );

// side

beginShape( QUAD_STRIP );

for ( int i = 0; i < numSegments + 1; i++ ) { float x = cos( radians( angle * i ) ) * r; float y = sin( radians( angle * i ) ) * r; vertex( x, y, -h/2 );

vertex( x, y, h/2 );

}

endShape();

// bottom beginShape();

for ( int i = 0; i < numSegments; i++ ) { float x = cos( radians( angle * i ) ) * r; float y = sin( radians( angle * i ) ) * r; vertex( x, y, h/2 );

}

endShape( CLOSE );

}

Теперь, когда у нас есть гибкая функция, мы можем вывести на экран несколько цилиндров. Наберите следующий код в функции draw():

background( 255 );

pushMatrix();

translate( width*.3, height*.3, 0 ); rotateY( radians( frameCount ) ); fill( 255, 0, 0 );

cylinder( 30, 100, 50 ); popMatrix();

pushMatrix();

translate( width*.7, height*.5, 0 ); rotateY( radians( frameCount ) ); fill( 255, 255, 0 );

cylinder( 4, 200, 50 ); popMatrix();

pushMatrix();

translate( width*.3, height*.7, 0 ); rotateY( radians( frameCount ) ); fill( 0, 0, 255 );

cylinder( 3, 200, 30 ); popMatrix();

Если вы сделаете все правильно, то в результате увидите то, что изображено на скриншоте. Поэкспериментируйте с параметрами функции cylinder(), чтобы получить разные цилиндры.

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

Polygon soup является, по сути, набором треугольников, расположенных без особого пядка. Объект может выглядеть как реальный трехмерный объект, но если вы попробуете напечатать его, например, на 3D принтере, ничего не получится. Однако это самый простой способ рисовать трехмерные объекты.

Структура нашего цилиндра не сложна. Стороны цилиндра соединаются с верхом и низом и вычислются дважды. В идеале у вас должен быть массив вершин и массив с информией об их соединении.

Единственная принципиально новая идея в этом примере – это параметр QUAD_STRIP в функции beginShape(). В результате вершины будут соединены по-другому. Мы рассмотрим это далее в этой главе в примере Объекты из простых деталей.

Дополнительно

Если вы хотите рисовать 3D-объекты с интересной структурой, можете обратиться в библиотеке Hemesh от Фредерика Ванхотта. Она поможет вам рисовать различные треерные объекты, не занимаясь сложной математикой. Библиотека доступна по адресу http://hemesh.wblut.com/.

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

По теме:

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