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

Introduction to xcode
Introduction to xcodeIntroduction to xcode
Introduction to xcodeSunny Shaikh
 
Lý thuyết tính toán - BKHN - 5
Lý thuyết tính toán - BKHN - 5Lý thuyết tính toán - BKHN - 5
Lý thuyết tính toán - BKHN - 5Minh Lê
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrenteFranck SIMON
 
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Thanh Giảng Lê
 
Inheritance concepts
Inheritance concepts Inheritance concepts
Inheritance concepts Kumar
 
C5 Réseaux : vlsm-classe-nat
C5 Réseaux : vlsm-classe-natC5 Réseaux : vlsm-classe-nat
C5 Réseaux : vlsm-classe-natPRONETIS
 
Lambda Expressions in C# From Beginner To Expert - Jaliya Udagedara
Lambda Expressions in C# From Beginner To Expert - Jaliya UdagedaraLambda Expressions in C# From Beginner To Expert - Jaliya Udagedara
Lambda Expressions in C# From Beginner To Expert - Jaliya UdagedaraJaliya Udagedara
 
Entity framework code first
Entity framework code firstEntity framework code first
Entity framework code firstConfiz
 
Dependency injection presentation
Dependency injection presentationDependency injection presentation
Dependency injection presentationAhasanul Kalam Akib
 
10 minute command line apps with zio cli
10 minute command line apps with zio cli10 minute command line apps with zio cli
10 minute command line apps with zio cliAiswarya Prakasan
 
Alphorm.com Formation Vue JS 3 : Exploiter la Composition API
Alphorm.com Formation Vue JS 3 : Exploiter la Composition APIAlphorm.com Formation Vue JS 3 : Exploiter la Composition API
Alphorm.com Formation Vue JS 3 : Exploiter la Composition APIAlphorm
 
Chp1 - Introduction à l'AGL
Chp1 - Introduction à l'AGLChp1 - Introduction à l'AGL
Chp1 - Introduction à l'AGLLilia Sfaxi
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkHugo Hamon
 
Design Patterns in Modern C++
Design Patterns in Modern C++Design Patterns in Modern C++
Design Patterns in Modern C++Dmitri Nesteruk
 
Java servlet life cycle - methods ppt
Java servlet life cycle - methods pptJava servlet life cycle - methods ppt
Java servlet life cycle - methods pptkamal kotecha
 
Chp5 - Les outils CASE
Chp5 - Les outils CASEChp5 - Les outils CASE
Chp5 - Les outils CASELilia Sfaxi
 

What's hot (20)

Diviser Pour Régner
Diviser Pour RégnerDiviser Pour Régner
Diviser Pour Régner
 
Introduction to xcode
Introduction to xcodeIntroduction to xcode
Introduction to xcode
 
Lý thuyết tính toán - BKHN - 5
Lý thuyết tính toán - BKHN - 5Lý thuyết tính toán - BKHN - 5
Lý thuyết tính toán - BKHN - 5
 
Java - programmation concurrente
Java - programmation concurrenteJava - programmation concurrente
Java - programmation concurrente
 
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
Bài giảng ngôn ngữ lập trình C cơ bản trường đại học công nghiệp thực phẩm TP...
 
Inheritance concepts
Inheritance concepts Inheritance concepts
Inheritance concepts
 
C5 Réseaux : vlsm-classe-nat
C5 Réseaux : vlsm-classe-natC5 Réseaux : vlsm-classe-nat
C5 Réseaux : vlsm-classe-nat
 
Lambda Expressions in C# From Beginner To Expert - Jaliya Udagedara
Lambda Expressions in C# From Beginner To Expert - Jaliya UdagedaraLambda Expressions in C# From Beginner To Expert - Jaliya Udagedara
Lambda Expressions in C# From Beginner To Expert - Jaliya Udagedara
 
Entity framework code first
Entity framework code firstEntity framework code first
Entity framework code first
 
Dependency injection presentation
Dependency injection presentationDependency injection presentation
Dependency injection presentation
 
10 minute command line apps with zio cli
10 minute command line apps with zio cli10 minute command line apps with zio cli
10 minute command line apps with zio cli
 
Features of java
Features of javaFeatures of java
Features of java
 
Alphorm.com Formation Vue JS 3 : Exploiter la Composition API
Alphorm.com Formation Vue JS 3 : Exploiter la Composition APIAlphorm.com Formation Vue JS 3 : Exploiter la Composition API
Alphorm.com Formation Vue JS 3 : Exploiter la Composition API
 
Chp1 - Introduction à l'AGL
Chp1 - Introduction à l'AGLChp1 - Introduction à l'AGL
Chp1 - Introduction à l'AGL
 
Broadleaf Presents Thymeleaf
Broadleaf Presents ThymeleafBroadleaf Presents Thymeleaf
Broadleaf Presents Thymeleaf
 
Scala fundamentals
Scala fundamentalsScala fundamentals
Scala fundamentals
 
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend FrameworkExposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
Exposer des services web SOAP et REST avec symfony 1.4 et Zend Framework
 
Design Patterns in Modern C++
Design Patterns in Modern C++Design Patterns in Modern C++
Design Patterns in Modern C++
 
Java servlet life cycle - methods ppt
Java servlet life cycle - methods pptJava servlet life cycle - methods ppt
Java servlet life cycle - methods ppt
 
Chp5 - Les outils CASE
Chp5 - Les outils CASEChp5 - Les outils CASE
Chp5 - Les outils CASE
 

Viewers also liked

Компьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текстКомпьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текстTatiana Volkova
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingTatiana Volkova
 
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивыКомпьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы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 (20)

Компьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текстКомпьютерная графика в Processing, часть 3. Изображения и текст
Компьютерная графика в Processing, часть 3. Изображения и текст
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивыКомпьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
 
Компьютерная графика в 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 для полосы четырёхугольников