Académique Documents
Professionnel Documents
Culture Documents
Tutorial POV-Ray
Aluna de graduação:
Professoras:
Rosane Minghim
Maria Cristina Ferreira de Oliveira
SUMÁRIO
Índice de figuras............................................................................................3
Índice de quadros...........................................................................................5
Índice de tabelas............................................................................................7
1. Introdução..................................................................................................8
2. História......................................................................................................9
3. Adquirindo a ferramenta.........................................................................10
4. Princípios Básicos...................................................................................11
5. Objetos.....................................................................................................14
6. Textura.....................................................................................................28
6.3 Finalização........................................................................................................40
6.4 Normal..............................................................................................................48
7. CSG.........................................................................................................58
8. Iluminação...............................................................................................65
9. A linguagem............................................................................................71
10. Animações.............................................................................................78
11. Conclusão..............................................................................................82
2
LISTA DE FIGURAS
Figura 3.1 Imagens geradas pelos códigos inclusos no pacote POV-Ray ..11
Figura 4.1 Eixo de coordenadas do POV-Ray e exemplo da mão direita...12
Figura 5.1 Cores inclusas na biblioteca “colors.inc”...................................16
Figura 5.2 Exemplo da cena de uma esfera vermelha sem iluminação.......18
Figura 5.3 Exemplo da cena de uma esfera vermelha iluminada................20
Figura 5.4 Cilindro......................................................................................21
Figura 5.5 Cone...........................................................................................21
Figura 5.6 Caixa..........................................................................................22
Figura 5.7 Triângulo....................................................................................22
Figura 5.8 Bolha..........................................................................................23
Figura 5.9 Esfera no centro de um disco.....................................................24
Figura 5.10 Arquivo de imagem e campo alto da imagem no POV-Ray....25
Figura 5.11 Exemplificação da regra da mão esquerda para rotações........27
Figura 5.12 Toro que passou por transformações.......................................28
Figura 6.2.1 Esfera com pigmentação gradiente.........................................32
Figura 6.2.2 Esferas com diferentes valores de pigmentação gradiente.....33
Figura 6.2.3 Turbulência aplicada em uma esfera.......................................33
Figura 6.2.4 Esferas com pigmentação mármore........................................34
Figura 6.2.5 Esfera com pigmentação ágata................................................35
Figura 6.2.6 Esfera com pigmentação palhaço............................................36
Figura 6.2.7 Esfera com pigmentação manchada, granito, leopardo e
madeira respectivamente.........................................................36
Figura 6.2.8 Esfera com pigmentação tabuleiro de xadrez.........................37
Figura 6.2.9 Esfera com pigmentação hexágono........................................38
Figura 6.2.10 Arquivo de imagem e pigmentação mapeamento de imagem
no POV-Ray..........................................................................39
Figura 6.3.1 Diferença entre uma esfera padrão e uma com iluminação
Ambiente................................................................................41
Figura 6.3.2 Esfera com brilho....................................................................41
Figura 6.3.3 Esfera com finalização crand..................................................42
Figura 6.3.4 Esfera com difusão..................................................................43
Figura 6.3.5 Caixa e esfera com finalização phong....................................44
Figura 6.3.6 Esfera com diferentes valores de phong size..........................44
Figura 6.3.7 Esfera com finalização metálica.............................................45
Figura 6.3.8 Esfera com finalização pálida e valores de valores de
Rugosidades............................................................................46
Figura 6.3.9 Esfera com reflexo..................................................................47
Figura 6.3.10 Esfera com refração e diferentes valores de ior....................48
Figura 6.4.1 Cena de uma esfera comum....................................................50
3
Figura 6.4.2 Esfera batida............................................................................51
Figura 6.4.3 Esfera acidentada....................................................................51
Figura 6.4.4 Esfera com normal ondulação.................................................52
Figura 6.4.5 Esfera com normal oscilação..................................................52
Figura 6.4.6 Esfera com normal ruga..........................................................53
Figura 6.4.7 Cone com finalização normal.................................................55
Figura 6.4.8 Plano com finalização normal.................................................55
Figura 6.4.9 Esfera com textura Jade..........................................................56
Figura 6.4.10 Textura contidas na biblioteca (Parte 1)...............................57
Figura 6.4.11 Textura contidas na biblioteca (Parte 2)...............................57
Figura 7.1 Exemplo matemático de união...................................................59
Figura 7.2 União feita com triângulos.........................................................60
Figura 7.3 Diferença entre união e junção..................................................61
Figura 7.4 Exemplo matemático de diferença.............................................61
Figura 7.5 Diferença entre união e diferença..............................................62
Figura 7.6 Exemplo matemático de intersecção..........................................62
Figura 7.7 Diferença entre união e intersecção...........................................63
Figura 7.8 Exemplo matemático de inversão..............................................63
Figura 7.9 Diferença entre união e inversão................................................64
Figura 8.1 Cena com iluminação pontual simples......................................67
Figura 8.2 Cena com foco de luz pontual....................................................68
Figura 8.3 Cena com foco de luz pontual com fallof maior que radius......68
Figura 8.4 Cena com foco de luz e tightness...............................................69
Figura 8.5 Cena com iluminação feita por uma área luminosa...................70
Figura 8.6 Cena com iluminação feita por uma área de foco luminoso......71
Figura 9.1 Cena feita utilizando declaração de objetos...............................73
Figura 9.2 Cena feita utilizando declaração de texturas..............................74
Figura 9.3 Cena feita utilizando declaração de controle de fluxo...............78
Figura 10.1 Cena que será utilizada para animação....................................79
Figura 10.2 Frames gerados pela animação no POV-Ray...........................80
Figura 11.1 “Christmas Baubles” feita pelo artista Jairo Vives Piqueres...83
Figura 11.2 “Glasses” feita pelo artista Grilles Tran...................................83
Figura 11.3 “Boreal” feita pelo artista Norbert Kern..................................84
Figura 11.4 “Distant Shores” feita pelo artista Christoph Gerber...............84
4
LISTA DE QUADROS
5
Quadro 6.3.8 Exemplo de declaração do modificador metálico.................45
Quadro 6.3.9 Exemplo de declaração do atributo polido............................45
Quadro 6.3.10 Exemplo de declaração do atributo reflexão em uma cena.46
Quadro 6.3.11 Exemplo de declaração do atributo refração.......................48
Quadro 6.4.1 Forma geral da declaração da normal....................................49
Quadro 6.4.2 Código base para os próximos exemplos..............................49
Quadro 6.4.3 Exemplo de declaração de batida..........................................50
Quadro 6.4.4 Exemplo de declaração da normal acidente..........................51
Quadro 6.4.5 Exemplo de declaração de ondulação...................................51
Quadro 6.4.6 Exemplo de declaração da oscilação.....................................52
Quadro 6.4.7 Exemplo de declaração da normal ruga................................52
Quadro 6.4.8 Exemplo de declaração do mapeamento de batida................53
Quadro 6.4.9 Código de um cone com finalização normal.........................54
Quadro 6.4.10 Código de um plano com finalização normal......................55
Quadro 6.4.11 Exemplo de inclusão da biblioteca “texture.inc”................55
Quadro 6.4.12 Exemplo de declaração da textura “Jade” inclusa na
biblioteca “texture.inc”........................................................56
Quadro 7.1 Exemplo de declaração da união utilizando triângulos............59
Quadro 7.2 Exemplo de declaração de junção............................................60
Quadro 7.3 Exemplo de declaração da diferença........................................61
Quadro 7.4 Exemplo de declaração da intersecção.....................................62
Quadro 7.5 Exemplo de declaração da inversão.........................................63
Quadro 8.1 Forma geral para a declaração dos tipos de iluminação...........65
Quadro 8.2 Exemplo de declaração de iluminação pontual simples...........66
Quadro 8.3 Exemplo de declaração de foco de luz pontual........................67
Quadro 8.4 Exemplo de declaração do modificador tightness....................68
Quadro 8.5 Exemplo de declaração de área luminosa.................................69
Quadro 8.6 Exemplo de declaração de área de foco de luz.........................71
Quadro 9.1 Exemplo de declaração de objeto.............................................71
Quadro 9.2 Exemplo de referência à declaração.........................................72
Quadro 9.3 Exemplo de cena simplificada pela declaração de objeto........72
Quadro 9.4 Exemplo de cena simplificada pela declaração de texturas.....73
Quadro 9.5 Exemplo de condição if............................................................75
Quadro 9.6 Exemplo de condição switch....................................................75
Quadro 9.7 Exemplo de condição afirmativa de declaração.......................76
Quadro 9.8 Exemplo de condição negativa de declaração..........................76
Quadro 9.9 Exemplo de destruição de declaração......................................76
Quadro 9.10 Exemplo de loop.....................................................................77
Quadro 9.11 Exemplo de cena utilizando comandos de controle de fluxo.77
Quadro 10.1 Exemplo de cena que pode ser animada.................................78
Quadro 10.2 Exemplo de arquivo de animação .ini....................................79
6
LISTA DE TABELAS
7
1- INTRODUÇÃO
8
2. HISTÓRIA
Em meados de 1986, David Kirk Buck fez o download de um código “C” para
raytracer (Unix). Ele ficou impressionado, apesar de só ter conseguido exibir esferas
planas com um piso em preto e branco, sem texturas. Resolveu, então, brincar com o
código adicionando suporte para cor, mas finalmente decidiu que poderia fazer um
trabalho melhor escrevendo um código raytracer a partir do zero, seu projeto teve o
nome de DKBTrace.
Por volta de 1987 ou 1988, Aaron Collins entrou em contato com David, pois
tinha encontrado o DKBTrace e conseguiu portá-lo para personal computer, além de
acrescentar um modelo de iluminação. Finalmente, a última versão do DKBTrace, agora
portátil, foi liberada (1989).
Quando o programa provou ser mais popular do que o previsto, eles não
puderam acompanhar a demanda por mais recursos. Então, David propôs que eles
formassem uma equipe para desenvolver um novo raytracer, usando o DKBTrace como
base. Na opinião de David o código deveria continuar livre, ser portável para diferentes
plataformas e possuir um nome diferente de DKBTrace, pois este continha as inicias de
seu nome e, com uma equipe trabalhando, este nome seria inadequado.
9
estavam Drew Wells, Aaron Collins, Chris Young, Steve Anger, Tim Wegner, Dan
Farmer, Bill Pulver (IBM), e Alexander Enzmann (matemático), Chris Cason e Robert
Skinner.
Houve tanta procura para que uma nova versão fosse liberada que foi lançado o
POV-Ray 0.5. Este foi basicamente um reforço do DKBTrace, com muitas
semelhanças, entre elas a gramática, que só foi renovada no POV-Ray 1.0.
Na versão 2.0, David Kirk Buck deixou o projeto para se dedicar à outras áreas
(modelagem e animação). O POV-Ray ficou nas mãos da equipe que desenvolveu o seu
estado atual, Chris Cason é agora o lider do projeto.
3. ADQUIRINDO A FERRAMENTA
10
Figura 3.1: Imagens geradas pelos códigos inclusos no pacote POV-Ray.
4. PRINCÍPIOS BÁSICOS
11
O POV-Ray utiliza um sistema tridimensional (3D) de coordenadas cartesianas.
Podemos usar a mão esquerda para visualizar melhor. Assim, coloque a mão
esquerda aberta na frente dos olhos, com a palma virada para o lado oposto deles.
Abaixe o dedo mínimo e o anelar, permanecendo com o polegar apontado para o lado
direito, o indicador apontado para cima e o médio apontado para frente. Pronto, todos os
dedos apontam para o lado positivo dos seus respectivos eixos mostrado na figura.
Caso você tenha experiência com o sistema matemático de coordenadas 3D, irá
notar que os eixos estão rotulados de uma maneira um pouco diferente do que se é
comumente utilizado em termos matemáticos. No POV-Ray os eixos não são fixos
como aparentam na figura, eles dependem de onde a câmera é posicionada.
Para definirmos os vetores no POV-Ray utilizamos três valores que são cercados
por colchetes angulares. Por exemplo, para especificar a origem diríamos <0,0,0>.
Da mesma forma que uma posição dentro da cena pode ser descrita por um
vetor, as cores também podem. Ao descrever uma cor, cada elemento do vetor
12
corresponde ao montante de uma cor primária. Esse vetor é chamado de vetor RGB
(vermelho, verde e azul).
Os valores de um vetor RGB devem ficar entre 0,0 e 1,0. O valor 1,0 significa o
uso de 100% da cor correspondente. Por exemplo, a cor negra, que é justamente a
ausência de todas as cores, é descrita pelo vetor <0,0,0>, já a cor branca, uma
combinação completa das três cores primarias, é definida pelo vetor <1,1,1>.
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). O vetor RGB possui um valor de filtro
implícito de 0,0, em outras palavras, uma cor especificada por um vetor RGB será
perfeitamente opaca. Para exemplificar o funcionamento desse filtro, vamos usar o vetor
RGBF <1,0,0,1>, dessa maneira a cor atuará como um papel celofane vermelho,
100% da luz é transmitida através da cor, mas o pigmento vermelho é filtrado. O vetor
RGBF pode ser um pouco confuso no início, mas ele não é muito difícil, uma vez que se
começa a pegar o jeito.
• É case sensitive;
Não importa a ordem em que os objetos são declarados no POV-Ray, pois isso
não fará diferença para a cena final.
13
É possível fazer comentários no POV-Ray, ou seja, uma parte do texto que o
programa irá ignorar quando gerar a cena. Os comentários são utilizados para adicionar
informações ao código, geralmente para tornar as coisas mais claras para um leitor
humano. Podem ser incluídos em /* e */ ou, para uma única linha de comentários,
pode ser prefixo com um //. Por exemplo:
5. OBJETOS
Antes de se construir uma cena é preciso saber de onde ela está sendo observada,
ou seja, o POV-Ray necessita de informações. Imagine uma câmera fotográfica pronta
para tirar uma foto, ela precisa ter uma posição e uma direção. E são exatamente essas
informações que o POV-Ray necessita, e para enviá-las é preciso um objeto do tipo
câmera. A câmera é muito importante e o POV-Ray exige que só haja uma em cada
cena.
Uma câmera pode ter muitos atributos, por hora, vamos nos concentrar nos dois
mais úteis: a localização e a direção.
camera {
location <2,5,-10>
look_at <0,0,0>
}
14
Este exemplo define uma câmera localizada em <2,5,-10> e apontando para a
origem. Isto significa que qualquer coisa possuir a coordenada z inferior a -10 será
certamente invisível para esta câmera, pois estará atrás da mesma.
Vamos começar a construir uma cena com a declaração do fundo, ela permite
alterar a cor do fundo da cena. A cor do fundo deve ser uma cor sólida, portanto texturas
não são permitidas. Para exemplificar, declararemos um fundo na cor preta:
Caso a biblioteca de cor seja declarada podemos usar o seu nome como no
exemplo abaixo:
15
Executando os códigos dos exemplos acima temos uma janela com sua cor
declarada. Caso queira colocar uma textura no fundo, deve-se usar uma “esfera céu”,
uma esfera muito grande (raio de 10000) em que se pode colocar uma textura e que fica
no fundo da cena. Mas veremos isso mais adiante.
Tabela 5.1: Tabela de cores inclusas na biblioteca “colors.inc” (de acordo com a figura 5.1).
16
06 = color Cyan 40 = color MediumTurquoise 74 = color Feldspar
07 = color Magenta 41 = color MediumVioletRed 75 = color Quartz
08 = color Black 42 = color MidnightBlue 76 = color NeonPink
09 = color Aquamarine 43 = color Navy 77 = color DarkPurple
10 = color BlueViolet 44 = color NavyBlue 78 = color NeonBlue
11 = color Brown 45 = color Orange 79 = color CoolCopper
12 = color CadetBlue 46 = color OrangeRed 80 = color MandarinOrange
13 = color Coral 47 = color Orchid 81 = color LightWood
14 = color CornflowerBlue 48 = color PaleGreen 82 = color MediumWood
15 = color DarkGreen 49 = color Pink 83 = color DarkWood
16 = color DarkOliveGreen 50 = color Plum 84 = color SpicyPink
17 = color DarkOrchid 51 = color Salmon 85 = color SemiSweetChoc
18 = color DarkSlateBlue 52 = color SeaGreen 86 = color BakersChoc
19 = color DarkSlateGray 53 = color Sienna 87 = color Flesh
20 = color DarkTurquoise 54 = color SkyBlue 88 = color NewTan
21 = color Firebrick 55 = color SlateBlue 89 = color NewMidnightBlue
22 = color ForestGree 56 = color SpringGreen 90 = color MandarinOrange
23 = color Gold 57 = color SteelBlue 91 = color VeryDarkBrown
24 = color Goldenrod 58 = color Tan 92 = color DarkBrown
25 = color GreenYellow 59 = color Thistle 93 = color GreenCopper
26 = color IndianRed 60 = color Turquoise 94 = color DkGreenCopper
27 = color Khaki 61 = color Violet 95 = color DustyRose
28 = color LightBlue 62 = color VioletRed 96 = color HuntersGreen
29 = color LightSteelBlue 63 = color Wheat 97 = color Scarlet
30 = color LimeGreen 64 = color YellowGreen 98 = color DarkTan
31 = color Maroon 65 = color SummerSky 99 = color White
32 = color MediumAquamarine 66 = color RichBlue
33 = color MediumBlue 67 = color Brass // Grey = Gray; // Mica = Black
Nome_do_objeto{
Parâmetros_do_objeto
Alguns_atributos_simples_do_objeto
Alguns_outros_atributos_simples
Alguns_atributos_complexos{
Alguns_atributos
Alguns_outros_atributos
}
}
Veremos o exemplo:
17
camera {
location <2,5,-10>
look_at <0,0,0>
}
18
exemplo, um plano. O importante na hora de descrever as primitivas é apenas saber a
sua sintaxe. A sintaxe completa para descrever objetos finitos e infinitos será descrita
mais adiante.
Para que nossa esfera seja vista em 3D, é necessário adicionarmos uma fonte de
luz.
Uma fonte de luz pontual pode ser conhecida como uma fonte não-atenuante, ou
seja, a luz emitida não fica mais fraca com a distância. Isto significa que é possível
iluminar a cena inteira com uma fonte de luz pontual colocada longe da cena. Também é
possível ter quantas fontes de luz desejar, mas elas são caras computacionalmente, ou
seja, quanto maior o número delas na cena, mais tempo o POV-Ray irá gastar para gerar
a imagem.
Para exemplificar, vamos colocar uma fonte de luz pontual na nossa cena:
// a esfera vermelha
sphere {
<0,0,0>, 3
pigment { color rgb <1,0,0> }
19
}
20
Figura 5.4: Cilindro.
// um cone primitivo
cone {
<0, 0, 0>, 3,
<0, 6, 4>, 0.5
pigment { color rgb <1,0,1> }
}
21
Quadro 5.8: Exemplo de caixa.
box {
<0, 0, 0>, <5, 3, -5>
pigment { color rgb <1,0.5,0> }
}
triangle {
<0, -5, 1>, <-5, 0, 1>, <3, 3, 1>
pigment { color rgb <0.5, 0.7, 1> }
}
22
As bolhas são basicamente um conjunto de esferas atraem ou repelem umas as
outras para formar uma superfície. Elas não se comportam como objetos precisos, mas
dão uma espécie de sensação “orgânica” para a cena.
Ele cria campos em torno de cada um dos elementos, e a força que indica o quão
forte é o campo é indicada pelo primeiro atributo da mesma. Essa força pode ter valores
positivos, que fará com que a superfície atraia outras componentes da bolha, ou
negativos, que fará a superfície repelir as componentes da bolha. Quanto maior o valor,
maior será o efeito que esta componente terá.
23
possui intensidade menor. Note que as componentes de diferentes objetos do tipo bolha
não afetam umas as outras.
O disco primitivo cria um disco circular muito fino com um buraco opcional no
centro.
plane {
y, -4 //onde y é o vetor normal (pode ser especificado como
// <0,1,0>. E 4 indica que o plano irá passar a uma
// distância de 4 da origem.
pigment { color rgb <0, 0.6, 0.9> }
}
24
Campos altos é uma maneira fácil de criar montanhas em suas cenas. Ele,
basicamente, lê um arquivo de imagem e, em seguida, transforma a imagem em uma
malha de triângulos. A altura de cada ponto da malha é determinada pelo valor do pixel
correspondente na imagem. Ele é declarado da seguinte forma:
height_field {
gif "fract001.gif"
pigment { color rgb <1, 1, 1> }
translate <-0.5, -0.5, -0.5>
}
Onde “gif” é o tipo do arquivo da imagem (poderia ser outro), em seguida está
o nome do arquivo de imagem. Veremos mais adiante o que significa “translate”.
Para arquivos do tipo “gif”, a altura de um pixel é determinada com base no seu
índice na paleta de cores. O valor 0 seria a menor altura do campo, enquanto 255 seria a
maior.
Normalmente, o POV-Ray gera campos altos fora do normal, então para ter
exatamente o que se deseja, pode-se incluir a palavra chave "smooth" na declaração (é
opcional). Isto fará com que o POV-Ray use bons triângulos em vez de usar os planos,
25
isso ocorre porque o POV-Ray irá calcular automaticamente superfícies normais para
fazer a altura do campo ficar boa, mas há um custo maior.
Então agora podemos criar alguns objetos simples. Há vários outros, bem
como bibliotecas de formas (como shapes_lo.inc), mas não iremos abordar aqui.
Alguns destes objetos que podem ser criados no POV-Ray só podem se localizar em
torno da origem (como o toro). E se queremos colocá-los em outro lugar? E se
queremos deslocá-los? O POV-Ray oferece respostas para todas estas questões sob a
forma de transformações. As transformações, falando de raytracing, são atributos que
mudam a posição, tamanho ou orientação de objetos (e dos diversos atributos dos
objetos). Os tipos mais comuns de transformações, e os que POV-Ray suporta, são
traduções, rotações e escalares.
Uma forma rápida de se lembrar de que forma os objetos vão rodar pelas é usar a
chamada "regra da mão esquerda.” Basta segurar a sua mão esquerda, dedos e polegar
abertos. Aponte o polegar no sentido positivo do eixo que o objeto irá rodar (se você
estiver rodando sobre mais eixos de uma só vez, isto não irá ajudá-lo - a menos que
você tenha mais de um polegar!). A direção dos dedos indica a direção de rotação,
quando o número de graus é positivo. (Quando o numero de graus é negativos precisa
rodar na direção oposta).
26
Figura 5.11: Exemplificação da regra da mão esquerda para rotações.
torus {
3, 1 //raio maior (tamanho da argola), raio menor
(espessura)
pigment { color Yellow }
scale <1.5,1,1>
rotate <-20,0,0>
translate <0,2,0>
}
27
Figura 5.12: Toro que passou por transformações.
Note que o objeto toro é criado em torno da origem, por isso, é necessário
aplicar a transformação para usá-lo onde quiser.
6. TEXTURA
texture{
pigment { color rgb <1,1,0> }
}
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 se a
textura não precisar ser declarada toda vez. De fato, a maioria das partes do bloco
“texture{}” também pode ser feito dessa maneira, e de qualquer maneira, eles têm o
mesmo efeito.
28
descreve a cor do objeto (talvez de um modo mais complicado do que o que foi
mostrado até agora). 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, porém, é 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]
}
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 raytracing. 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:
29
Quadro 6.1.4: Forma geral da declaração de pigmentação.
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 */
}
Uma pigmentação é composta por três partes principais, em primeiro lugar o tipo
da pigmentação, então o mapeamento colorido, e finalmente a turbulência. O
mapeamento colorido 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).
30
turbulence <0, 0.9, 0.3> // nenhuma turbulência na direção
//x, 0.9 na direção y e 0.3 na
//direção z
31
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).
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
}
}
32
Figura 6.2.2: Esferas com diferentes valores de pigmentação gradiente.
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
turbulence 2
}
}
33
abruptamente, como um corte, isso não ocorre na pigmentação mármore, pois os índices
variam de 0 a 1, na faixa de 0 a x = x = 0,5 e, em seguida, de volta para baixo para
colorir 0 novamente no intervalo x = 0,5 a x = 1.
sphere {
<0,0,0>,5
pigment {
marble
color_map {
[0.0 color Gray90] // 90% cinza
[0.8 color Gray60] // 60% cinza
[1.0 color Gray20] // 20% cinza
}
scale 0 //quando o valor é 0, não precisa especificar
turbulence 1
}
}
34
sphere {
<0,0,0>, 5
pigment {
agate
color_map {
[0.0 color Red]
[0.25 color Blue]
[1.0 color Green]
}
agate_turb 1.0 //o valor 1 é padrão
scale 3
}
}
Outra coisa a notar sobre ágata é o fato de que a turbulência não tem qualquer
efeito sobre a palavra-chave desta pigmentação. A ágata é sempre turbulenta. A
quantidade de turbulência pode ser controlada, em certa medida, com a palavra-chave
“agate_turb”, que possui um valor positivo.
sphere {
<0,0,0>, 6
pigment {
bozo
35
color_map {
[0.0 color Red]
[0.25 color Blue]
[1.0 color Green]
}
}
}
Figura 6.2.7: Esferas com as pigmentações manchada, granito, leopardo e madeira respectivamente.
36
A pigmentação tabuleiro de xadrez cria cubos de cor no espaço e suporta
mapeamento de cores; apenas duas cores são especificadas elas formarão um tabuleiro
de xadrez mesmo. Isto difere um pouco do padrão de declaração da pigmentação, aqui
está um exemplo:
sphere {
<0,0,0>, 6
pigment {
checker
color Red //primeira cor
color Blue //segunda cor
scale 6
}
}
sphere {
<0,0,0>, 6
pigment {
hexagon
color rgb <0.75, 0, 0>
color rgb <0, 0, 0.75>
37
color rgb <0, 0.75, 0>
scale 0.5
}
}
image_map {
tipo "nome_do_arquivo.tipo"
//modificadores (são opcionais)
Interpolate valor
Filter paleta_de_cor, porcentagem_de_tranparência
}
O tipo pode ser “gif”, “tga”, “iff”, ou outro, seguido do nome do arquivo (entre
aspas), que especifica o arquivo de imagem a ser mapeada.
38
ou 2 (para o algoritmo bilinear). A normalização da distância é o algoritmo mais rápido,
enquanto o bilinear faz um trabalho melhor de escolher as cores intermediarias.
//posição da câmera
camera {
location <1.5, 1.5, -2>
look_at <0.5, 0.5, 0.5>
}
//iluminação
light_source { <50, 30, -50> color rgb <1, 1, 1> }
39
6.3 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
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
}
sphere {
<0, 0, 0>, 4
pigment { color rgb <1, 1, 0> }
finish {
ambient 0.6
}
}
As imagens abaixo mostram basicamente como a iluminação ambiente interfere
no objeto. O primeiro é o padrão, o segundo é representado com o ambiente 0.6.
40
Figura 6.3.1: Diferença entre uma esfera padrão e uma com iluminação ambiente.
sphere {
<0, 0, 0>, 4
pigment { color rgb <1, 1, 0> }
finish {
brilliance 5
}
}
O atributo crand 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
41
aleatório, ou seja, possivelmente teremos dois resultados diferentes usando a mesma
imagem (o que é ruim para animações).
sphere {
<0, 0, 0>, 4
pigment { color rgb <1, 1, 0> }
finish {
crand 0.3
}
}
sphere {
<0, 0, 0>, 4
pigment { color rgb <1, 1, 0> }
finish {
diffuse 0.9
}
}
42
Figura 6.3.4: Esferas com difusão (valor 0.3 à esquerda e 0.9 à direita).
Talvez o atributo da finalização mais usado seja o atributo phong. 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.
sphere {
<3, 0, 0>, 3
pigment {
color rgb <1, 0, 0>
}
finish { phong 0.9 }
}
box {
<-5, -2, -2>, <-1, 2, 2>
pigment {
color rgb <1, 0.3, 0.6>
}
finish { phong 0.9 }
}
43
Figura 6.3.5: Caixa e esfera com finalização phong.
Note que não há brilho destacado na caixa, porque nenhuma das faces é
orientada de modo a refletir a luz para a câmera.
sphere {
<0, 0, 0>, 4
pigment { color Red }
finish {
phong 1
phong_size 2
}
}
Figura 6.3.6: Esferas com diferentes valores de “phong_size"(valor 200 à esquerda e 2 à direita).
44
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 é.
sphere {
<0, 0, 0>, 4
pigment { color rgb <1, 0, 0> }
finish {
phong 0.9
metallic
}
}
sphere {
<0, 0, 0>, 4
pigment { color rgb <1, 0.3, 0.7> }
finish {
specular 0.9
roughness 0.75
}
}
45
Figura 6.3.8: Esferas com a finalização polida e diferentes valores de rugosidades (a figura de cima não
possui rugosidade, a da esquerda possui o valor 0,75 de rugosidade e a figura da direita possui 0,001).
46
pigment { checker color Black color White }
}
//esfera
sphere {
<0, 2, 0>, 3
pigment { color rgb <0, 0.6, 0.9> }
finish {
phong 1
reflection 0.3
}
}
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.
Agora, 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
refração) é o mesmo que o de espaço vazio. O índice de refração descreve o quanto 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).
47
Quadro 6.3.11: Exemplo de declaração do atributo refração.
}
}
Figura 6.3.10: Esferas com refração e diferentes valores de ior (à esquerda ior = 1,33; à direita ior = 1,5).
6.4 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.
Apesar de não ser 100% realista, é bom o suficiente para a maioria dos fins. 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.
48
Quadro 6.4.1: Forma geral da declaração da norma.
Normal {
tipo /* OU */
bump_map {
/* especificação do mapeamento de batida*/
}
/* modificadores aqui*/
/* qualquer rotação, escala, e translação vem aqui */
}
Normais são divertidas e fáceis de especificar. Elas devem ser adicionadas por
último, no "ajuste final" do cenário, e podem transformar um objeto que parece ótimo
em um objeto que parece absolutamente espetacular.
// luz
light_source { <200, 200, -200> color rgb <1, 1, 1> }
49
//plano (chão)
plane {
y, -2
pigment { checker color rgb <1, 1, 1> color rgb <0, 0, 0> }
rotate y*30
}
//esfera
sphere {
<0, 0, 0>, 1.5
pigment { color rgb <1, 0.6, 1> }
finish { phong 0.8 }
normal {
//bumps 0 -> nem é preciso colocar, pois significa liso
}
}
Normal {
bumps 1
scale 1/4
}
50
Figura 6.4.2: Esfera batida.
A normal acidente faz, basicamente, com que o objeto fique como se tivesse sido
atacado com uma marreta. Veja o exemplo:
Normal {
dents 1
scale 1/4
}
Normal {
ripples 1.0
scale 1/4
translate <0, 2, 0>
}
51
Figura 6.4.4: Esfera com a normal ondulação.
normal {
waves 1.0
scale 1/4
translate <0, 2, 0>
}
A normal ruga faz com que o objeto pareça que foi esticado e amassado no lugar
novamente. Veja o exemplo:
Normal {
wrinkles 1
scale 1/4
translate <0, 2, 0>
}
52
Figura 6.4.6: Esfera com a normal ruga.
Normal {
bump_map {
tipo "nome_do_arquivo.tipo"
[bump_size tamanho]
[interpolate modo]
[use_color]
[use_index]
[once]
[map_type modelo_do_mapa]
//todos os parâmetros entre [] são opcionais
}
}
O tipo especifica o tipo de arquivo fonte usado para fazer o mapeamento de
batida, deve ser “gif”, “iff”, “tga”... Em seguida vem o nome completo do arquivo, em
aspas duplas. A imagem será mapeada para o plano xy e redimensionada para que caiba
na gama (0, 0), (1, 1). Para mudar este mapeamento padrão, pode-se usar a palavra-
chave “map_type”. Aumentar a imagens não irá produzir um mapeamento de batidas
maior, mas sim deixá-lo com uma resolução melhor.
53
que não seja 0.0, pois esse valor é ruim. Valores altos vão garantir grandes
profundidades, enquanto os baixos apenas poucas rugas. Valores negativos farão com
que níveis baixos se tornem altos e níveis altos se tornem baixos.
Cone {
<0,-3,0>,2
<0,3,0>,0.1
texture {
normal {
bumps 1/2
scale 1/6
}
pigment { color rgb <.5,.7,.2> }
}
}
54
Figura 6.4.7: Cone com finalização normal.
plane {
y, 0
texture {
pigment { color rgb <.1,.9,.9> }
normal {
ripples 0.5
}
}
}
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 como já vimos antes:
#include "colors.inc"
#include "textures.inc"
55
Note que é preciso incluir “colors.inc” antes de “textures.inc”, pois
“textures.inc” utiliza a biblioteca de cor.
Sphere {
<0, 0, 0>, 4
texture { Jade }
}
56
Figura 6.4.10: Texturas contidas na biblioteca “texture.inc” (parte1)
57
Tabela 6.4.1: Tabela de texturas inclusas na biblioteca “texture.inc”.
7. CSG
58
CSG_operator {
object_1
object_2
etc.
}
Na realidade, não é preciso colocar nenhum objeto entre as chaves, mas não faz
sentido ter menos de dois objetos (lembrando que o CSG cria novos objetos
combinando outros). A seguir, teremos exemplos e explicações de todos os operadores
(união, intersecção, inverso, diferença e junção).
A união é, talvez, o operador de CSG mais simples, ela é usada para combinar
grupos de objetos juntos em um objeto lógico. Este objeto pode então ser texturizado e
transformado como um todo, de modo que você não tem que lidar com um monte de
pequenos objetos.
Union {
triangle { <0,0,1>, <0.866,0,0.5>, <0.2676,0.8236,0.5> }
triangle { <0,0,1>, <0.2676,0.8236,0.5>,
<-0.7006,0.5090,0.5> }
triangle { <0,0,1>, <-0.7006,0.5090,0.5>,
<-0.7006,-0.5090,0.5> }
triangle { <0,0,1>, <-0.7006,-0.5090,0.5>,
<0.2676,-0.8236,0.5> }
triangle { <0,0,1>, <0.2676,-0.8236,0.5>,
<0.8660,0,0.5> }
triangle { <0.8660,0,0.5>, <0.2676,0.8236,0.5>,
<0.7006,0.5090,-0.5> }
triangle { <0.2676,0.8236,0.5>, <-0.7006,0.5090,0.5>,
<-0.2676,0.8236,-0.5> }
triangle { <-0.7006,0.5090,0.5>, <-0.7006,-0.5090,0.5>,
<-0.8660,0,-0.5> }
triangle { <-0.7006,-0.5090,0.5>, <0.2676,-0.8236,0.5>,
<-0.2676,-0.8236,-0.5> }
triangle { <0.2676,-0.8236,0.5>, <0.8660,0,0.5>,
<0.7006,-0.5090,-0.5> }
triangle { <0.7006,0.5090,-0.5>, <-0.2676,0.8236,-0.5>,
<0.2676,0.8236,0.5> }
triangle { <-0.2676,0.8236,-0.5>, <-0.8660,0,-0.5>,
59
<-0.7006,0.5090,0.5> }
triangle { <-0.8660,0,-0.5>, <-0.2676,-0.8236,-0.5>,
<-0.7006,-0.5090,0.5> }
triangle { <-0.2676,-0.8236,-0.5>,
<0.7006,-0.5090,-0.5>,
<0.2676,-0.8236,0.5> }
triangle { <0.7006,-0.5090,-0.5>, <0.7006,0.5090,-0.5>,
<0.8660,0,0.5> }
triangle { <0,0,-1>, <0.7006,0.5090,-0.5>,
<-0.2676,0.8236,-0.5> }
triangle { <0,0,-1>, <-0.2676,0.8236,-0.5>,
<-0.8660,0,-0.5> }
triangle { <0,0,-1>, <-0.8660,0,-0.5>,
<-0.2676,-0.8236,-0.5> }
triangle { <0,0,-1>, <-0.2676,-0.8236,-0.5>,
<0.7006,-0.5090,-0.5> }
triangle { <0,0,-1>, <0.7006,-0.5090,-0.5>,
<0.7006,0.5090,-0.5> }
//texturas, rotações, escalas e translações vem aqui
pigment { color rgb <0, 1, 0> }
}
60
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 <-0.5, 0, 0>
}
Figura 7.3: Diferença entre união e junção (à esquerda foi aplicada a união e à direita a junção).
Note que na primeira imagem, onde usamos a união, a ponta do cone é visível, já
na segunda, usando a junção a ponta do cone desapareceu, como se os dois objetos
fossem realmente um só.
Veja o exemplo:
difference {
sphere { <0, 0, -1>, 1
translate 0.5*x
pigment { Red }
rotate 90*y
finish { Shiny }
}
61
cylinder { <-0.5, 0, -2> <0, 0, 1>, .35
pigment { Blue }
}
}
Figura 7.5: Diferença entre união e diferença (à esquerda há uma união entre
os objetos e à esquerda uma diferença).
Outra coisa a notar é que boa parte da superfície do cilindro está pra fora da
esfera (mais comprido), isso porque, ocasionalmente, o POV-Ray vai ficar confuso
quando se tem dois objetos que ocupam exatamente o mesmo espaç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.
Vejamos o exemplo:
intersection{
box {<-0.5,-0.5,-0.5>,< 0.5,0.5,0.5>
texture{pigment{color rgb<1,0.65,0>}
62
finish {ambient 0.15
diffuse 0.85}}
}
sphere{<0,0,0>,0.66
texture{pigment{color Red}
finish {ambient 0.15
diffuse 0.85}}
}
rotate<0,-30,0> translate<0,0.5,0>}
Figura 7.7: Diferença entre união e intersecção (à esquerda há uma união entre
os objetos e à direita uma intersecção).
O inverso não é utilizado com muita frequência, mas existem momentos em que
ele será essencial. Seu objetivo é inverter o que o POV-Ray considera ser o interior do
objeto com o exterior. Considere a interseção de uma esfera e um caixa. Se a esfera for
invertida teremos a intersecção da caixa com um objeto definido como "todo o universo
com exceção da esfera." Veja que este efeito pode ser feito também com a diferença:
intersection{
63
box {<-0.5,-0.5,-0.5>,< 0.5,0.5,0.5>
texture{pigment{color rgb<1,0.65,0>}
finish {ambient 0.15
diffuse 0.85}}
}
sphere{<0,0,0>,0.66
texture{pigment{color Red}
finish {ambient 0.15
diffuse 0.85}}
}
cylinder{<0,0,-1>,<0,0,1>,0.3
inverse
texture{pigment{color YellowGreen}
finish {ambient 0.15
diffuse 0.85}}}
cylinder{<0,-1,0>,<0,1,0>,0.3
inverse
texture{pigment{color YellowGreen}
finish {ambient 0.15
diffuse 0.85}}}
cylinder{<-1,0,0>,<1,0,0>,0.3
inverse
texture{pigment{color YellowGreen}
finish {ambient 0.15
diffuse 0.85}}}
rotate<0,-30,0> translate<0,0.5,0>}
64
geométricas. É possível encontrar bons programas de modelação (muitos gratuitos e
shareware), assim você irá economizar tempo e esforço.
8. ILUMINAÇÃO
light_source {
/* o vetor posição e a cord a luz são sempre necessários */
<localização>
color especificação_da_cor
65
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 definidos. 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 (a declaração de cor já foi explicada anteriormente).
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 uma determinar a iluminação da cena.
O parâmetro “looks_like” pode ser usado para atribuir uma "forma" para a
luz.
// luz
light_source {
<0,20,-30>
color rgb <1,1,1>
}
union {
torus {
5, 0.5
rotate <90, 0, 0>
}
cylinder {
<0, 0, 0>, <0, 10, 0>, 0.5
}
pigment { color rgb <0.5, 0.5, 1> }
}
plane {
y, 0
pigment {
checker color rgb <0.75, 0, 0.75> color rgb <0.5, 0, 0.5>
scale 3
}
}
66
Figura 8.1: Cena com iluminação pontual simples.
light_source {
<0,20,-30>
color rgb <1,1,1>
spotlight
point_at <0, 0, 0>
radius 20
falloff 20
}
67
Figura 8.2: Cena com foco de luz pontual (valor do radius igual ao valor de fallof).
Figura 8.3: Cena com foco de luz pontual com fallof maior que radius (fallof = 30 e radius = 20).
Um efeito parecido pode ser simulado pelo modificador opcional tightness. Ele
controla como a forma da luz decresce a zero na borda do falloff. Também controla, um
pouco, a queda de luz no centro do foco de luz. O seu valor padrão é 10.
light_source {
<0,20,-30>
68
color rgb <1,1,1>
spotlight
point_at <0, 0, 0>
radius 20
falloff 20
tightness 50
}
As áreas luminosas são utilizadas para espalhar a sombra e torná-la mais realista.
Quando a luz é pontual, ou ela é visível ou não é, portanto ou uma área é sombreada, ou
não é. A área luminosa tenta mudar essa situação espalhando 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.
lado-1 e lado-2 são vetores <x, y, z> que descrevem a orientação dos lados,
como a área luminosa é retangular, estes vetores devem ser perpendiculares. Os
comprimentos desses vetores correspondem aos comprimentos dos lados. len-1 e len-2
são o número de luzes ao longo das dimensões correspondentes da luz. A intensidade da
luz é dividida entre esses pontos.
light_source {
<0,20,-30>
color rgb <1,1,1>
69
Figura 8.5: Cena com iluminação feita por uma área luminosa.
Como já foi dito, podemos juntar o foco de luz com a área luminosa, o efeito
fica muito bom.
70
Quadro 8.6: Exemplo de declaração de área de foco de luz.
light_source {
<0,20,-30>
color rgb <1,1,1>
spotlight
point_at <0, 0, 0>
radius 20
falloff 30
tightness 20
Figura 8.6: Cena com iluminação feita por uma área de foco luminoso.
9. A LINGUAGEM
#declare minha_esfera =
sphere {
<0, 0, 0>, 5
pigment{ color rgbf <0.5, 0.2, 0.4, 0.667>}
71
}
object {
minha_esfera
translate <-2, 0, 0>
}
Note que todos os atributos que você coloca dentro do objeto substitui aqueles
que estão na declaração do mesmo, neste exemplo, a nossa esfera é deslocado da sua
localização original em <0,0,0> para <-2,0,0>. Isso é valido também para os outros
atributos (pigmentação, finalização, etc.).
Mas, para que finalidade a declaração seria útil? Simples, imagine, por exemplo,
que se queira fazer um templo grego, seria preciso muitos pilares. Ou quem sabe fazer
um círculo de balas:
#declare bala =
sphere {
<0,0,0>,0.25
texture{ pigment{ color rgb<1,0,0.35>}
finish { phong 1}
}
scale<1.5,1,1>
translate<1,0.25,0>
}
union{
object{ bala rotate<0,0,0>}
72
object{ bala rotate<0,18,0>}
object{ bala rotate<0,36,0>}
object{ bala rotate<0,54,0>}
object{ bala rotate<0,72,0>}
object{ bala rotate<0,90,0>}
object{ bala rotate<0,108,0>}
object{ bala rotate<0,126,0>}
object{ bala rotate<0,142,0>}
object{ bala rotate<0,160,0>}
object{ bala rotate<0,178,0>}
object{ bala rotate<0,196,0>}
object{ bala rotate<0,214,0>}
object{ bala rotate<0,232,0>}
object{ bala rotate<0,250,0>}
object{ bala rotate<0,268,0>}
object{ bala rotate<0,286,0>}
object{ bala rotate<0,304,0>}
object{ bala rotate<0,322,0>}
object{ bala rotate<0,340,0>}
rotate<0,0,0>
translate<0,0,0>
}
Note que os atributos do objeto “bala” não precisaram ser repetidos. Podemos
declarar, não só objetos, como também tipos de pigmentação, finalizações...
#declare vidro_vermelho =
texture {
finish {
refraction 1.0
reflection 0.1
ior 1.5
}
73
pigment {
color rgbf <1, 0.7, 0.7, 0.7>
}
}
sphere {
<-3, 0, -3>, 3
pigment { filtro_azul }
}
cone {
<-2, -4, 16>, 5
<0, -3, 1>, 1
texture { vidro_vermelho }
}
O comando “if” representa uma tomada de decisão do tipo "SE isto ENTÃO
aquilo". Já o “if-else” representa dois comandos de tomada de decisão ("SE isto
74
ENTÃO aquilo SENÃO aquilo lá"). Ambos representam uma condição. Veja a forma
geral:
#if (Condição)
... declaração
#else // (opcional)
... declaração 2
#end
A condição do comando “if” é uma expressão que será avaliada. Se ela for
falsa a declaração não será executada ou (se houver”else”) em seu lugar será
executada a declaração a partir do “else” (declaração 2), e, se for verdadeira a
declaração será executada. A declaração pode ser um bloco de código ou apenas um
comando.
#switch (variável)
#case (variável_valor1)
... declaração
#break
#case (variável_valor2)
... declaração
#break
#range (variável_valor_inicio,variável_valor_fim)
... declaração
#break
#else // (opcional)
... declaração
#break
#end // fim da #switch
75
O comando “#break” faz com que o switch seja interrompido assim que uma
das declarações seja executada, mas ele não é essencial ao comando switch. Se após a
execução da declaração não houver um “#break”, o POV-Ray continuará executando.
Isto pode ser útil em algumas situações, mas é bom tomar cuidado.
#ifdef (variável)
... declaração
#else // (opcional)
... declaração2
#end
Agora vamos exemplificar o oposto, uma condição que checa se a variável não
foi declarada:
#ifndef (variável)
... declaração
#else // (opcional)
... declaração2
#end
#undef (Variável)
76
de várias formas, de modo que substitui outros tipos de loops encontrados outras
linguagens de programação. A forma geral é esta:
#while (condição)
... declaração
#end
union{
#local Nr = 0; // numero começo
#local EndNr = 20; // numero fim
#while (Nr< EndNr) //enquanto começo for menor que fim, faça:
sphere{ <0,0,0>,0.25
#if( Nr/2 = int(Nr/2) )//se começo for um numero par
texture{ pigment{ color rgb<1,0.65,0>}
finish { phong 1}
}
scale<1,1.5,1>
rotate<0,0,0>
translate<0,0,0>
} // fim da união -------------------
77
Figura 9.3: Cena feita utilizando comandos de controle de fluxo.
10. ANIMAÇÕES
Bem, é isso mesmo que você leu. Além de ter a possibilidade de construir cenas
incríveis com o POV-Ray, ele também oferece a você a possibilidade de criar
animações.
Para uma animação com o POV-Ray, são necessários dois tipos de arquivos:
O clock no POV-Ray pode ser usado para animar um grande número de coisas,
objetos, câmera, texturas etc. A melhor maneira de entender como a animação funciona
é ver um exemplo de como tudo acontece. Para isso, vamos utilizar uma cena simples
como esta:
#include "colors.inc"
#include "textures.inc"
//global_settings { assumed_gamma 1.0 }
//---------------------------------------
camera{ location <0.0 , 1.0 ,-3.0>
look_at <0.0 , 0.0 , 0.0> }
//---------------------------------------
light_source{ <1500,2500,-2500>
78
color rgb<1,1,1> }
//---------------------------------------
plane{ z, 10
texture { Shadow_Clouds }}
//---------------------------------------
// a esfera que será animada:
sphere{ <0,0,0>, 0.5
texture {DMFWood3//textura de madeira
finish { diffuse 0.9
phong 1}}
translate < 1, 0, 0>
rotate < 360*clock 0>
}
Note que a esfera é deslocado para o lado direito pela declaração translate
<1,0,0>. Em seguida, ela será animada, rodando em torno do eixo y (rotate
<0,360*clock 0>). Lembre-se de que é preciso certificar que a translação é feita
antes da rotação, para que a animação fique correta.
O valor do "clock" (nulo por padrão) será definido pelo arquivo de animação,
portando não é necessário declará-lo, mas declarando-o podemos ver como nossa cena
muda com o tempo, substituindo o valor do clock.
Agora vamos criar um arquivo de animação, note que este arquivo precisa estar
no mesmo diretório que o arquivo de descrição da cena. Nesse arquivo de animação
(.ini) ao invés dos comentários serem escritos após “//”, eles são escritos após “;”.
; arquivo de anomação
Antialias=Off
Antialias_Threshold=0.1
Antialias_Depth=2
79
Input_File_Name=esfera.pov
Initial_Frame=1
Final_Frame=30
Initial_Clock=0
Final_Clock=1
Cyclic_Animation=on
Pause_when_Done=off
Para iniciarmos a apresentação da animação, temos que rodar o arquivo de
animação e não o arquivo da cena. O POV-Ray irá iniciar a renderização do arquivo
"sesfera.pov" com o valor do "clock" igual a 0 e guardará a imagem resultante
como “frame#1”, o nome do arquivo será "esfera101.bmp".
80
esfera110.bmp esfera111.bmp esfera112.bmp
81
esfera128.bmp esfera129.bmp esfera130.bmp
Figura 10.2: Frames gerados pela animação no POV-Ray.
11. CONCLUSÃO
82
Figura 11.1: “Christmas Baubles” feita felo artista Jaime Vives Piqueres.
83
Figura 11.3: “Boreal” feita por Norbert Kern.
11. BIBLIOGRAFIA
84
LOHMÜLLER, Andrea; LOHMÜLLER, Friendrich A. <http://www.f-
lohmueller.de/index.htm>. (21/06/09).
85