Programa de Pós-Graduação em Ciências Cartográficas
Glaucia Gabriel Sass
Tutorial Pov-Ray
PRESIDENTE PRUDENTE
2010
Programa de Pós-Graduação em Ciências Cartográficas
Glaucia Gabriel Sass
Tutorial Pov-Ray
Trabalho apresentado à disciplina de
Computação Gráfica como requisito parcial
para aprovação.
Prof. Dr. Julio Kiyoshi Hasegawa
PRESIDENTE PRUDENTE
2010
Disciplina de Computação Gráfica: Tutorial POV-Ray 3
INDÍCE DE ILUSTRAÇÕES
Figura 1: Sistema de coordenada usada pelo POV-Ray (POV-RAY, 2010). ................................... 7
Figura2: Imagem gerada pelo exe01.pov .......................................................................................... 10
Quadro 1: Dicas para o POV-Ray ...................................................................................................... 10
Quadro 2: Orientação para o código do exe02.pov. ......................................................................... 11
Figura 3: Imagem gerada pelo exe02.pov ......................................................................................... 12
Quadro 3: Forma geral da declaração de pigmentação .................................................................... 14
Quadro 4: Orientação para o código do exe03.pov. ......................................................................... 15
Figura 4: Imagens com alteração do gradiente: <0,1,0>; <1,1,1>; <1,0,0> ................................... 15
Figura 5: Imagem com aplicação de turbulência. ............................................................................. 16
Figura 6: Imagem com pigmentação mármore. ................................................................................ 16
Figura 7: Imagem com pigmentação mármore com turbulência. .................................................... 16
Figura 8: Imagem com pigmentação ágata. ...................................................................................... 16
Figura 9: Imagem com pigmentação palhaço. .................................................................................. 16
Figura 10: Imagem com pigmentação manchada. ............................................................................ 16
Figura 11: Imagem com pigmentação granito. ................................................................................. 16
Figura 12: Imagem com pigmentação leopardo. .............................................................................. 17
Figura 13: Imagem com pigmentação madeira. ............................................................................... 17
Figura 14: Imagem com pigmentação tabuleiro de xadrez .............................................................. 17
Figura 15: Imagem com pigmentação tabuleiro de xadrez e turbulência. ...................................... 17
Figura 16: Imagem com pigmentação hexágono.............................................................................. 17
Quadro 5: Sintaxe do mapeamento de imagem. ............................................................................... 17
Figura 17: Cena com o mapeamento de imagem, exe04.pov. ......................................................... 18
Figura 18: Cena usando polígonos. ................................................................................................... 18
Quadro 6: Forma geral da declaração de finalização ....................................................................... 19
Figura 20: Imagem com finish {brilliance 5}na esfera e finish {crand 0.6}
no cone. .............................................................................................................................................................. 19
Figura 21: Imagem com finish {phong 0.9}na esfera e finish {phong 1
phong_size 2} no cone.............................................................................................................................. 20
Disciplina de Computação Gráfica: Tutorial POV-Ray 4
Figura 22: Imagem com finish { specular 0.5 roughness 0.75} na esfera e
finish { phong 1 reflection 0.3} no cone. .............................................................................. 21
Figura 23: Imagem com normal { bumps 1 scale 1/4} na esfera e normal {
dents 1 scale 1/4 } no cone............................................................................................................... 23
Figura 24: Imagem com normal { waves 1.0 scale 1/4} na esfera, normal {
ripples 1.0 scale 1/4 } no cone e normal {wrinkles 1 scale 1/4} na esfera...... 23
Quadro 7: Dica de texture.inc. ........................................................................................................... 23
Quadro 8: Sintaxe para CSG.............................................................................................................. 24
Figura 25: Exemplo matemático da união (HELP, 2003)................................................................ 24
Quadro 9: Orientação para o código do exe05.pov. ......................................................................... 24
Figura 26: Imagem gerada pelo exe05.pov, união. .......................................................................... 25
Quadro 10: Dica de textura. ............................................................................................................... 25
Figura 27: Exemplo matemático da junção (HELP, 2003) .............................................................. 25
Figura 28: Imagem gerada pelo exe05.pov, junção.......................................................................... 26
Quadro 11: Dica: diferença entre junção e união. ............................................................................ 26
Quadro 12: Dica: informação sobre RGBF. ..................................................................................... 26
Figura 29: Exemplo matemático da diferença (HELP, 2003) ......................................................... 26
Figura 30: Diferença entre união e diferença (à esquerda há uma união entre os objetos e à
esquerda uma diferença).Imagem gerada pelo exe05.pov. ............................................................................. 27
Figura 31: Exemplo matemático da interseção (HELP, 2003) ........................................................ 27
Figura 32: Diferença entre união e intersecção (à esquerda há uma união entre os objetos e à
direita uma intersecção). Imagem gerada pelo exe05.pov. ............................................................................. 28
Quadro 13: Orientação para o código do cena.pov. ......................................................................... 31
Figura 33: Imagem do exercício criando uma cena. ........................................................................ 34
Figura 34:Pebbles by Jonathan Hunt ................................................................................................. 36
Figura 35:Bonsais by Jaime Vives Piqueres ..................................................................................... 36
Figura 36:Patio by Jaime Vives Piqueres ......................................................................................... 36
Figura 37:Glasses by Gilles Tran ...................................................................................................... 36
Figura 38:The Kitchen by Jaime Vives Piqueres ............................................................................. 36
Figura 39:Car Study by René Bui ..................................................................................................... 36
Figura 40:The Dark Side of the Trees by Gilles Tran ...................................................................... 37
Disciplina de Computação Gráfica: Tutorial POV-Ray 5
Figura 41:Forgotten Neighbourhood by Hildur Kolbrun Andresdottir........................................... 37
Figura 42:The Wet Bird by Gilles Tran ............................................................................................ 37
Figura 43:The Cool Cows by Gilles Tran ......................................................................................... 37
Disciplina de Computação Gráfica: Tutorial POV-Ray 6
SUMÁRIO
1 INTRODUÇÃO ............................................................................................................. 7
2 INICIANDO O POV-RAY ............................................................................................ 8
3 OBJETOS 3D .............................................................................................................. 11
3.1 Caixa........................................................................................................................... 11
3.2 Cone ........................................................................................................................... 11
3.3 Cilindro ...................................................................................................................... 12
3.4 Torus........................................................................................................................... 12
4 TEXTURA ................................................................................................................... 13
4.1 Atributo: pigmentação............................................................................................... 14
4.2 Atributo: finalização.................................................................................................. 18
4.3 Atributo: normal ........................................................................................................ 22
5 CSG ........................................................................................................................... 24
5.1 União .......................................................................................................................... 24
5.2 Junção ......................................................................................................................... 25
5.3 Diferença .................................................................................................................... 26
5.4 Interseção ................................................................................................................... 27
6 ILUMINAÇÃO............................................................................................................ 29
6.1 Foco de luz ................................................................................................................. 29
6.2 Área luminosa ............................................................................................................ 30
7 LINGUAGEM ............................................................................................................. 31
8 EXERCÍCIO: CRIANDO UMA CENA .................................................................... 33
REFERÊNCIAS .................................................................................................................. 35
ANEXO A – Arte no POV-Ray.......................................................................................... 36
Disciplina de Computação Gráfica: Tutorial POV-Ray 7
1 INTRODUÇÃO
O POV-Ray é um software que usa o algoritmo de ray tracing para gerar
imagens com realismo. Ele está disponível para as plataformas, Microsoft Windows,
Linux e Mac OS. Foi originalmente baseado no DKBTrace, escrito por David Kirk Buck
e Aaron A. Collins. Existem também influências do Polyray, e de contribuição de seu
autor, Alexander Enzmann. O POV-Ray é livre, com seu código-fonte disponível.
Ele consiste em uma linguagem especial para descrição de cenas. É necessário
apenas digitar comandos em um arquivo texto que o POV-Ray lê para gerar a imagem.
Algumas de suas características: suporte para projeção ortográfica e perspectiva;
possibilidade de incluir vários tipos de fontes de luz; radiosidade; primitivas, tais como
cone, cilindro e esfera; técnicas de modelagem mais avançadas, tais como superfície
paramétrica Bèzier, sweep, fractais e CSG; possibilidade de especificar as propriedades
dos materiais incluindo diferentes tipos de texturas.
O POV-Ray utiliza o sistema de coordenadas cartesianas "mão esquerda", isto é,
o eixo z cresce "para dentro da tela do computador". A mão esquerda também é usada
para indicar a direção de rotação. Neste caso, considera-se que a mão envolve o eixo
cartesiano com o dedão apontando para a direção positiva, como mostra a figura abaixo.
A direção dos dedos indica a direção de rotação.
Figura 1: Sistema de coordenada usada pelo POV-Ray (POV-RAY, 2010).
Disciplina de Computação Gráfica: Tutorial POV-Ray 8
2 INICIANDO O POV-RAY
Inicialmente, será descrita a criação de uma cena simples, contendo apenas uma
esfera, para entender o funcionamento do POV-Ray. Abra o programa e comece a
edição de um novo arquivo (clique no ícone New). Inclua as linhas abaixo neste novo
arquivo e salve-o com o nome exe01.pov. É importante salientar que o POV-Ray é case
sensitive, portanto deve-se ter cuidado para digitar os comandos exatamente como eles
aparecem.
#include "colors.inc" #include "stones.inc"
O primeiro include é usado para que seja feita a leitura das definições para as
cores, e o segundo para que seja feita a leitura de uma coleção de texturas de pedras.
Outros includes que aparecem na lista a seguir contêm texturas, formas, vidros, metais e
madeiras pré-definidos. Deve-se incluir apenas os arquivos que realmente serão usados
na composição da cena, pois alguns são muito grandes e podendo consumir memória.
#include "textures.inc" #include "shapes.inc" #include "glass.inc" #include "metals.inc" #include "woods.inc"
O próximo passo consiste em adicionar uma câmera. O comando camera
descreve as informações da câmera em uma cena, que consiste na sua posição e no seu
alvo. Estas informações são passadas por meio de um vetor, que é especificado
colocando-se de três valores numéricos entre "<" e ">", separados por vírgulas.
Portanto, adicione no seu arquivo de descrição da cena (exe01.pov) o comando abaixo.
camera {
location <0, 2, -8> look_at <0, 1, 2> }
Agora basta adicionar os objetos que farão parte da cena. Num primeiro
momento, será incluída uma esfera amarela usando o comando abaixo especificado
(acrescente este comando no final do arquivo exe01.pov). Neste comando, o primeiro
vetor especifica o centro da esfera (x,y,z). Após a vírgula é colocado o raio da esfera,
que é duas unidades neste exemplo. Na seqüência é descrita a aparência da esfera pelo
Disciplina de Computação Gráfica: Tutorial POV-Ray 9
comando texture. Com esse comando é possível descrever a cor e as propriedades da
superfície de um objeto. Nesse exemplo está sendo especificada apenas a cor básica,
que é a informação mínima necessária. O brilho e o sombreamento da esfera depende da
luz presente na cena. Como está sendo definida apenas a cor do objeto, ao invés de
especificar como ele deve parecer, este parâmetro é chamado pigment. Existem muitos
padrões de cores pré-definidos que podem ser usados, mas também é possível definir
cores especificas usando a palavra reservada color seguida por Red, Green, Blue, ou
simplesmente rgb (exemplos: color red 1.0 green 0.8 blue 0.8; color rgb <1.0, 0.8,
0.8>).
sphere { <0, 2, 2>, 2 texture { pigment {color White }
} }
Agora é possível gerar a imagem final clicando no botão Run ( ). Observe o
resultado gerado. Para que a imagem pareça 3D falta uma fonte de luz. Se não for criada
uma fonte de luz, a cena fica "no escuro". Para isto, basta adicionar o comando abaixo
no final do arquivo exe01.pov. O vetor indica a posição da fonte de luz, que consiste em
um pequeno ponto invisível que emite luz.
light_source { <2, 4, -3> color White}
Para alterar a cor de fundo da imagem, deve-se utilizar o comando background,
conforme descrito abaixo. O ideal é que este comando seja colocado no início do
arquivo, logo abaixo dos comandos de include.
background { color Blue }
Para que a esfera não fique no ar deve-se colocar um plano.
plane {<0,1,0> 0 pigment { checker Green, Yellow } }
Disciplina de Computação Gráfica: Tutorial POV-Ray 10
Figura2: Imagem gerada pelo exe01.pov
No objeto plane foi usado com o padrão gráfico The Checkered Floor. No
exemplo, foi definido um plano infinito, onde o vetor <0,1,0> é a normal ao plano. O
número que vem após a especificação deste vetor é a distância da origem na qual o
plano foi colocado ao longo da normal. No exemplo, o "chão" foi colocado na posição
y=0. O padrão checker especifica que serão usadas as cores verde e amarela. Olhando
para o chão, se observa que os objetos produzem sombras, que são processadas com
muita precisão pelo ray-tracer.
DICAS:
O POV-Ray possui um excelente recurso de ajuda. Para acessá-lo clique no
menu Help/Help on POV-Ray. Explorando: acesse o menu Help on POV-Ray¸ clique na aba Pesquisar,
digite color. A parte esquerda da tela irá mostrar uma lista de opções que estejam ligadas a palavra color. Dê dois cliques sobre a opção “3.7.3 colors.inc”. Do lado
direito será mostrado as cores pré-definidas, pelo nome. Os pigments também podem ser descritos por valores numéricos de cor
rgb. Por exemplo: color rgb<1,0,0> resulta na cor vermelha. A ferramenta Color
Tools disponível em http://library.thinkquest.org/3285/color_tool.html define os valores rgb para uma determinada cor.
A cada alteração no código, salve-o ante de executá-lo.
Quadro 1: Dicas para o POV-Ray
Disciplina de Computação Gráfica: Tutorial POV-Ray 11
3 OBJETOS 3D
Até aqui foi utilizada apenas uma esfera, entretanto o POV-Ray disponibiliza
outros objetos 3D que podem ser incluídos na cena, tais como cubo, cone, cilindro e
torus.
Abra um novo arquivo, salve com o nome de exe02.pov. Insira no código:
1. As bibliotecas;
2. A câmera;
3. A luz;
4. O backgroud;
5. O plano.
Quadro 2: Orientação para o código do exe02.pov.
3.1 Caixa
Uns dos objetos mais comuns. Ela é definida pela especificação das coordenadas
3D nos cantos opostos. Geralmente o primeiro vetor é a menor coordenada e o segundo
vetor a maior coordenada. Os objetos caixas podem ser rotacionados em qualquer
ângulo.
box { <-1, 0, -1>, // Canto esquerdo mais próximo < 1, 0.5, 3> // Canto direito mais longe
pigment { color OrangeRed } rotate y*30 // Equivalente a "rotate <0,30,0>" }
3.2 Cone
O cone é definido pelo centro e respectivo raio de cada extremidade. No
exemplo dado uma extremidade está em <-2, 1. 0> com raio 0.3 enquanto a outra
extremidade está em <-3, 2, 3> com raio 1. Se quisermos que a extremidade seja um
ponto, então o raio deverá ser zero. O comando open faz com que a extremidades sejam
abertas (exceto para o raio zero).
cone { <-2, 1, 0>, 0.3 // Centro de uma ponta, raio <-3, 2, 3>, 1.0 // Centro de outra ponta, raio open // Remove as extremidades pigment { color BrightGold }
}
Disciplina de Computação Gráfica: Tutorial POV-Ray 12
3.3 Cilindro
O cilindro é semelhante ao cone, defini-se as duas extremidade, porém com um
único raio.
cylinder { <0, 1, 0>, // Centro da primeira extremidade <3, 2, 3>, // Centro da segunda extremidade 0.5 // Raio open // Remove as extremidades pigment{ color MediumOrchid} }
3.4 Torus
O toro é um objeto com formato de argola, na sua definição são usados dois
raios, maior e menor. O objeto toro é criado em torno da origem, por isso, é necessário
aplicar a transformação para usá-lo onde quiser. É um objeto muito usado para criação
de objetos CSG.
torus { 1.5, 0.4 // maior e menor raio pigment { Green } rotate <90,80,0> //definindo a rotação translate <-4,2,0> //definindo a translação }
Figura 3: Imagem gerada pelo exe02.pov
Disciplina de Computação Gráfica: Tutorial POV-Ray 13
4 TEXTURA
A pigmentação é, na realidade, parte de um atributo maior chamado textura. A
razão pelo qual o POV-Ray deixa usar o atributo pigmentação fora da textura é porque a
pigmentação é utilizada tão freqüentemente por si só, que facilita o uso.
O atributo textura contém atributos que descrevem a aparência externa do
objeto: pigmentação, finalização e normal. O atributo pigmentação, descreve a cor do
objeto. O atributo acabamento descreve a forma como o objeto "interage com a luz"
(brilho, brilho metálicos, refletividade, etc.). O atributo normal descreve algumas
características tridimensionais dos objetos, tais como ressaltos, ondas e ondulações.
Vimos, até agora, o uso do atributo cor dentro do atributo pigmentação (por
exemplo, “pigment { color blue }”). O atributo mais flexível, é o mapeamento de cor,
utilizado para fazer uma grande variedade de coisas. Basicamente, um mapeamento de
cor define faixas de cores em um "mapa" que vão de 0.0 a 1.0 Vejamos um exemplo
simples:
Color_map { [0.0 0.25 color Red] [0.25 0.9 color Blue] [0.9 1.0 color Green]
}
Este exemplo define três faixas de cores: vermelho de 0,0 até 0,25, azul de 0,25
até 0,9 e verde e de 0,9 até 1,0. Outro formato comumente utilizado tem o seguinte
aspecto:
Color_map { [0.0 color Red] [0.25 color Blue] [0.9 color Green]
}
Ambos os exemplos fazem a mesma coisa, o primeiro contém um pouco mais de
informações sobre as bandas de começo e parada.
O POV-Ray pode fazer várias coisas com isto através dos muitos tipos de
pigmentação. Os pigmentos dão vida às imagens de ray tracing. O POV-Ray suporta
uma vasta gama de tipos de pigmentação, com um número infinito de maneiras eficazes
para alterá-los conforme as necessidades. E se ainda não for suficiente, é possível
mapear a imagem usando texturas em vez de apenas cores. Enfim, a forma geral para
especificar um pigmento é a seguinte:
Disciplina de Computação Gráfica: Tutorial POV-Ray 14
pigment { // É necessário um desses: pigment tipo /* OU */ color cor /* OU */ image_map { /* Especificações do mapeamento da imagem */ } // Todos a seguir são opcionais: color_map { /* Entradas do mapeamento de cor */ } frequency frequência
lambda valor lambda
octaves número de oitavas
omega valor omega
phase fase
quick_color cor
turbulence valor ou vetor de turbulência /* qualquer transformação aparece aqui */ }
Quadro 3: Forma geral da declaração de pigmentação
Qualquer número de transformações (rotações, translações e escalas) pode seguir
a declaração de pigmentação, mas deve ser especificado após o último modificador do
mesmo.
Uma pigmentação é composta por três partes principais, em primeiro lugar o tipo
da pigmentação, então o mapeamento de cor, e finalmente a turbulência. O mapeamento
de cor e a turbulências são opcionais. O tipo de pigmentação pode ser: ágata (agate),
palhaço (bozo), tabuleiro de xadrez (checker), gradiente (gradient), granito (granite),
hexágono (hexagon), leopardo (leopard), mármore (marble), mandel, cebola
(onion), ou madeira (wood).
O segundo tipo de modificador é o mapeamento de cor, visto anteriormente. Os
modificadores são a freqüência, que estende ou comprime o mapeamento de cor, e de
fase, que muda as cores do mapa. A terceira parte da pigmentação é a especificação de
turbulência. É usado basicamente para misturar um pouco o pigmento, o que pode dar
vida a ele. Ela pode assumir qualquer valor (turbulence 0.8) ou um vetor de três
componentes (turbulence <0, 0.9, 0.3>). Quanto maior o valor, maior é a
turbulência.
4.1 Atributo: pigmentação
A pigmentação gradiente cria planos paralelos de pigmentações de cor. A
orientação desses planos é controlada com o parâmetro do gradiente. O parâmetro 3 é
Disciplina de Computação Gráfica: Tutorial POV-Ray 15
um componente normal do vetor que descreve os planos de cor (todos têm a mesma
normal, pois são paralelas). Note que a magnitude do vetor é irrelevante, desde que não
seja zero. Para controlar a largura das faixas de cores, use a palavra-chave “frequency”
(frequência).
Abra um novo arquivo, salve com o nome de exe03.pov. Insira no código:
1. As bibliotecas;
2. A câmera;
3. A luz;
4. O backgroud.
Quadro 4: Orientação para o código do exe03.pov.
Vamos criar um objeto para aplicar alguns tipos de pigmentação.
sphere { <0,0,0>, 5 pigment { gradient <0, 1, 0> color_map { [0.0 color Red] [0.25 color Blue] [1.0 color Green] } scale 3 } }
O vetor após a palavra-chave gradient é o vetor normal para a orientação das
faixas de cores. A declaração da escala aplica-se à pigmentação, e não ao objeto.
Figura 4: Imagens com alteração do gradiente: <0,1,0>; <1,1,1>; <1,0,0>
Podemos adicionar uma turbulência, após a escala, com o valor 2 e observar o
resultado (turbulence 2) na figura 5.
Disciplina de Computação Gráfica: Tutorial POV-Ray 16
Figura 5: Imagem com aplicação de turbulência.
Os outros tipos de pigmentação têm algumas semelhanças com a pigmentação
gradiente, porém com suas próprias características. Abaixo estão os exemplos de
imagens com as demais pigmentações, a inserção no código é igual ao da pigmentação
gradiente sem a definição x, y e/ou z.
Figura 6: Imagem com
pigmentação mármore.
Figura 7: Imagem com
pigmentação mármore com
turbulência.
Figura 8: Imagem com
pigmentação ágata.
Figura 9: Imagem com
pigmentação palhaço.
Figura 10: Imagem com
pigmentação manchada.
Figura 11: Imagem com
pigmentação granito.
Disciplina de Computação Gráfica: Tutorial POV-Ray 17
Figura 12: Imagem com
pigmentação leopardo.
Figura 13: Imagem com
pigmentação madeira.
Outros dois tipos de pigmentação são o tabuleiro de xadrez e o hexágono, que
não funcionam com mapeamento de cores. No tabuleiro de xadrez apenas duas cores
são especificadas elas formarão um tabuleiro de xadrez, figura 14, e aceita o
modificador de turbulência, figura 15.
Figura 14: Imagem com pigmentação tabuleiro
de xadrez
Figura 15: Imagem com pigmentação tabuleiro
de xadrez e turbulência.
Por padrão, o hexágono é projetado para o plano x e z, produzindo um tipo de
pilar hexagonal no eixo y. São especificadas três cores que são usadas para criar um
padrão hexagonal sobre os objetos.
Figura 16: Imagem com pigmentação hexágono.
Disciplina de Computação Gráfica: Tutorial POV-Ray 17
O mapeamento de imagem é uma técnica utilizada para produzir cores e padrões
específicos na superfície de um objeto. Ele, basicamente lê um arquivo de imagem e,
em seguida, projeta essa imagem para o objeto. Por padrão a imagem é projetada no
plano xy. Caso queira mudar a posição da imagem, é possível rodar e escalar a imagem,
também é possível alterá-la (até certo ponto) com os modificadores do “map_type”. A
seguir é mostrado um exemplo de declaração:
image_map { tipo "nome_do_arquivo.tipo" //modificadores (são opcionais) Interpolate valor
Filter paleta_de_cor, porcentagem_de_tranparência }
Quadro 5: Sintaxe do mapeamento de imagem.
O tipo pode ser “gif”, “tga”, “iff”, “png” ou outro, seguido do nome do arquivo
(entre aspas), que especifica o arquivo de imagem a ser mapeada.
Como exemplo para usar o mapeamento de imagem abra um novo arquivo com
o nome exe04.pov e digite o seguinte código.
#include "colors.inc" //------definicao da camera ------- camera { location <8, 6, -26> } light_source { <10,10,-30> color rgb <1,1,1> area_light <4, 0, 0>, <0, 0, 4>, 4, 4 // 4*4 = 16 pontos de luz } background { color SkyBlue } plane { <0, 1, 0>, -0.1 pigment { granite color_map { [0.0 color DarkOliveGreen] [0.25 color Green] [1.0 color CadetBlue ] } scale 2 } } polygon { 4, <0,0,0>,<20, 0,0>, //pontos de ida <20,10,0.4>,<0,10,0.4 > //pontos de volta pigment { image_map { png "parede_frente.png" } scale <20,10,0> } }
Disciplina de Computação Gráfica: Tutorial POV-Ray 18
Figura 17: Cena com o mapeamento de imagem, exe04.pov.
Neste exemplo foi utilizado o objeto polígono, no caso para definir um
retângulo. Um polígono pode ser usado para criar qualquer forma planar. Ele é definido
pelo número de pontos que descrevem sua forma. No exe04.pov foram utilizado 4
pontos para definir o retângulo. Na figura 18 foi definido um polígono com 24 pontos
para a estrada a esquerda, que faz uma curva.
Figura 18: Cena usando polígonos.
4.2 Atributo: finalização
A finalização descreve como os objetos interagem com a luz, ou seja, como eles
refletem, como será o brilho, a transparência etc. Todos os atributos de finalização são
fechados em um bloco {}
finish { /*todos os atributos são opcionais*/ ambient luz_ambiente brilliance brilho
Disciplina de Computação Gráfica: Tutorial POV-Ray 19
crand valor_crand diffuse luz_difusa ior indice_de_refração metallic phong valor_phong phong_size tamanho_do_phong reflection luz_de_reflexão refraction refração roughness rugosidade specular polido }
Quadro 6: Forma geral da declaração de finalização
O atributo ambiente controla o quanto da cor de uma superfície é proveniente da
iluminação ambiente. Seu valor varia no intervalo de 0,0 a 1,0, o valor padrão é 0.1
Valores baixos significam que os objetos que não estão diretamente iluminados e
manterão algumas das suas cores, valores maiores podem fazer com que o objeto pareça
estar brilhando.
O atributo brilho modifica o comportamento da iluminação difusa, seu valor
padrão é 1.0. A forma como funciona a iluminação difusa consiste em calcular o ângulo
entre a superfície e o raio de luz. Usando o brilho, podemos chegar a um efeito mais
metalizado.
O atributo crand, figura 20, pode ser usado para simular superfícies rugosas,
como concreto e areia, pois ele deixa as superfícies com um aspecto granulado. Os
valores do crand variam de 0,0 a 1,0, sendo o padrão 0.0. É bom lembrar que o
crand é completamente aleatório, ou seja, possivelmente teremos dois resultados
diferentes usando a mesma imagem.
Figura 20: Imagem com finish {brilliance 5}na esfera e finish {crand 0.6} no cone.
O modelo de iluminação difusa é a principal maneira de diferenciar como os
objetos são iluminados. Por padrão a maior parte da coloração de um objeto vem da
iluminação difusa, pois ela é, basicamente, a luz que vem de uma fonte luminosa e
difunde em todas as direções. Uma superfície que tem a fonte luminosa diretamente
Disciplina de Computação Gráfica: Tutorial POV-Ray 20
voltada para ela irá aparecer mais brilhante do que uma superfície que é iluminada a
partir de um ângulo muito baixo de reflexão de luz. O atributo difusão pode modificar
esses efeitos, seu valor varia de 0,0 (ausência de luz a partir de fontes de luz) para 1,0
(muito bem iluminado), sendo o valor padrão 0.6.
Talvez o atributo da finalização mais usado seja o atributo phong, figura 21. O
phong cria um destaque em um objeto que na verdade é a cor da fonte luminosa, seu
valor varia entre 0.0 e 1.0, quanto maior, mais brilhante será o objeto. Isto é feito
através da comparação do ângulo em que está o observador e o ângulo em que a luz
incide na superfície, caso esses ângulos sejam opostos e aproximadamente iguais, a cor
da luz é misturado na cor do objeto.
Existe também um modificador do phong, o parâmetro “phong_size”, figura
21, ele define o tamanho do brilho e pode dar impressão de uma superfície muito polida.
Os valores típicos variam entre 1 a 250 (muito brilhante), mas o padrão é 40. Outro
modificador para phong é o metálico, o que significa que o brilho destacado em um
objeto deve ser modificado pela cor da sua superfície, e não apenas determinado
unicamente a partir da cor da fonte luminosa. O metálico não possui parâmetros, ou
seja, ou o objeto é metálico ou não é.
Figura 21: Imagem com finish {phong 0.9}na esfera e finish {phong 1 phong_size
2} no cone.
Outro atributo da finalização é o polido (specular), é muito semelhante ao
phong, mas este é mais preciso de acordo com as leis físicas, pois produz um destaque
sobre o objeto onde seria o reflexo caso o objeto fosse reflexivo. Seus valores podem
variar entre 0.0 e 1.0 e o padrão é não destacar o brilho (0.0). O tamanho do realce pode
ser controlado, com ao parâmetro rugosidade.
Disciplina de Computação Gráfica: Tutorial POV-Ray 21
A reflexão é outro atributo da finalização, ela dá ao objeto um acabamento
espelhado ou parcialmente espelhado e este objeto irá refletir outros objetos da cena. A
reflexão admite valores entre 0.0 e 1.0, quanto maior o valor, mais espelhado o objeto
fica, sendo que o valor 0.0 desativa a reflexão. Para obter um refletor absolutamente
perfeito, também é preciso especificar "ambient 0" e "diffuse 0” em sua declaração de
finalização. Normalmente os valores de reflexão não precisam ser elevados em objetos
que não são exatamente espelhos, até mesmo para superfícies de vidro uma reflexão
valor de 0,1 é suficiente para torná-la realista. Outra coisa para se saber é que quanto
mais reflexão tiver, mais tempo será necessário para renderizar, pois para cada raio que
atinge um objeto reflexivo, outro raio tem que ser rastreado para determinar que o
primeiro reflete a superfície.
Figura 22: Imagem com finish { specular 0.5 roughness 0.75} na esfera e finish {
phong 1 reflection 0.3} no cone.
O atributo refração só tem sentido em objetos que têm pelo menos um pouco de
transparência. A refração é a flexão dos raios luminosos que passam para uma forma
mais densa ou menos densa. Sem refração, os objetos transparentes possuem a aparência
de ar colorido. Ela só possui dois valores: 0 (desativa a refração) e 1 (ativa a refração).
Valores entre 0 e 1 fazem com que a luz escureça, portanto, a forma mais adequada para
reduzir o brilho da luz refratados é mudar a especificação de cores e de transparência na
declaração da pigmentação.
É preciso lembrar que o valor da refração igual a 1 não faz com que um objeto
fique transparente, é necessário usar transparência no seu pigmento para fazer um objeto
transmitir luz.
Indicando "refraction 1" sozinha não irá mudar a forma como a luz aborda o
objeto, ainda parecerá um ar colorido. Isto porque, por padrão, o ior (índice de
Disciplina de Computação Gráfica: Tutorial POV-Ray 22
refração) é o mesmo que o de espaço vazio. O índice de refração descreve o quanto a
luz “dobra” quando ela passa para dentro e para fora de um objeto. Seus valores são
positivos e, normalmente, superiores a 1.0 (espaço vazio é 1.0).
4.3 Atributo: normal
A componente normal de uma textura permite que você crie efeitos 3D sobre a
superfície de um objeto. Uma vez que grande parte do nosso modo de perceber objetos
baseia-se na forma como eles refletem luz, é possível enganar o olho, fazendo uma
superfície ficar acidentada apenas modificando o vetor normal. Isto é o que o
modificador "normal" faz. Digamos que se quisesse criar um lago com ondulações em
toda a sua superfície, fazer isso matematicamente seria muito trabalhoso, então o POV-
Ray oferece a habilidade de modificar a maneira como luz reflete fora da superfície.
Vale lembrar que especificar um modificador normal para um objeto na
realidade não muda a localização da superfície, apenas o torna diferente na observação.
Normal { tipo /* OU */ bump_map { /* especificação do mapeamento de batida*/ } /* modificadores aqui*/ /* qualquer rotação, escala, e translação vem aqui */ }
A normal possui três partes, o tipo, os modificadores e, em seguida, as
transformações. Uma normal só pode ter um tipo: batida (bumps), acidentes (dents),
ondulações (ripples), oscilações (waves) ou rugas (wrinkles). Cada um possui valores
entre 0,0 (calmo) e 1,0 (violento).
Um modificador que a normal pode ter é a turbulência (vista anteriormente), ela
realmente pode criar normais malucas. Apenas dois tipos de normal (ondulações e
oscilações) respondem aos modificadores "frequence" e "phase", a freqüência controla a
densidade das ondulações ou oscilações, enquanto a fase controla sua localização. As
transformações que são aplicadas a normal só alteram as localizações dos componentes
normais.
A normal batida, figura 23, cria um padrão aleatório acidentado sobre o objeto.
Na verdade, ele usa um padrão semelhante à pigmentação palhaço. Os valore variam de
0,0 (liso) para 1,0 (Serrilhado), eles que descrevem a profundidade das batidas.
Disciplina de Computação Gráfica: Tutorial POV-Ray 23
A normal acidente, figura 23, faz, basicamente, com que o objeto fique como se
tivesse sido atacado com uma marreta.
Figura 23: Imagem com normal { bumps 1 scale 1/4} na esfera e normal { dents 1
scale 1/4 } no cone.
A normal ondulação, figura24, cria suaves ondulações nas superfícies. Assim
como a ondulação, a oscilação, figura 24, cria ondas na superfície, porém as ondas são
embaralhadas. Teoricamente estas parecem profundas ondas do mar.
A normal ruga, figura 24, faz com que o objeto pareça que foi amassado.
Figura 24: Imagem com normal { waves 1.0 scale 1/4} na esfera, normal { ripples
1.0 scale 1/4 } no cone e normal {wrinkles 1 scale 1/4} na esfera.
Aprendemos, então, a incluir texturas nos objetos. Mas devemos saber que o
POV-Ray possui uma biblioteca completa de texturas chamada “textures.inc”, que pode
ser incluída.
Dica: Note que é preciso incluir “colors.inc” antes de “textures.inc”, pois “textures.inc”
utiliza a biblioteca de cor.
Quadro 7: Dica de texture.inc.
Disciplina de Computação Gráfica: Tutorial POV-Ray 24
5 CSG
CSG (Constructive Solid Geometry) é uma técnica que cria novos objetos a
partir de combinações de outros objetos. Desse modo, objetos primitivos podem assumir
formas mais construtivas, é possível retirar partes de objetos, adicionar partes
(mantendo dois objetos juntos) e entre outras operações, esculpindo-o da maneira que
desejar. A sintaxe é simples:
CSG_operator { object_1 object_2 etc. }
Quadro 8: Sintaxe para CSG.
A seguir, teremos exemplos e explicações de todos os operadores (união, junção,
diferença e intersecção).
5.1 União
A união é, talvez, o operador de CSG mais simples, ela é usada para combinar
grupos de objetos juntos em um objeto lógico.
Figura 25: Exemplo matemático da união (HELP, 2003)
Abra um novo arquivo, salve com o nome de exe05.pov. Insira no código:
1. As bibliotecas;
2. A câmera;
3. A luz;
4. O backgroud.
Quadro 9: Orientação para o código do exe05.pov.
Para exemplificar a união acrescente no exe05.pov a definição dos triângulos
contido no arquivo “codUnion.txt”. A imagem resultante será como a figura 20.
Disciplina de Computação Gráfica: Tutorial POV-Ray 25
Figura 26: Imagem gerada pelo exe05.pov, união.
Podemos criar um objeto com um grande número de componentes e agrupá-los
em uma união, depois disso, transformá-los, transformando apenas a união em vez de
ter de transformar todos os objetos individuais. Além disso, a textura também pode ser
usada no objeto como um todo.
Dica:
Acrescente a textura:
texture { Jade }
Quadro 10: Dica de textura.
5.2 Junção
O operador junção é muito semelhante à união, pois possui basicamente a
mesma finalidade, juntando um grupo de objetos e formando apenas um. A junção, no
entanto, difere da união pelo fato de que as superfícies que estão dentro do objeto são
removidas. De qualquer maneira, isso não tem importância em objetos opacos, porque
as superfícies internas não são visíveis.
Figura 27: Exemplo matemático da junção (HELP, 2003)
merge{ sphere{<0,1,0>,0.35} cone{<0,-1,0>,1,<0,1.2,0>,0} pigment{color rgbf <0,0,1,0.6>} translate <3, 0, 0> }
Disciplina de Computação Gráfica: Tutorial POV-Ray 26
Figura 28: Imagem gerada pelo exe05.pov, junção.
Dica:
Para observar a diferença de união e junção, troque o “merge” da junção por
“union”. Você vai observar a ponta do cone dentro da esfera, na junção essa ponta é
excluída.
Quadro 11: Dica: diferença entre junção e união.
Mais informação:
Observe que o objeto está transparente. Além do vetor RGB, as cores no POV-
Ray podem ser especificadas pelo vetor RGBF. O vetor RGBF possui um elemento
extra quando comparado ao RGB, esse elemento (F) funciona como um filtro de
transparência, variando de 0,0 (sem transparência) a 1,0 (100% transparente).
Quadro 12: Dica: informação sobre RGBF.
5.3 Diferença
A diferença é utilizada para esculpir as formas de um objeto. A diferença é
especificada da mesma forma que as outras especificações de CSG. O primeiro objeto
especificado é o objeto na qual se quer esculpir, os objetos subsequentes são utilizados
para esculpir o primeiro objeto. A diferença é o único objeto CSG em que a ordem dos
objetos importa.
Figura 29: Exemplo matemático da diferença (HELP, 2003)
Disciplina de Computação Gráfica: Tutorial POV-Ray 27
difference { sphere { <0, 0, -1>, 1 translate 0.5*x pigment { Yellow } rotate 90*y finish { Shiny } } cylinder { <-0.5, 0, -2> <0, 0, 1>, .55 pigment { Magenta } } translate <9,0,0> rotate <0,25,0> }
Figura 30: Diferença entre união e diferença (à esquerda há uma união entre os objetos e à
esquerda uma diferença).Imagem gerada pelo exe05.pov.
A primeira figura é a união de uma esfera com um cilindro, já a segunda é a
diferença, podemos notar que permaneceu o “encaixe” do cilindro na circunferência.
5.4 Interseção
A intersecção de dois ou mais objetos é composta por todos os pontos que estão
dentro de todos os objetos ao mesmo tempo. A ordem dos objetos enumerados na
declaração não importa.
Figura 31: Exemplo matemático da interseção (HELP, 2003)
intersection{ box {<-0.5,-0.5,-0.5>,< 0.5,0.5,0.5> texture{pigment{color Orange } finish {ambient 0.15
Disciplina de Computação Gráfica: Tutorial POV-Ray 28
diffuse 0.85}} } sphere{<0,0,0>,0.66 texture{pigment{color OrangeRed} finish {ambient 0.15 diffuse 0.85}} } rotate<0,-30,0> translate<3.5,-0.1,-6> }
Figura 32: Diferença entre união e intersecção (à esquerda há uma união entre os objetos e à
direita uma intersecção). Imagem gerada pelo exe05.pov.
O resultado é o volume corresponde ao espaço que está contido no interior de
ambos os objetos. Podemos notar a diferença das cores na fronteira do objeto, o que é
vermelho está no limite da esfera e o que é laranja está no limite da caixa.
Apesar de todos os recursos, pode ocorrer uma situação em que nem as
primitivas geométricas do POV-Ray usando CSG serão suficientes para descrever um
objeto. Neste caso, existem duas opções:
1. A primeira será especificar o objeto em termos matemáticos.
Obviamente, essa opção é muito difícil, a não ser que se saiba o que está
fazendo.
2. A segunda opção é usar um programa modelador. O programa pode fazer
uma modelagem extremamente complexa usando indicações simples,
como as primitivas geométricas. É possível encontrar bons programas de
modelagem (muitos gratuitos e shareware), assim você irá economizar
tempo e esforço.
Disciplina de Computação Gráfica: Tutorial POV-Ray 29
6 ILUMINAÇÃO
A declaração “ light_source” permite declarar vários tipos de luzes para a sua
cena. Existem quatro tipos de fontes de luz que podem ser definidas. A mais básica é a
luz pontual, que é um ponto geométrico a partir do qual emanam raios luminosos para
todos os lados. Suas propriedades são apenas a sua cor e a sua posição. O segundo tipo é
o foco de luz, estes são, basicamente, fontes de luz pontuais que emanam raios
luminosos apenas em certas direções. O terceiro tipo é a área luminosa, estas não são
mais simples pontos de luz, mas sim um conjunto de luz que pode ser utilizado para
tornar as sombras mais realista. O quarto tipo é uma área de foco de luz, que nada mais
é do que uma área de luz direcional.
Como sabemos, os dois componentes necessários de uma fonte de luz são a sua
localização e sua cor, portanto, todas as fontes de luz deve ter estes dois componentes.
A localização é um vetor de três posições <x, y, z>. A cor é parâmetro utilizado para
definir a cor da fonte luminosa.
Os focos de luz são utilizados para, como o nome já diz, criar focos de luz. Eles
servem para enfatizar partes de uma cena, ou apenas selecionar os objetos que serão
iluminados.
A área luminosa cria uma área que emite luz, muito bom para criar cenas mais
reais. Ela pode ser usada em conjunto com o foco de luz, desse modo os dois efeitos são
somados para determinar a iluminação da cena.
O parâmetro “ looks_like” pode ser usado para atribuir uma "forma" para a luz.
Uma iluminação simples,
// luz light_source { <0,20,-30> color rgb <1,1,1> //cor branca }
6.1 Foco de luz
Todos os parâmetros do foco de luz precisam ser especificados com exceção do
tightness, este é opcional. Em um foco de luz, podem ser considerados dois cones de
luz coaxiais. O cone interno é totalmente iluminado pela luz e seu raio angular é
indicado pela palavra-chave "radius". O cone externo é a região em que a luz não
chega(falloff).
A palavra chave “tightness” pode ser usada para controlar o modo como a luz
cai na parte apagada, entre os ângulos radius e falloff. Veja o exemplo:
Disciplina de Computação Gráfica: Tutorial POV-Ray 30
light_source { <0,20,-30> color rgb <1,1,1> spotlight point_at <0, 0, 0> radius 20 falloff 20
}
O “point_at” é similar ao “ look_at” na declaração da câmera, ele define a direção
do foco de luz. O valor do radius indica, como foi dito, o ângulo da parte iluminada,
portanto se ele for menor, um feixe menor de luz irá incidir na cena, caso seja maior um
feixe maior de luz incidirá na cena. O valor de falloff indica o ângulo da parte que está
apagada, caso o valor seja menor do que o do radius nada irá mudar, pois a parte
apagada fica iluminada. Caso o valor de falloff seja maior que o valor do radius haverá
uma leve sombra entre a parte acesa e a parte apagada da cena.
6.2 Área luminosa
As áreas luminosas são utilizadas para espalhar a sombra e torná-la mais realista.
A área luminosa espalha a intensidade da luz para fora em um retângulo, uma vez que a
luz tem um espaço, ela pode ser parcialmente bloqueada, deixando as sombras com
bordas suaves.
Este tipo de fonte de luz possui dimensões em dois eixos, que são especificados
através de dois vetores. Também é necessário especificar quantas luzes haverá, e é
possível definir um valor adaptativo que diz para o Ray-tracer que ele pode se adaptar a
uma situação e enviar somente os raios necessários para determinar o valor dos pixels.
Caso este parâmetro não seja usado, um raio separado será enviado para cada fonte de
luz na área light, o que faz com que o tempo de processamento aumente. Quanto maior
o valor, mais delineada a umbra ficará e mais lento a imagem será gerada. Geralmente é
utilizado o valor 1 para este parâmetro. Outro parâmetro, jitter, diz para o Ray-tracer
mover suavemente a posição de cada fonte de luz na área light para que as sombras
sejam visualizadas.
light_source { <0,20,-30> color rgb <1,1,1> spotlight area_light <4, 0, 0>, <0, 0, 4>, 8, 8 //adaptive 20 jitter
}
Disciplina de Computação Gráfica: Tutorial POV-Ray 31
7 LINGUAGEM
Até agora, a criação de um grande número de objetos similares tem sido um
exercício de “copiar e colar”. Veremos, então, que o POV-Ray proporciona uma
funcionalidade poderosa e flexível para criar muitos objetos similares usando uma
declaração. A declaração deve ser do tipo “#declare” e pode ser utilizada para criar um
novo tipo de objeto (ou pigmentos, ou textura, ou quase tudo) que você pode usar e re-
usar sempre que quiser.
Abra um novo arquivo, salve com o nome de cena.pov. Insira no código:
1. As bibliotecas;
2. A câmera;
3. A luz;
4. O backgroud.
Quadro 13: Orientação para o código do cena.pov.
No código abaixo, usando CSG, foi definido uma árvore.
//-----------------definicao da arvore------------------------ #declare arvore= union { //Desenhando as arvores cylinder { <-3,-2, -1>, <-3, 2, -1>, -0.4 pigment { gradient <0, 1, 0> color_map { [0.0 color DarkWood] [0.25 color DarkPurple] [1.0 color Flesh] } scale 8 turbulence 10 } } sphere { <-3, 3, -1>, 1.9 pigment { gradient <0, 1, 0> color_map { [0.3 color DarkOliveGreen ] [0.2 color DarkSlateGray] [0.8 color Green] } scale 5 turbulence 10} } } ;
Disciplina de Computação Gráfica: Tutorial POV-Ray 32
//----------------- fim definicao da arvore------------------------
Esta é uma declaração de um novo tipo de objeto chamado "arvore", que agora
podemos usar mais tarde no código fonte, desta maneira:
//------------------------- incluindo uma arvore--------------------- #local Here = <-2,1,-5.5>; object {arvore translate Here scale 0.5} #local Here = <-35,-1,4.5>; object {arvore translate Here scale <0.3,0.7,0.3>} #local Here = <-35,-1,7>; object {arvore translate Here scale <0.3,0.7,0.3>} #local Here = <-38,-1,7>; object {arvore translate Here scale <0.3,0.7,0.3>} #local Here = <-11,1,-9>; object {arvore translate Here scale <0.8,1,0.5>} //----------------------fim-----------------
A declaração do objeto diz ao POV-Ray para criar um objeto do tipo
"arvore". Podemos colocar na declaração qualquer objeto que iremos usar.
A linguagem de programação do POV-Ray traz vários outros recursos que
podem se consultado no Help, o #declare e o #local foram somente dois exemplos.
Disciplina de Computação Gráfica: Tutorial POV-Ray 33
8 EXERCÍCIO: CRIANDO UMA CENA
Implemente os passos a seguir para criar uma cena que possui um prédio, várias
árvores, calçada e rua.
1. Abra um novo arquivo, salve com o nome cena.pov.
2. Insira a biblioteca #include "colors.inc".
3. Insira a câmera.
4. Insira a luz.
5. Insira o background, { color DarkTurquoise }.
6. Insira um plano, color Green.
7. Faca um poste usando CSG, union:
a. Construa um cilindro, com as seguintes características:
i. cylinder { <0, 0, 0>, <0, 3, 0>, 0.1 // Raio
ii. pigment{ color DarkSlateGray}}
b. Construa uma esfera, com as seguintes características:
i. { <0, 3, 0>, 0.5
ii. pigment { color Yellow}
c. Construa um cone, com as seguintes características:
i. <0, 4, 0>, 0
ii. <0, 3.5, 0>, 1.0
iii. pigment { color BrightGold }
d. Depois de criado duplique o objeto e distribua na cena
8. Construa uma caixa com 20 de altura(em y), 15 de largura (em x) e 20 de
profundidade (em z). Coloque-o do lado esquerdo do cilindro, a distância
de 1, para o fundo e para o lado.
9. Construa outra caixa com 3 de altura (em y), 10 de largura (em x) e 14
de profundidade (em z). Coloque-o do lado direito do cilindro, a
distância de 1, para o fundo e para o lado.
10. Construa uma calçada que passe em frente às construções, usando um
polígono de 4 vértices, comprimento (em x) de 20 e largura (em z) de 2.
11. Coloque árvores na cena, usando o código da seção 7.
12. Usando CSG, crie caixas pra fazer as janelas e portas. Use declaração.
13. Usando CSG, crie o teto do prédio, azul. Use uma esfera e uma caixa
com diferença.
Disciplina de Computação Gráfica: Tutorial POV-Ray 34
14. Construa a rua, as faixas amarelas, e as calçadas usando um polígono
com quatro pontos.
15. Acrescente mais características a cena, exemplo figura 33.
Figura 33: Imagem do exercício criando uma cena.
Disciplina de Computação Gráfica: Tutorial POV-Ray 35
REFERÊNCIAS
POV-RAY. Introduction to POV-Ray. Disponível em: http://www.povray.org/. Acesso em: 07 out. 2010.
HELP on POV-Ray. Disponível no software POV-Ray, 2003.
Disciplina de Computação Gráfica: Tutorial POV-Ray 36
ANEXO A – Arte no POV-Ray
Imagens disponíveis no “Hall of Fame”, http://hof.povray.org/.
Figura 34:Pebbles by Jonathan Hunt
Figura 35:Bonsais by Jaime Vives Piqueres
Figura 36:Patio by Jaime Vives Piqueres
Figura 37:Glasses by Gilles Tran
Figura 38:The Kitchen by Jaime Vives Piqueres
Figura 39:Car Study by René Bui
Disciplina de Computação Gráfica: Tutorial POV-Ray 37
Figura 40:The Dark Side of the Trees by Gilles
Tran
Figura 41:Forgotten Neighbourhood by Hildur
Kolbrun Andresdottir
Figura 42:The Wet Bird by Gilles Tran
Figura 43:The Cool Cows by Gilles Tran