35
Computação Gráfica em Luiz Eduardo Borges http://ark4n.wordpress.com/

Computação Gráfica em - ark4n.files.wordpress.com · 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

  • Upload
    vodung

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

Computação Gráfica em

Luiz Eduardo Borgeshttp://ark4n.wordpress.com/

Sumário

● Computação gráfica

● Imagens em 2D

● Processamento de imagens

● Modelagem 3D

● Animação

Foto alterada com o filtro Cubism do GIMP.

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 computadores.

Cena 3D renderizada no Blender.

Imagens em 2D (raster)

Imagem

RGB = (102, 153, 204)

RGB = (51, 102, 153)

RGB = (102, 153, 153)

RGB = (102, 153, 102)

A imagem é composta por pixels (picture elements), com uma cor

associada.

Geralmente, as cores dos pixels são representadas em RGB (Red,

Blue, Green).

Processamento de imagem

Algoritmos

Imagem original em um formato raster (mapa de bits).

Imagem processada (filtro GIMPressionist / Mossy, do

GIMP).

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.

import Imagefrom ImageFilter import *

fn = 'for.png'im = Image.open(fn)

for i, filter in enumerate((CONTOUR, EMBOSS, FIND_EDGES)): fl = im.filter(filter) fl.thumbnail((512, 512), Image.ANTIALIAS) fl.save(fn.replace('.png', '%d.png' % i), 'PNG')

pn = im.point(lambda i: i * 3)pn.thumbnail((512, 512), Image.ANTIALIAS)pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')

PIL (exemplo A-I)

O módulo Image define uma classe para tratar imagens com vários métodos para modificar

suas características.

O módulo ImageFilter provê filtros mais comuns para o

processamento de imagens.

PIL (exemplo A-II)import Imagefrom ImageFilter import *

fn = 'for.png'im = Image.open(fn)

for i, filter in enumerate((CONTOUR, EMBOSS, FIND_EDGES)): fl = im.filter(filter) fl.thumbnail((512, 512), Image.ANTIALIAS) fl.save(fn.replace('.png', '%d.png' % i), 'PNG')

pn = im.point(lambda i: i * 3)pn.thumbnail((512, 512), Image.ANTIALIAS)pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')

A função open() cria objetos da classe Image a partir de

arquivos. Vários formatos são suportados.

Os filtros CONTOUR, EMBOSS e FIND_EDGES são

alguns que estão disponíveis em ImageFilter.

O método filter() aplica o filtro especificado na imagem.

PIL (exemplo A-III)import Imagefrom ImageFilter import *

fn = 'for.png'im = Image.open(fn)

for i, filter in enumerate((CONTOUR, EMBOSS, FIND_EDGES)): fl = im.filter(filter) fl.thumbnail((512, 512), Image.ANTIALIAS) fl.save(fn.replace('.png', '%d.png' % i), 'PNG')

pn = im.point(lambda i: i * 3)pn.thumbnail((512, 512), Image.ANTIALIAS)pn.save(fn.replace('.png', '%d.png' % (i + 1)), 'PNG')

O método save() grava a imagem em arquivo no formato

especificado.

O método point() aplica uma função a cada ponto da imagem.

O método thumbnail() redimenciona a imagem. Com antialias, a imagem resultante

fica mais suave.

PIL (exemplo A-IV)

CONTOUR

for0.png

EMBOSS

for1.png

FIND_EDGES

for2.png

lamdba i: i *3

for3.png

Arquivos de saída

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,

ponto, círculo e outros.Arquivo SVG gerado no

Inkscape.

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.

Pylab / Matplotlib (exemplo B-I)

from pylab import *ent = arange(0., 20.1, .1)

subplot(311)sai = cos(ent)plot(ent, sai, lw=3, c=(.1, .25, .5))ylabel('A')

subplot(312)sai = sin(ent)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))xlabel('entrada')ylabel('A x B')

savefig('graf.png', dpi=100)

A função subplot() divide e seleciona um pedaço da área da figura (311 => 3 linhas, 1 coluna,

na primeira posição).

A função plot() desenha uma linha.

Texto para o eixo Y.

Texto para o eixo X.

Salva a imagem em arquivo PNG.

Pylab / Matplotlib (exemplo B-II)

from pylab import *ent = arange(0., 20.1, .1)

subplot(311)sai = cos(ent)plot(ent, sai, lw=3, c=(.1, .25, .5))ylabel('A')

subplot(312)sai = sin(ent)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))xlabel('entrada')ylabel('A x B')

savefig('graf.png', dpi=100)

A

B

A x B

Arquivo de saída

graf.png

3D (I)

Wireframe Materiais

O wireframe representa a estrutura dos objetos que

compõem a cena.

Os materiais são aplicados aos objetos.

3D (II)

Shading TexturasTexturas

Sombreamento define como cada objeto da cena reage

a luz.

Texturas são imagens raster que são aplicadas aos

materiais.

3D (III)

Sombras

Texturas

Reflexão

A imagem é gerada aplicando um algoritmo

(como o raytracing), que calcula cada ponto

da saída.

Animação (técnica keyframe)

001 025 050

075 100 125

Keyframe 1 Keyframe 2

Keyframe 3

Os frames entre os keyframes são calculador por interpolação.

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.

VPython (exemplo C-I)

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, .1b = sphere(pos=(3, 5, 7), radius=1.2)s = cylinder(pos=(3, -10, 7), axis=(0, .5, 0), color=color.black)

while True: b.pos += (x, y, z) s.x, s.z = b.x, b.z if abs(b.x) > 10: x = -x if abs(b.y) > 8: y = -y if abs(b.z) > 12: z = -z rate(100)

Desenha quatro caixas.

Desenha a esfera e sombra.

Move a esfera e a sombra.

Muda a direção da esfera e da sombra.

Controla a velocidade da animação.

VPython (exemplo C-II)

Esfera b

Sombra s

Caixas

Janela de saída

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.

Blender (cena)

Câmera

Fonte de luz

Objetos

Blender (exemplo D-I)

import mathimport Blender

# A cena atualcena = Blender.Scene.GetCurrent()

# Muda a camera de lugarcamera = Blender.Object.Get()[0]camera.setLocation(9., -9., 7.)

# Remove da cena o objeto "default"cubo = Blender.Object.Get()[1]cena.objects.unlink(cubo)

# Cria uma fonte de luzlampada = 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...

Câmera

Blender (exemplo D-II)

# "Prende" a fonte de luz na cenalamp.link(lampada)cena.objects.link(lamp)

# Cria um materialmaterial1 = Blender.Material.New('newMat1')material1.rgbCol = [.25, .25, .32]material1.setAlpha(1.)

# Cria uma texturatextura1 = Blender.Texture.Get()[0]textura1.setType('Clouds')textura1.noiseType = 'hard'

# Coloca no materialmaterial1.setTexture(0, textura1)mtex = material1.getTextures()[0]mtex.col = (.18, .18, .22)

Continua...

Fonte de luz

Blender (exemplo D-III)

# Cria o pisomesh = Blender.Mesh.Primitives.Plane(25.)piso = cena.objects.new(mesh,'Mesh')piso.setEuler(0., 0., math.radians(45))

# Coloca o material no pisopiso.setMaterials([material1])piso.colbits = 1

# Cria outro materialmaterial2 = Blender.Material.New('newMat2')material2.rgbCol = [.52, .61, .62]material2.setAlpha(1.)

# Cria outra texturatextura2 = Blender.Texture.Get()[0]textura2.setType('Stucci')textura2.noiseType = 'hard'

Continua...

Piso

Blender (exemplo D-IV)

# Coloca no materialmaterial2.setTexture(0, textura2)mtex = material2.getTextures()[0]mtex.col = (.22, .22, .32)

# Cria objetos na cenadef 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...

Blender (exemplo D-V)

# Primitiva do cilindroprim = Blender.Mesh.Primitives.Cylinder

# Cria colunas no fundofor 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 tam = (.2, .2, 2.5) objeto(local, tam, mat, prim)

Continua...

Colunas

Blender (exemplo D-VI) # Topo da segunda fileira 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...

Aqueduto

Blender (exemplo D-VII)

# Cria colunas em cima do pisofor 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)

Continua...

Colunas

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 escadafor i in xrange(4):

local = (0., 0., i / 16.) tam = (2. + (8. - i) / 4.,2. + (8. - i) / 4., .25) objeto(local, tam, mat)

Continua...

Escada

Blender (exemplo D-IX)

# Cria tetofor 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 cenacena.update()

Teto

Blender (exemplo D-X)

Cena final

Referências

PIL:● http://www.pythonware.com/products/pil/

Matplotlib:● http://matplotlib.sourceforge.net/

VPython:● http://vpython.org/

Blender:● http://www.blender.org/

Computação Gráfica em

Luiz Eduardo Borgeshttp://ark4n.wordpress.com/

Fim