- Computação gráfica envolve geração e manipulação de conteúdo visual usando computadores, incluindo imagens 2D e 3D, processamento de imagens, modelagem 3D e animação.
- Bibliotecas como PIL, Matplotlib e VPython permitem criar e manipular imagens digitais, gráficos e cenas 3D de forma programática.
- Softwares como Blender possibilitam modelagem, renderização e animação 3D avançadas através de interfaces gráficas.
2. Sumário
● Computação gráfica
● Imagens em 2D
● Processamento de
imagens
● Modelagem 3D
● Animação
Foto alterada com o filtro
Cubism do GIMP.
3. Computação gráfica
Definições:
● Área da ciência da
computação que estuda
a geração e manipulação
de conteúdo visual.
● Tecnologias associadas a
criação e manipulação
de imagens digitais.
● Representação e
manipulação de dados
visuais usando Cena 3D renderizada no
Blender.
computadores.
4. Imagens em 2D (raster)
A imagem é composta por pixels
(picture elements), com uma cor
associada.
RGB = (102, 153, 102)
Imagem
RGB = (102, 153, 204)
RGB = (102, 153, 153)
Geralmente, as cores dos pixels
são representadas em RGB (Red, RGB = (51, 102, 153)
Blue, Green).
5. Processamento de imagem
Imagem original em um
formato raster (mapa de bits).
Algoritmos
Imagem processada (filtro
GIMPressionist / Mossy, do
GIMP).
6. PIL (Python Imaging Library)
Implementa:
● Ferramentas para cortar, redimensionar e mesclar
imagens.
● Algoritmos de conversão.
● Filtros, tais como suavizar e detectar bordas.
● Ajustes, incluindo brilho e contraste.
● Operações com paletas de cores.
● Desenhos simples em 2D.
● Rotinas para tratamento de imagens: equalizar,
deformar, inverter e outras.
7. PIL (exemplo A-I)
import Image
O módulo Image define uma
from ImageFilter import *
classe para tratar imagens com
fn = 'for.png' vários métodos para modificar
im = Image.open(fn) suas características.
for i, filter in enumerate((CONTOUR,
EMBOSS, FIND_EDGES)):
fl = im.filter(filter)
fl.thumbnail((512, 512), O módulo ImageFilter provê
Image.ANTIALIAS) filtros mais comuns para o
fl.save(fn.replace('.png', '%d.png' % i), processamento de imagens.
'PNG')
pn = im.point(lambda i: i * 3)
pn.thumbnail((512, 512), Image.ANTIALIAS)
pn.save(fn.replace('.png', '%d.png' % (i + 1)),
'PNG')
8. PIL (exemplo A-II)
import Image A função open() cria objetos da
from ImageFilter import * classe Image a partir de
arquivos. Vários formatos são
fn = 'for.png'
suportados.
im = Image.open(fn)
for i, filter in enumerate((CONTOUR, Os filtros CONTOUR,
EMBOSS, FIND_EDGES)): EMBOSS e FIND_EDGES são
fl = im.filter(filter) alguns que estão disponíveis em
fl.thumbnail((512, 512), ImageFilter.
Image.ANTIALIAS)
fl.save(fn.replace('.png', '%d.png' % i),
'PNG')
O método filter() aplica o filtro
especificado na imagem.
pn = im.point(lambda i: i * 3)
pn.thumbnail((512, 512), Image.ANTIALIAS)
pn.save(fn.replace('.png', '%d.png' % (i + 1)),
'PNG')
9. PIL (exemplo A-III)
import Image
from ImageFilter import *
fn = 'for.png' O método thumbnail()
im = Image.open(fn) redimenciona a imagem. Com
antialias, a imagem resultante
for i, filter in enumerate((CONTOUR, fica mais suave.
EMBOSS, FIND_EDGES)):
fl = im.filter(filter) O método save() grava a imagem
fl.thumbnail((512, 512), em arquivo no formato
Image.ANTIALIAS) especificado.
fl.save(fn.replace('.png', '%d.png' % i),
'PNG')
O método point() aplica uma
pn = im.point(lambda i: i * 3) função a cada ponto da imagem.
pn.thumbnail((512, 512), Image.ANTIALIAS)
pn.save(fn.replace('.png', '%d.png' % (i + 1)),
'PNG')
10. PIL (exemplo A-IV)
Arquivos de saída
CONTOUR EMBOSS FIND_EDGES lamdba i: i *3
for0.png for1.png for2.png for3.png
11. Imagens em 2D (vetorial)
A imagem é gerada a partir de
instruções que descrevem os
objetos.
As instruções são primitivas
geométricas, tais como linha, Arquivo SVG gerado no
ponto, círculo e outros. Inkscape.
12. Pylab / Matplotlib
Implementa:
● Pylab: API destinada ao uso interativo.
● Matplotib: API orientada a objetos.
● Vários gráficos 2D mais usados: linhas, barras, pizza,
dispersão e outros.
● Suporte a gráficos 3D (limitado).
● Vários backends, que permitem exportar para vários
formatos populares.
13. Pylab / Matplotlib (exemplo B-I)
A função subplot() divide e
from pylab import * seleciona um pedaço da área da
ent = arange(0., 20.1, .1) figura (311 => 3 linhas, 1 coluna,
na primeira posição).
subplot(311)
sai = cos(ent)
plot(ent, sai, lw=3, c=(.1, .25, .5)) A função plot() desenha uma
ylabel('A') linha.
subplot(312)
sai = sin(ent)
Texto para o eixo Y.
plot(ent, sai, lw=3, c=(.1, .5, .25))
ylabel('B')
subplot(313)
sai = cos(ent) * sin(ent)
plot(ent, sai, lw=3, c=(.1, .5, .5)) Texto para o eixo X.
xlabel('entrada')
ylabel('A x B')
Salva a imagem em arquivo PNG.
savefig('graf.png', dpi=100)
14. Pylab / Matplotlib (exemplo B-II)
from pylab import * Arquivo de saída
ent = arange(0., 20.1, .1)
subplot(311) A
sai = cos(ent)
plot(ent, sai, lw=3, c=(.1, .25, .5))
ylabel('A')
subplot(312) B
sai = sin(ent)
plot(ent, sai, lw=3, c=(.1, .5, .25))
ylabel('B')
AxB
subplot(313)
sai = cos(ent) * sin(ent)
plot(ent, sai, lw=3, c=(.1, .5, .5))
xlabel('entrada')
ylabel('A x B') graf.png
savefig('graf.png', dpi=100)
15. 3D (I)
Wireframe Materiais
O wireframe representa a
Os materiais são aplicados
estrutura dos objetos que
aos objetos.
compõem a cena.
16. 3D (II)
Shading Texturas
Sombreamento define como Texturas são imagens raster
cada objeto da cena reage que são aplicadas aos
a luz. materiais.
17. 3D (III)
Texturas
Sombras
A imagem é gerada
aplicando um algoritmo
(como o raytracing), Reflexão
que calcula cada ponto
da saída.
18. Animação (técnica keyframe)
Keyframe 1 Keyframe 2
001 025 050
Keyframe 3
075 100 125
Os frames entre os keyframes
são calculador por interpolação.
19. VPython
Implementa:
● Vários objetos 3D simples (cubo, esfera, cilindro,
pirâmide, espiral, ...).
● Recursos para facilitar animações.
● Iluminação, zoom e pan automáticos.
● Controles interativos.
20. VPython (exemplo C-I)
Desenha quatro caixas.
from visual import *
box(pos=(12, 0, 0) , length=1 , height=21 , width=29)
box(pos=(-12, 0, 0) , length=1 , height=21 , width=29)
box(pos=(0, 10, 0) , length=25 , height= 1 , width=29)
box(pos=(0, -10, 0) , length=25 , height=1 , width=29)
x, y, z = .1, .1, .1 Desenha a esfera e sombra.
b = sphere(pos=(3, 5, 7), radius=1.2)
s = cylinder(pos=(3, -10, 7), axis=(0, .5, 0), color=color.black)
while True: Move a esfera e a sombra.
b.pos += (x, y, z)
s.x, s.z = b.x, b.z Muda a direção da esfera e da
if abs(b.x) > 10: x = -x sombra.
if abs(b.y) > 8: y = -y
if abs(b.z) > 12: z = -z
rate(100) Controla a velocidade da
animação.
22. Blender
Implementa:
● Modelagem 3D avançada, com materiais, texturas,
iluminação, extrusão, entre outros.
● Recursos de animação sofisticados.
● Um game engine poderoso.
● Uma API que permite uso do Python.
24. Blender (exemplo D-I)
import math
import Blender
Câmera
# A cena atual
cena = Blender.Scene.GetCurrent()
# Muda a camera de lugar
camera = Blender.Object.Get()[0]
camera.setLocation(9., -9., 7.)
# Remove da cena o objeto quot;defaultquot;
cubo = Blender.Object.Get()[1]
cena.objects.unlink(cubo)
# Cria uma fonte de luz
lampada = Blender.Lamp.New('Lamp')
lamp = Blender.Object.New('Lamp')
# Muda o lugar da fonte (default = 0.0, 0.0, 0.0)
lamp.setLocation(6., -6., 6.)
Continua...
25. Blender (exemplo D-II)
# quot;Prendequot; a fonte de luz na cena Fonte de luz
lamp.link(lampada)
cena.objects.link(lamp)
# Cria um material
material1 = Blender.Material.New('newMat1')
material1.rgbCol = [.25, .25, .32]
material1.setAlpha(1.)
# Cria uma textura
textura1 = Blender.Texture.Get()[0]
textura1.setType('Clouds')
textura1.noiseType = 'hard'
# Coloca no material
material1.setTexture(0, textura1)
mtex = material1.getTextures()[0]
mtex.col = (.18, .18, .22)
Continua...
26. Blender (exemplo D-III)
# Cria o piso
mesh = Blender.Mesh.Primitives.Plane(25.)
piso = cena.objects.new(mesh,'Mesh')
piso.setEuler(0., 0., math.radians(45))
# Coloca o material no piso
piso.setMaterials([material1])
piso.colbits = 1
# Cria outro material
material2 = Blender.Material.New('newMat2')
material2.rgbCol = [.52, .61, .62]
material2.setAlpha(1.)
# Cria outra textura
textura2 = Blender.Texture.Get()[0] Piso
textura2.setType('Stucci')
textura2.noiseType = 'hard'
Continua...
27. Blender (exemplo D-IV)
# Coloca no material
material2.setTexture(0, textura2)
mtex = material2.getTextures()[0]
mtex.col = (.22, .22, .32)
# Cria objetos na cena
def objeto(local, tam, mat, prim=Blender.Mesh.Primitives.Cube):
mesh = prim()
obj = cena.objects.new(mesh, 'Mesh')
obj.setLocation(*local)
obj.size = tam
obj.setMaterials(mat)
obj.colbits = 1
return obj
mat = [material2]
Continua...
28. Blender (exemplo D-V)
# Primitiva do cilindro
prim = Blender.Mesh.Primitives.Cylinder
# Cria colunas no fundo
for i in xrange(16):
# Topo da primeira fileira
local = (i - 8., 8., 2.5)
tam = (.25, .25, .1)
objeto(local, tam, mat)
# Base da primeira fileira
local = (i - 8., 8., 0.)
objeto(local, tam, mat)
# Corpo da primeira fileira Colunas
tam = (.2, .2, 2.5)
objeto(local, tam, mat, prim)
Continua...
29. Blender (exemplo D-VI)
# Topo da segunda fileira Aqueduto
local = (-8., i - 8., 2.5)
tam = (.25, .25, .1)
objeto(local, tam, mat)
# Base da segunda fileira
local = (-8., i - 8., 0.)
objeto(local, tam, mat)
# Corpo da segunda fileira
tam = .2, .2, 2.5
objeto(local, tam, mat, prim)
# Aqueduto
local = (-8., i - 8., 3.)
tam = (.5, .5, .5)
objeto(local, tam, mat)
local = (i - 8., 8., 3.)
objeto(local, tam, mat)
Continua...
30. Blender (exemplo D-VII)
# Cria colunas em cima do piso
for i in (-3, 3):
for j in range(-3, 4):
# Topo das fileiras X
local = (i, j, 2.5)
tam = (.25, .25, .1)
objeto(local, tam, mat)
# Topo das fileiras Y
local = (j, i, 2.5)
objeto(local, tam, mat)
# Base das fileiras X
local = (i, j, .5)
objeto(local, tam, mat)
Colunas
Continua...
31. Blender (exemplo D-VIII)
# Base das fileiras Y
local = (j, i, .5)
objeto(local, tam, mat)
# Corpo das fileiras X
local = (i, j, 0)
tam = (.2, .2, 2.5)
objeto(local, tam, mat, prim)
# Corpo das fileiras Y
local = (j, i, 0)
objeto(local, tam, mat, prim)
# Cria escada
for i in xrange(4):
Escada
local = (0., 0., i / 16.)
tam = (2. + (8. - i) / 4.,2. + (8. - i) / 4., .25)
objeto(local, tam, mat)
Continua...
32. Blender (exemplo D-IX)
# Cria teto
for i in xrange(35):
local = (0., 0., 2.7 + i / 60.)
tam = (3.5 , 3.5 * ( 1. - i / 35.), .1)
objeto(local, tam, mat)
# Atualiza a cena
cena.update()
Teto