SlideShare a Scribd company logo
1 of 19
Download to read offline
Компьютерная графика
3D в processing
Jordi Linares i Pellicer
Escola Politècnica Superior d’Alcoi
Dep. de Sistemes Informàtics i Computació
jlinares@dsic.upv.es
http://www.dsic.upv.es/~jlinares
3D в processing
•
•
•
•
•
•

В processing есть 2 режима отображения 3D: P3D и OPENGL
P3D основано на программной реализации, OPENGL
выполняется через OpenGL («железо»). За несколькими
исключениями, в них одни и те же функции и примитивы
2D примитивы и функции можно использовать в 3D
(возможно, с несколькими исключениями)
Некоторые из примитивов, такие как линии (line),
точки (point), кривые и фигуры (примитив vertex), могут
задаваться через 3 координаты: x, y, z
Остальные 2D примитивы тоже можно использовать (с
z=0 по умолчанию)
Функции stroke, fill, text и image (текстуры) тоже можно
использовать в 3D
3D в processing
Геометрические преобразования в 3D

Перенос

Вращение вокруг x

Вращение вокруг y
Масштаб
Вращение вокруг z
3D в processing
Геометрические преобразования в 3D
Перенос
translate(tx, ty, tz)
Масштабирование
scale(sx, sy, sz)
Вращение вокруг оси
rotateX(), rotateY(), rotateZ()
3D в processing
•
•
•

По умолчанию используется перспективная проекция
(0,0,0) находится в верхнем левом углу
-z уходит вдаль
-z
(0,0,0)
yx+z
3D в processing
// Эллипс, вращающийся
// вокруг оси y
float ang = 0.0;
void setup()
{
size(400, 400, P3D);
stroke(255, 0, 0);
noFill();
}
void draw()
{
background(0);
// Рисование с центром в
// (0,0,0)
translate(width/2, height/2);
rotateY(ang += 0.1);
ellipse(0, 0, 300, 200);
}
3D в processing
box(width, height, depth)

•

Рисует кубоид, правильную призму, с центром в (0,0,0)
с шириной (x), высотой (y) и глубиной (z) в качестве
аргументов
sphere(radius)

•
•

Рисует сферу с центром в (0,0,0) с заданным радиусом
Уровень детализации, с которой рисуется сфера, можно
настроить через функцию sphereDetail(n), где n
означает, что вершины будут порождаться через каждые
360º/n (по умолчанию, n = 30)
3D в processing
// Куб, вращающийся
// вокруг трёх осей
// Версия с каркасом
void setup()
{
size(400, 400, P3D);
stroke(255, 0, 0);
noFill();
}
void draw()
{
background(0);
// Рисование с центром
// в (0,0,0)
translate(width/2, height/2);
rotateX(frameCount*PI/60.0);
rotateY(frameCount*PI/120.0);
rotateZ(frameCount*PI/180.0);
box(200, 200, 200);
}
3D в processing
// Куб, вращающийся
// вокруг трёх осей
// Версия с гранями
void setup()
{
size(400, 400, P3D);
fill(255, 0, 0);
}
void draw()
{
background(0);
// Рисование с центром
// в (0,0,0)
translate(width/2, height/2);
rotateX(frameCount*PI/60.0);
rotateY(frameCount*PI/120.0);
rotateZ(frameCount*PI/180.0);
box(200, 200, 200);
}
3D в processing
// Куб, вращающийся
// вокруг трёх осей
// Версия с простым освещением
void setup()
{
size(400, 400, P3D);
fill(255, 0, 0);
noStroke();
}
void draw()
{
background(0);
// Простое освещение
lights();
// Рисование с центром
// в (0,0,0)
translate(width/2, height/2);
rotateX(frameCount*PI/60.0);
rotateY(frameCount*PI/120.0);
rotateZ(frameCount*PI/180.0);
box(200, 200, 200);
}
3D в processing
// Интерактивный куб
float rotX = 0.0, rotY = 0.0;
int lastX, lastY;
float distX = 0.0, distY = 0.0;
void setup(){
size(400, 400, P3D);
noStroke();
fill(255, 0, 0);
}
void draw(){
background(0);
lights();
translate(width/2, height/2);
rotateX(rotX + distY);
rotateY(rotY + distX);
box(200, 200, 200);
}

void mousePressed()
{
lastX = mouseX;
lastY = mouseY;
}
void mouseDragged()
{
distX = radians(mouseX - lastX);
distY = radians(lastY - mouseY);
}
void mouseReleased()
{
rotX += distY;
rotY += distX;
distX = distY = 0.0;
}
Практика 7-1
•
•
•
•

Измените предыдущую программу так, чтобы было
возможно увеличение, путём перемещения куба по оси z
Для этого необходимо добавить компонент z в операцию
переноса
Изначально эта координата будет 0 и будет изменяться от
0 до -500 по шагам в 10
Используйте клавиши UP и DOWN, чтобы поймать событие
keyPressed() и изменить увеличение
3D в processing
// Теперь сделаем через OpenGL
// Этот import - обязателен
import processing.opengl.*;
float rotX = 0.0, rotY = 0.0;
int lastX, lastY;
float distX = 0.0, distY = 0.0;
// Текстура
PImage foto;
void setup(){
size(400, 400, OPENGL);
noStroke();
foto = loadImage("foto.jpg");
// Мы хотим работать с текстурой в
// координатах от (0,0) до (1,1)
textureMode(NORMALIZED);
}
void draw(){
background(0);
translate(width/2, height/2);
rotateX(rotX + distY);
rotateY(rotY + distX);
// Хотим куб 200 x 200 x 200
// Рисуем от -1 до 1
scale(100, 100, 100);
beginShape(QUADS);
texture(foto);

//
//
//
//
//
//

Мы задаём вершины каждого
лица на кубе.
Последние два значения координаты текстуры,
которая соответствует
вершине

// +Z "передняя" грань
vertex(-1, -1, 1, 0, 0);
vertex( 1, -1, 1, 1, 0);
vertex( 1, 1, 1, 1, 1);
vertex(-1, 1, 1, 0, 1);
// -Z "задняя" грань
vertex( 1, -1, -1, 0, 0);
vertex(-1, -1, -1, 1, 0);
vertex(-1, 1, -1, 1, 1);
vertex( 1, 1, -1, 0, 1);
// +Y "нижняя" грань
vertex(-1, 1, 1, 0, 0);
vertex( 1, 1, 1, 1, 0);
vertex( 1, 1, -1, 1, 1);
vertex(-1, 1, -1, 0, 1);
// -Y "верхняя" грань
vertex(-1, -1, -1, 0, 0);
vertex( 1, -1, -1, 1, 0);
vertex( 1, -1, 1, 1, 1);
vertex(-1, -1, 1, 0, 1);
// +X "правая" грань
vertex( 1, -1, 1, 0, 0);
vertex( 1, -1, -1, 1, 0);
vertex( 1, 1, -1, 1, 1);
vertex( 1, 1, 1, 0, 1);

// -X "левая" грань
vertex(-1, -1, -1, 0, 0);
vertex(-1, -1, 1, 1, 0);
vertex(-1, 1, 1, 1, 1);
vertex(-1, 1, -1, 0, 1);
endShape();
}
void mousePressed()
{
lastX = mouseX;
lastY = mouseY;
}
void mouseDragged()
{
distX = radians(mouseX - lastX);
distY = radians(lastY - mouseY);
}
void mouseReleased()
{
rotX += distY;
rotY += distX;
distX = distY = 0.0;
}
3D в processing
3D в processing
import processing.opengl.*;
// Рисование функции в 3D
float rotX = 0.0, rotY = 0.0;
int lastX, lastY;
float distX = 0.0, distY = 0.0;
// Шаги функции
int steps = 50;
// Масштабирование по оси z
float scaleZ = 200.0;
// Увеличение по оси z
float zoomZ = -300.0;
// Размер графика
float gX = 500.0, gY = 500.0;
void setup()
{
size(500, 500, OPENGL);
noFill();
}
float function(float x, float y)
{
return x*x*x + y*y*y;
}

void draw()
{
background(0);
// Поместим результат в центр окна
translate(gX/2, gY/2, zoomZ);
// Вращение
rotateY(rotY + distX);
rotateX(rotX + distY);
// Перенос центра в (0, 0);
translate(-gX/2, -gY/2);
// Функция покрывает
// 400 x 400 x scaleZ
scale(gX, gY, scaleZ);
// Рисование функции
stroke(255);
drawFunction();
// Рисование осей
stroke(255, 0, 0);
line(0,0,0,2000,0,0);
stroke(0,255,0);
line(0,0,0,0,2000,0);
stroke(0,0,255);
line(0,0,0,0,0,2000);
}

void drawFunction()
{
float x, y, z;
int i = 0, j = 0;
float in_steps = 1.0 / steps;
float[][] matrix = new float[steps+1][steps+1];
for (y = 0.0, j = 0; y <= 1.0; y+=in_steps, j++)
for (x = 0.0, i = 0; x <= 1.0; x+=in_steps, i++)
matrix[i][j] = function(x, y);
for (j = 0, y = 0.0; j < steps; j++, y+=in_steps) {
beginShape(QUAD_STRIP);
for (i = 0, x = 0.0; i <= steps; i++, x+=in_steps) {
vertex(x, y, matrix[i][j]);
vertex(x, y + in_steps, matrix[i][j+1]);
}
endShape();
}
}
void mousePressed()
{
lastX = mouseX;
lastY = mouseY;
}
void mouseDragged()
{
distX = radians(mouseX - lastX);
distY = radians(lastY - mouseY);
}
void mouseReleased()
{
rotX += distY;
rotY += distX;
distX = distY = 0.0;
}
3D в processing
Практика 7-2
•

Измените предыдущую программу, чтобы нарисовать
поверхность в «твёрдом» режиме с использованием
простой модели освещения (используйте lights()
и fill())
Практика 7-3
•
•

Измените предыдущую программу, чтобы нарисовать
поверхность с двухцветным градиентом (например,
красный для малых значений z, а жёлтый для больших)
Для этого используйте вызов fill() перед каждым
вызовом vertex()
Практика 7-4
•

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

More Related Content

What's hot

Instruction s-max
Instruction s-maxInstruction s-max
Instruction s-maxrukford1
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Презентація:Поняття алгоритму. Виконавці алгоритмів.
Презентація:Поняття алгоритму. Виконавці алгоритмів.Презентація:Поняття алгоритму. Виконавці алгоритмів.
Презентація:Поняття алгоритму. Виконавці алгоритмів.sveta7940
 
Народний тлумачний словничок
Народний тлумачний словничок Народний тлумачний словничок
Народний тлумачний словничок Nazar Levetskiy
 
Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...
Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...
Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...sveta7940
 
Презентація:Системи рівнянь другого степеня з двома змінними
Презентація:Системи рівнянь другого степеня з двома зміннимиПрезентація:Системи рівнянь другого степеня з двома змінними
Презентація:Системи рівнянь другого степеня з двома зміннимиsveta7940
 
презентація 1. проектна технологія
презентація 1. проектна технологіяпрезентація 1. проектна технологія
презентація 1. проектна технологіяliliya2896
 
2 um b_2019_2
2 um b_2019_22 um b_2019_2
2 um b_2019_24book
 
Квадратична функція
Квадратична функція Квадратична функція
Квадратична функція Anetico
 
Апостроф
АпострофАпостроф
АпострофSmailik2008
 
памятники харькова
памятники харьковапамятники харькова
памятники харьковаMaryna Zaharova
 
Основні поняття підприємництва.pptx
Основні поняття підприємництва.pptxОсновні поняття підприємництва.pptx
Основні поняття підприємництва.pptxssuser806f5c
 
етапи проведення наукового дослідження
етапи проведення наукового дослідження етапи проведення наукового дослідження
етапи проведення наукового дослідження Школа №7 Миргород
 
вся брошура Corel draw 2014
вся брошура Corel draw 2014вся брошура Corel draw 2014
вся брошура Corel draw 2014oleg1235
 
Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)sveta7940
 
десяткові дроби (математичний диктант)
десяткові дроби (математичний диктант)десяткові дроби (математичний диктант)
десяткові дроби (математичний диктант)Гергель Ольга
 

What's hot (20)

k23_044
k23_044k23_044
k23_044
 
Instruction s-max
Instruction s-maxInstruction s-max
Instruction s-max
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графе
 
Презентація:Поняття алгоритму. Виконавці алгоритмів.
Презентація:Поняття алгоритму. Виконавці алгоритмів.Презентація:Поняття алгоритму. Виконавці алгоритмів.
Презентація:Поняття алгоритму. Виконавці алгоритмів.
 
Народний тлумачний словничок
Народний тлумачний словничок Народний тлумачний словничок
Народний тлумачний словничок
 
Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...
Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...
Презентація:Розв"язування квадратних рівнянь та задач за допомогою квадратних...
 
Презентація:Системи рівнянь другого степеня з двома змінними
Презентація:Системи рівнянь другого степеня з двома зміннимиПрезентація:Системи рівнянь другого степеня з двома змінними
Презентація:Системи рівнянь другого степеня з двома змінними
 
природні зони африки
природні зони африкиприродні зони африки
природні зони африки
 
5 клас урок 8
5 клас урок 85 клас урок 8
5 клас урок 8
 
презентація 1. проектна технологія
презентація 1. проектна технологіяпрезентація 1. проектна технологія
презентація 1. проектна технологія
 
2 um b_2019_2
2 um b_2019_22 um b_2019_2
2 um b_2019_2
 
Квадратична функція
Квадратична функція Квадратична функція
Квадратична функція
 
Апостроф
АпострофАпостроф
Апостроф
 
памятники харькова
памятники харьковапамятники харькова
памятники харькова
 
Основні поняття підприємництва.pptx
Основні поняття підприємництва.pptxОсновні поняття підприємництва.pptx
Основні поняття підприємництва.pptx
 
3 клас урок 14 що таке гіперпосилання.
3 клас урок 14 що таке гіперпосилання.3 клас урок 14 що таке гіперпосилання.
3 клас урок 14 що таке гіперпосилання.
 
етапи проведення наукового дослідження
етапи проведення наукового дослідження етапи проведення наукового дослідження
етапи проведення наукового дослідження
 
вся брошура Corel draw 2014
вся брошура Corel draw 2014вся брошура Corel draw 2014
вся брошура Corel draw 2014
 
Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)Презентація:Множення і ділення раціональних чисел (повторення)
Презентація:Множення і ділення раціональних чисел (повторення)
 
десяткові дроби (математичний диктант)
десяткові дроби (математичний диктант)десяткові дроби (математичний диктант)
десяткові дроби (математичний диктант)
 

Viewers also liked

Компьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текстКомпьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текстTatiana Volkova
 
Компьютерная графика в Processing, часть 4. Преобразования на плоскости
Компьютерная графика в Processing, часть 4. Преобразования на плоскостиКомпьютерная графика в Processing, часть 4. Преобразования на плоскости
Компьютерная графика в Processing, часть 4. Преобразования на плоскостиTatiana Volkova
 
Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...
Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...
Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...Tatiana Volkova
 
Компьютерная графика в Processing, часть 5. Анимация
Компьютерная графика в Processing, часть 5. АнимацияКомпьютерная графика в Processing, часть 5. Анимация
Компьютерная графика в Processing, часть 5. АнимацияTatiana Volkova
 
Компьютерная графика в Processing, часть 6. Взаимодействие.
Компьютерная графика в Processing, часть 6. Взаимодействие.Компьютерная графика в Processing, часть 6. Взаимодействие.
Компьютерная графика в Processing, часть 6. Взаимодействие.Tatiana Volkova
 
Project planning forms_0210revised
Project planning forms_0210revisedProject planning forms_0210revised
Project planning forms_0210revisedJennyhpn
 
Կայքի հաջողության մի քանի քայլեր
Կայքի հաջողության մի քանի քայլերԿայքի հաջողության մի քանի քայլեր
Կայքի հաջողության մի քանի քայլերSona Asryan
 
Efficient Query Answering against Dynamic RDF Databases
Efficient Query Answering against Dynamic RDF DatabasesEfficient Query Answering against Dynamic RDF Databases
Efficient Query Answering against Dynamic RDF DatabasesAlexandra Roatiș
 
一公分鉛筆的故事
一公分鉛筆的故事一公分鉛筆的故事
一公分鉛筆的故事t067
 
Unlocking Mobile Feedback Webinar - June 2016
Unlocking Mobile Feedback Webinar - June 2016Unlocking Mobile Feedback Webinar - June 2016
Unlocking Mobile Feedback Webinar - June 2016Netpulse
 
Newsbrands and social media
Newsbrands and social media Newsbrands and social media
Newsbrands and social media Newsworks
 
Presentación sobre curso de asignatura
Presentación sobre curso de asignaturaPresentación sobre curso de asignatura
Presentación sobre curso de asignaturapimela12
 
Universidad nacional de chimborazo katty
Universidad nacional de chimborazo kattyUniversidad nacional de chimborazo katty
Universidad nacional de chimborazo kattyVivitarojas
 
Redaccion de textos
Redaccion de textosRedaccion de textos
Redaccion de textoskevin cruz
 
Evaluation question 03
Evaluation question 03Evaluation question 03
Evaluation question 0307HH
 
今後のスマートフォンの在り方に関するユーザー
今後のスマートフォンの在り方に関するユーザー今後のスマートフォンの在り方に関するユーザー
今後のスマートフォンの在り方に関するユーザーKenta Funaki
 

Viewers also liked (18)

Компьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текстКомпьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текст
 
Компьютерная графика в Processing, часть 4. Преобразования на плоскости
Компьютерная графика в Processing, часть 4. Преобразования на плоскостиКомпьютерная графика в Processing, часть 4. Преобразования на плоскости
Компьютерная графика в Processing, часть 4. Преобразования на плоскости
 
Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...
Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...
Arduino и бионика (Bionic Arduino). Часть 4. ШИМ, сервомашинки, I2C, акселеро...
 
Компьютерная графика в Processing, часть 5. Анимация
Компьютерная графика в Processing, часть 5. АнимацияКомпьютерная графика в Processing, часть 5. Анимация
Компьютерная графика в Processing, часть 5. Анимация
 
Компьютерная графика в Processing, часть 6. Взаимодействие.
Компьютерная графика в Processing, часть 6. Взаимодействие.Компьютерная графика в Processing, часть 6. Взаимодействие.
Компьютерная графика в Processing, часть 6. Взаимодействие.
 
Project planning forms_0210revised
Project planning forms_0210revisedProject planning forms_0210revised
Project planning forms_0210revised
 
Կայքի հաջողության մի քանի քայլեր
Կայքի հաջողության մի քանի քայլերԿայքի հաջողության մի քանի քայլեր
Կայքի հաջողության մի քանի քայլեր
 
Efficient Query Answering against Dynamic RDF Databases
Efficient Query Answering against Dynamic RDF DatabasesEfficient Query Answering against Dynamic RDF Databases
Efficient Query Answering against Dynamic RDF Databases
 
一公分鉛筆的故事
一公分鉛筆的故事一公分鉛筆的故事
一公分鉛筆的故事
 
Unlocking Mobile Feedback Webinar - June 2016
Unlocking Mobile Feedback Webinar - June 2016Unlocking Mobile Feedback Webinar - June 2016
Unlocking Mobile Feedback Webinar - June 2016
 
Newsbrands and social media
Newsbrands and social media Newsbrands and social media
Newsbrands and social media
 
motivation & knowledge management
motivation & knowledge management motivation & knowledge management
motivation & knowledge management
 
Presentación sobre curso de asignatura
Presentación sobre curso de asignaturaPresentación sobre curso de asignatura
Presentación sobre curso de asignatura
 
Project: Food map
Project: Food map Project: Food map
Project: Food map
 
Universidad nacional de chimborazo katty
Universidad nacional de chimborazo kattyUniversidad nacional de chimborazo katty
Universidad nacional de chimborazo katty
 
Redaccion de textos
Redaccion de textosRedaccion de textos
Redaccion de textos
 
Evaluation question 03
Evaluation question 03Evaluation question 03
Evaluation question 03
 
今後のスマートフォンの在り方に関するユーザー
今後のスマートフォンの在り方に関するユーザー今後のスマートフォンの在り方に関するユーザー
今後のスマートフォンの在り方に関するユーザー
 

Similar to Компьютерная графика в Processing, часть 7. 3D в Processing

Анимационные эффекты
Анимационные эффектыАнимационные эффекты
Анимационные эффектыvivalis2010
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
создание HTML игр на элементе canvas
создание HTML игр на элементе canvasсоздание HTML игр на элементе canvas
создание HTML игр на элементе canvasAlexander Samantsov
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхDmitry Protopopov
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETAndrey Akinshin
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 

Similar to Компьютерная графика в Processing, часть 7. 3D в Processing (13)

Анимационные эффекты
Анимационные эффектыАнимационные эффекты
Анимационные эффекты
 
Kwp2 091203
Kwp2 091203Kwp2 091203
Kwp2 091203
 
Kwp2 091210
Kwp2 091210Kwp2 091210
Kwp2 091210
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
создание HTML игр на элементе canvas
создание HTML игр на элементе canvasсоздание HTML игр на элементе canvas
создание HTML игр на элементе canvas
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
графика Pascal ABC
графика Pascal ABCграфика Pascal ABC
графика Pascal ABC
 
аппроксимация функции нескольких переменных
аппроксимация функции нескольких переменныхаппроксимация функции нескольких переменных
аппроксимация функции нескольких переменных
 
Об особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NETОб особенностях использования значимых типов в .NET
Об особенностях использования значимых типов в .NET
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 

Компьютерная графика в Processing, часть 7. 3D в Processing

  • 1. Компьютерная графика 3D в processing Jordi Linares i Pellicer Escola Politècnica Superior d’Alcoi Dep. de Sistemes Informàtics i Computació jlinares@dsic.upv.es http://www.dsic.upv.es/~jlinares
  • 2. 3D в processing • • • • • • В processing есть 2 режима отображения 3D: P3D и OPENGL P3D основано на программной реализации, OPENGL выполняется через OpenGL («железо»). За несколькими исключениями, в них одни и те же функции и примитивы 2D примитивы и функции можно использовать в 3D (возможно, с несколькими исключениями) Некоторые из примитивов, такие как линии (line), точки (point), кривые и фигуры (примитив vertex), могут задаваться через 3 координаты: x, y, z Остальные 2D примитивы тоже можно использовать (с z=0 по умолчанию) Функции stroke, fill, text и image (текстуры) тоже можно использовать в 3D
  • 3. 3D в processing Геометрические преобразования в 3D Перенос Вращение вокруг x Вращение вокруг y Масштаб Вращение вокруг z
  • 4. 3D в processing Геометрические преобразования в 3D Перенос translate(tx, ty, tz) Масштабирование scale(sx, sy, sz) Вращение вокруг оси rotateX(), rotateY(), rotateZ()
  • 5. 3D в processing • • • По умолчанию используется перспективная проекция (0,0,0) находится в верхнем левом углу -z уходит вдаль -z (0,0,0) yx+z
  • 6. 3D в processing // Эллипс, вращающийся // вокруг оси y float ang = 0.0; void setup() { size(400, 400, P3D); stroke(255, 0, 0); noFill(); } void draw() { background(0); // Рисование с центром в // (0,0,0) translate(width/2, height/2); rotateY(ang += 0.1); ellipse(0, 0, 300, 200); }
  • 7. 3D в processing box(width, height, depth) • Рисует кубоид, правильную призму, с центром в (0,0,0) с шириной (x), высотой (y) и глубиной (z) в качестве аргументов sphere(radius) • • Рисует сферу с центром в (0,0,0) с заданным радиусом Уровень детализации, с которой рисуется сфера, можно настроить через функцию sphereDetail(n), где n означает, что вершины будут порождаться через каждые 360º/n (по умолчанию, n = 30)
  • 8. 3D в processing // Куб, вращающийся // вокруг трёх осей // Версия с каркасом void setup() { size(400, 400, P3D); stroke(255, 0, 0); noFill(); } void draw() { background(0); // Рисование с центром // в (0,0,0) translate(width/2, height/2); rotateX(frameCount*PI/60.0); rotateY(frameCount*PI/120.0); rotateZ(frameCount*PI/180.0); box(200, 200, 200); }
  • 9. 3D в processing // Куб, вращающийся // вокруг трёх осей // Версия с гранями void setup() { size(400, 400, P3D); fill(255, 0, 0); } void draw() { background(0); // Рисование с центром // в (0,0,0) translate(width/2, height/2); rotateX(frameCount*PI/60.0); rotateY(frameCount*PI/120.0); rotateZ(frameCount*PI/180.0); box(200, 200, 200); }
  • 10. 3D в processing // Куб, вращающийся // вокруг трёх осей // Версия с простым освещением void setup() { size(400, 400, P3D); fill(255, 0, 0); noStroke(); } void draw() { background(0); // Простое освещение lights(); // Рисование с центром // в (0,0,0) translate(width/2, height/2); rotateX(frameCount*PI/60.0); rotateY(frameCount*PI/120.0); rotateZ(frameCount*PI/180.0); box(200, 200, 200); }
  • 11. 3D в processing // Интерактивный куб float rotX = 0.0, rotY = 0.0; int lastX, lastY; float distX = 0.0, distY = 0.0; void setup(){ size(400, 400, P3D); noStroke(); fill(255, 0, 0); } void draw(){ background(0); lights(); translate(width/2, height/2); rotateX(rotX + distY); rotateY(rotY + distX); box(200, 200, 200); } void mousePressed() { lastX = mouseX; lastY = mouseY; } void mouseDragged() { distX = radians(mouseX - lastX); distY = radians(lastY - mouseY); } void mouseReleased() { rotX += distY; rotY += distX; distX = distY = 0.0; }
  • 12. Практика 7-1 • • • • Измените предыдущую программу так, чтобы было возможно увеличение, путём перемещения куба по оси z Для этого необходимо добавить компонент z в операцию переноса Изначально эта координата будет 0 и будет изменяться от 0 до -500 по шагам в 10 Используйте клавиши UP и DOWN, чтобы поймать событие keyPressed() и изменить увеличение
  • 13. 3D в processing // Теперь сделаем через OpenGL // Этот import - обязателен import processing.opengl.*; float rotX = 0.0, rotY = 0.0; int lastX, lastY; float distX = 0.0, distY = 0.0; // Текстура PImage foto; void setup(){ size(400, 400, OPENGL); noStroke(); foto = loadImage("foto.jpg"); // Мы хотим работать с текстурой в // координатах от (0,0) до (1,1) textureMode(NORMALIZED); } void draw(){ background(0); translate(width/2, height/2); rotateX(rotX + distY); rotateY(rotY + distX); // Хотим куб 200 x 200 x 200 // Рисуем от -1 до 1 scale(100, 100, 100); beginShape(QUADS); texture(foto); // // // // // // Мы задаём вершины каждого лица на кубе. Последние два значения координаты текстуры, которая соответствует вершине // +Z "передняя" грань vertex(-1, -1, 1, 0, 0); vertex( 1, -1, 1, 1, 0); vertex( 1, 1, 1, 1, 1); vertex(-1, 1, 1, 0, 1); // -Z "задняя" грань vertex( 1, -1, -1, 0, 0); vertex(-1, -1, -1, 1, 0); vertex(-1, 1, -1, 1, 1); vertex( 1, 1, -1, 0, 1); // +Y "нижняя" грань vertex(-1, 1, 1, 0, 0); vertex( 1, 1, 1, 1, 0); vertex( 1, 1, -1, 1, 1); vertex(-1, 1, -1, 0, 1); // -Y "верхняя" грань vertex(-1, -1, -1, 0, 0); vertex( 1, -1, -1, 1, 0); vertex( 1, -1, 1, 1, 1); vertex(-1, -1, 1, 0, 1); // +X "правая" грань vertex( 1, -1, 1, 0, 0); vertex( 1, -1, -1, 1, 0); vertex( 1, 1, -1, 1, 1); vertex( 1, 1, 1, 0, 1); // -X "левая" грань vertex(-1, -1, -1, 0, 0); vertex(-1, -1, 1, 1, 0); vertex(-1, 1, 1, 1, 1); vertex(-1, 1, -1, 0, 1); endShape(); } void mousePressed() { lastX = mouseX; lastY = mouseY; } void mouseDragged() { distX = radians(mouseX - lastX); distY = radians(lastY - mouseY); } void mouseReleased() { rotX += distY; rotY += distX; distX = distY = 0.0; }
  • 15. 3D в processing import processing.opengl.*; // Рисование функции в 3D float rotX = 0.0, rotY = 0.0; int lastX, lastY; float distX = 0.0, distY = 0.0; // Шаги функции int steps = 50; // Масштабирование по оси z float scaleZ = 200.0; // Увеличение по оси z float zoomZ = -300.0; // Размер графика float gX = 500.0, gY = 500.0; void setup() { size(500, 500, OPENGL); noFill(); } float function(float x, float y) { return x*x*x + y*y*y; } void draw() { background(0); // Поместим результат в центр окна translate(gX/2, gY/2, zoomZ); // Вращение rotateY(rotY + distX); rotateX(rotX + distY); // Перенос центра в (0, 0); translate(-gX/2, -gY/2); // Функция покрывает // 400 x 400 x scaleZ scale(gX, gY, scaleZ); // Рисование функции stroke(255); drawFunction(); // Рисование осей stroke(255, 0, 0); line(0,0,0,2000,0,0); stroke(0,255,0); line(0,0,0,0,2000,0); stroke(0,0,255); line(0,0,0,0,0,2000); } void drawFunction() { float x, y, z; int i = 0, j = 0; float in_steps = 1.0 / steps; float[][] matrix = new float[steps+1][steps+1]; for (y = 0.0, j = 0; y <= 1.0; y+=in_steps, j++) for (x = 0.0, i = 0; x <= 1.0; x+=in_steps, i++) matrix[i][j] = function(x, y); for (j = 0, y = 0.0; j < steps; j++, y+=in_steps) { beginShape(QUAD_STRIP); for (i = 0, x = 0.0; i <= steps; i++, x+=in_steps) { vertex(x, y, matrix[i][j]); vertex(x, y + in_steps, matrix[i][j+1]); } endShape(); } } void mousePressed() { lastX = mouseX; lastY = mouseY; } void mouseDragged() { distX = radians(mouseX - lastX); distY = radians(lastY - mouseY); } void mouseReleased() { rotX += distY; rotY += distX; distX = distY = 0.0; }
  • 17. Практика 7-2 • Измените предыдущую программу, чтобы нарисовать поверхность в «твёрдом» режиме с использованием простой модели освещения (используйте lights() и fill())
  • 18. Практика 7-3 • • Измените предыдущую программу, чтобы нарисовать поверхность с двухцветным градиентом (например, красный для малых значений z, а жёлтый для больших) Для этого используйте вызов fill() перед каждым вызовом vertex()
  • 19. Практика 7-4 • Снова измените предыдущую программу, чтобы вместо рисования функции загружать изображение, и после перевода в серую шкалу, использовать значения пикселей как координаты по z для полосы четырёхугольников