Методические рекомендации к практическому заданию по теме:
Объемные фигуры
Цель: Изучение объемных фигур и принципов программирования с ними в среде разработки Processing
Задачи:
1) Подключить режим 3D в программе.
2) Нарисовать объемные фигуры.
3) Переместить объемные фигуры.
4) Создать текущую матрицу преобразования для каждой объемной фигуры.
5) Задать вращение объемных фигур.
6) Загрузить программу Проверить работу приложения.
Описание:
1) Любой объем подразумевает три координаты: ширину, высоту и глубину. Но на сегодняшний день экраны плоские и обладают только шириной и высотой. Создавая для них объемные фигуры всегда подразумевают виртуальный объем.
В любом случае в начале в размерах экрана необходимо задать размеры уже не в двух, а в трех размерностях:
void setup(){
size(displayWidth, displayHeight, P3D)
}
2) В Processing существуют две базовые объемные фигуры: параллелепипед и шар. В их параметрах необходимо задать размеры. Для шара – один (радиус), для параллелепипеда – один (для куба) или три (для неровного параллелепипеда).
void draw() {
box(50);
box(20, 30, 50);
sphere(20);
}
3) В результате все фигуры будут нарисованы в левом верхнем углу экрана, т.к. месторасположение, в отличие от плоских фигур, для них не задаются. А начало координат находится в Processing именно там. Поэтому необходим дополнительный инструмент для переноса уже не объекта, а начала координат в другое место экрана. Добавим такой инструмент:
void draw() {
translate(Width/2, Height/2);
box(50);
translate(0,50,10);
box(20, 30, 50);
translate(-Width/2, -Height/2, -10);
sphere(20);
}
Необходимо заметить, что, во-первых, все последующие translate суммируются с предыдущими (поэтому для переноса назад нужно использовать отрицательные параметры), во-вторых, можно переносить как по двум, так и по трем координатам.
Кроме этого команды переноса будут работать и для ранее пройденных плоских фигур, если они будут прописаны после них.
4) Для того, чтобы команда переноса работала не для всех объектов, а только для конкретных, можно создать текущую матрицу преобразования. Создадим их для каждой фигуры и скорректируем координаты для переноса:
void draw() {
pushMatrix();
translate(Width/2, Height/2);
box(50);
popMatrix();
pushMatrix();
translate(20,50,10);
box(20, 30, 50);
popMatrix();
pushMatrix();
translate(20,100);
sphere(20);
popMatrix();
}
Команды для создания текущей матрицы преобразования всегда пишутся парно: pushMatrix – в начале, popMatrix – в конце подблока.
5) Чтобы четче увидеть объемность куба его необходимо немного развернуть. Для этого можно использовать команды вращения вокруг осей:
void draw() {
pushMatrix();
translate(Width/2, Height/2);
rotateX(gradians(90));
box(50);
popMatrix();
pushMatrix();
translate(20,50,10);
rotateY(gradians(frameCount));
box(20, 30, 50);
popMatrix();
pushMatrix();
rotateZ(gradians(frameCount));
translate(20,100);
sphere(20);
popMatrix();
}
Обратите внимание на разницу работы при разном порядке написания translate и rotate.
Более подробно о командах и переменных можно прочитать в теме 5.
6) Запустите программу на компьютере. Проверьте правильность работы. Сохраните программу. Загрузите программу на смартфон, так же как в методических рекомендациях к практическому заданию по теме 1.
|