Aula Prática 9 (POV-Ray)
Disciplina: Computação Gráfica
Professora: Isabel Harb Manssour
 

O objetivo desta aula é aprender a utilizar o POV-Ray, que é um software que usa o algoritmo de ray tracing para gerar imagens com realismo. O POV-Ray é free e está disponível em http://www.povray.org/download/ para as plataformas Microsoft Windows, Linux e Mac OS. Em princípio, ele já está instalado nas máquinas do laboratório. Caso seja necessário instalar, a versão para o Microsoft Windows pode ser obtida clicando aqui.

Na verdade, o POV-Ray consiste em uma linguagem especial para descrição de cenas que é fácil de usar. É 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.

Inicialmente, será descrita a criação de uma cena simples, contendo apenas uma esfera, para entender o funcionamento do POV-Ray. Abra o POV-Ray () 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 teste1.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"    // The include files contain
#include "stones.inc"    // pre-defined scene elements 

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 podemo consumir memória.

  
#include "textures.inc"  // pre-defined scene elements    
#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 através de um vetor, que é especificado através da colocação de três valores numéricos entre "<" e ">", separados por vírgulas. Portanto, adicione no seu arquivo de descrição da cena (teste1.pov) o comando abaixo.

camera { 
     location <0, 2, -3> 
     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 teste1.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 através do comando texture. Através deste comando é possível descrever a cor e as propriedades da superfície de um objeto. Neste exemplo está sendo especificada apenas a cor básica, que é a informação mínima necessária. O brilho e 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, 1, 2>, 2 
	texture { 
		pigment { 
			color Yellow 
		} 
	}
}

Agora é possível gerar a imagem final clicando no botão Run (). Observe o resultado gerado, e pense o que está faltando especificar para que a imagem pareça 3D...

A resposta é: 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 teste1.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 ilustrado abaixo. O ideal é que este comando seja colocado no início do arquivo, logo abaixo dos comando de include.

background { color Blue } 

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, plano e torus. Os comandos para inclusão destes objetos estão ilustrados a seguir. Analisando os exemplos, inclua os objetos e altere os seus parâmetros e a posição da câmera com o objetivo de gerar uma imagem semelhante à imagem ilustrada na próxima figura, isto é, que tenha os mesmos objetos e que um não fique na frente do outro.

box { 
	<-1, 0, -1>, // Near lower left corner 
	< 1, 0.5, 3> // Far upper right corner 
	texture { 
		T_Stone25 // Pre-defined from stones.inc 
		scale 4 // Scale by the same amount in all directions 
	} 
	rotate y*60 // Equivalent to "rotate <0,60,0>" 
} 

cone { 
	<0, 1, 0>, 0.3 // Center and radius of one end 
	<1, 2, 3>, 1.0 // Center and radius of other end 
	open // Removes end caps 
	texture { T_Stone25 	scale 4 	} 
} 

cylinder { 
	<0, 1, 0>, // Center of one end 
	<1, 2, 3>, // Center of other end 
	0.5 // Radius 
	open // Remove end caps 
	texture { T_Stone25 scale 4 } 
} 

plane { <0, 1, 0>, -1
	pigment {
		checker color Red, color Blue
	}
}

torus { 
	0.4, 0.2 // major and minor radius 
	rotate -90*x // so we can see it from the top  
	translate <1.8, 0, -1.5>
	pigment { Magenta }
} 

Exemplo de imagem gerada usando o POV-Ray

No objeto plane foi usado 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 numero 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=-1. O padrão checker especifica que serão usadas as cores vermelha e azul. Olhando para o chão, se observa que os objetos produzem sombras, que são processadas com muita precisão pelo ray-tracer.

Para saber como modelar objetos usando outras técnicas, tal como CSG, leia as seção 3.4 tutorial disponível na opção Help on POV-Ray do Menu Help do POV-Ray.

Existem muitos tipos de fonte de luz disponíveis no POV-Ray, e a sua correta utilização gera resultados excelentes. A mais simples é a fonte de luz pontual adicionada no exemplo anterior, que não possui tamanho, é "invisível" e ilumina toda cena de maneira uniforme. Crie um novo arquivo chamado teste2.pov e inclua os comandos listados abaixo onde é usada uma fonte de luz pontual. Analise atentamente os comandos e verifique a imagem que é gerada.

  #include "colors.inc"
  #include "textures.inc"    
  
  camera {
    location  <-4, 3, -9>
    look_at   <0, 0, 0>
    angle 48
  }

  plane {
    y, -1
    texture {
      pigment {
        checker
        color rgb<0.5, 0, 0>
        color rgb<0, 0.5, 0.5>
      }
      finish {
        diffuse 0.4
        ambient 0.2
        phong 1
        phong_size 100
        reflection 0.25
      }
    }
  }
  torus {
    1.5, 0.5
    texture { Brown_Agate }
    rotate <90, 160, 0>
    translate <-1, 1, 3>
  }
  box {
    <-1, -1, -1>, <1, 1, 1>
    texture { DMFLightOak }
    translate <2, 0, 2.3>
  }
  cone {
    <0,1,0>, 0, <0,0,0>, 1
    texture { PinkAlabaster }
    scale <1, 3, 1>
    translate <-2, -1, -1>
  }
  sphere {
    <0,0,0>,1
    texture { Sapphire_Agate }
    translate <1.5, 0, -2>
  }

  light_source {
    <2, 10, -3>
    color White
  }

Uma fonte de luz do tipo spot é muito útil, e pode ser usada para iluminar regiões específicas. Para criar uma fonte de luz do tipo spot utilize a palavra reservada spotlight em uma fonte de luz padrão e adicione os seguintes parâmetros: radius (raio do "cone que é totalmente iluminado"), falloff (raio do "cone de umbra", onde a luz fica escura), tightness (determina a "velocidade" com que a luz se apaga) e point_at (local para onde o spot é direcionado). Para exemplificar a sua utilização, substitua a fonte de luz pontual do exemplo anterior pela fonte de luz especificada a seguir.

light_source { 
	<0, 10, -3> 
	color White 
	spotlight 
	radius 15 
	falloff 20 
	tightness 10 
	point_at <0, 0, 0> 
} 

É possível adicionar várias fontes de luz, com cores diferentes. Para exemplificar, acrescente mais duas fontes de luz do tipo spot na cena criada no exemplo anterior. Os parâmetros estão especificados abaixo. Gere a imagem e verifique o resultado final.

  light_source {
    <10, 10, -1>
    color Red
    spotlight
    radius 12
    falloff 14
    tightness 10
    point_at <2, 0, 0>
  }
  light_source {
    <-12, 10, -1>
    color Blue
    spotlight
    radius 12
    falloff 14
    tightness 10
    point_at <-2, 0, 0>
  }

Também é possível definir uma fonte de luz "cilíndrica", onde, ao contrário da spot, o efeito não muda com a distância da fonte de luz. Neste caso, os parâmetros radius e falloff ficam iguais e a palavra reservada spotlight é trocada por cylinder. Assim, a "forma" da área iluminada passa a ser um cilindro, ao invés de um cone. Para verificar a diferença, experimente trocar as palavras spotlight por cylinder e os valores dos parâmetros radius e falloff para 20 e 30, respectivamente, nas três fontes de luz do arquivo teste2.pov.

Para fazer com que as sombras fiquem mais suaves, e mais próximas da realidade, o POV-Ray possui um recurso conhecido como area light. Este tipo de fonte de luz possui dimensões em dois eixos, que são especificadas através de dois vetores. Também é necessário especificar quantas luzes haverão, 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 area light, o que faz com que o tempo de processamento aumente. Quanto maior o valor, mais delineada a umbra ficará e mais rápido a imagem será gerada. Geralmente é utilizado o valor 1 para este parâmetro. Outro parâmentro, jitter, diz para o ray-tracer mover suavemente a posição de cada fonte de luz na area light para que as sombras sejam suavizadas. Para ilustrar o funcionamento da area light, coloque em comentário o código das outras fontes de luz no arquivo teste2.pov e acrescente o código abaixo.

light_source { 
	<2, 10, -3> 
	color White 
	area_light <5, 0, 0>, <0, 0, 5>, 5, 5 // possui 25 (5*5) luzes
	adaptive 1 
	jitter 
} 

Fontes de luz do tipo cilindro e spot podem ser uma area light. Para exemplificar, comente o código da area light e acrescente o código abaixo.

  light_source {
    <2, 10, -3>
    color White
    spotlight
    radius 15
    falloff 18
    tightness 10
    area_light <1, 0, 0>, <0, 0, 1>, 2, 2
    adaptive 1
    jitter
    point_at <0, 0, 0>
  }
  light_source {
    <10, 10, -1>
    color Red
    spotlight
    radius 12
    falloff 14
    tightness 10
    area_light <1, 0, 0>, <0, 0, 1>, 2, 2
    adaptive 1
    jitter
    point_at <2, 0, 0>
  }
  light_source {
    <-12, 10, -1>
    color Blue
    spotlight
    radius 12
    falloff 14
    tightness 10
    area_light <1, 0, 0>, <0, 0, 1>, 2, 2
    adaptive 1
    jitter
    point_at <-2, 0, 0>
  }

Conforme estudado, se não houver luz ambiente, que é o resultado das várias reflexões que ocorrem no ambiente, as regiões que não forem atingidas diretamente pela fonte de luz ficarão escuras. O POV-Ray usa a palavra reservada ambient para determinar o quanto da luz ambiente é refletida por uma superfície. Por default, a fonte de luz ambiente é branca (rgb <1,1,1>), mas alterar esta cor possibilita a criação de efeitos especiais. Ao invés de alterar todos os valores de luz ambiente em cada finish, somente uma fonte de luz ambiente é modificada. O comando abaixo especificado exemplifica a utilização de uma fonte de luz ambiente azul. Experimente acrescentar este comando no arquivo teste2.pov para verificar o efeito gerado.

global_settings { ambient_light rgb<0, 0, 1> }

No parágrafo anterior, bem como no exemplo do arquivo teste2.pov, foi usada a palavra reservada finish. Uma das principais características de um ray-tracer é a sua habilidade para especificar as propriedades das superfícies, tais como brilho e reflexão. O parâmetro finish é usado justamente com este objetivo: controlar as propriedades da superfície de um objeto. Existem 12 propriedades diferentes disponíveis no POV-Ray que são controladas pelas seguintes palavras reservadas: ambient, diffuse, brilliance, phong, specular, metallic, reflection, crand e iridescence.

Por exemplo, para adicionar uma área de highlight com o método de tonalização de Phong é necessário adicionar a palavra reservada finish seguida de um parâmetro. Aplicando a uma esfera, o comando ficaria como mostra o exemplo abaixo. O parâmetro Phong faz com que seja adicionada uma área de highlight da mesma cor da fonte de luz, ou seja, o objeto terá um brilho. Valores mais baixo farão com que o objeto brilhe menos (os valores devem estar entre 0 e 1). Experimente adicionar brilho na esfera que aparece no arquivo teste1.pov e depois consulte a seção 3.4.9 tutorial para saber como trabalhar com os parâmetros do finish e gerar imagens onde as superfícies dos objetos tenham diferentes propriedades.

  sphere {
    <0, 1, 2>, 2
    texture {
      pigment { color Yellow } //Yellow is pre-defined in COLORS.INC
      finish { phong 1 }
    }
  }

Conforme descrito anteriormente, pigments podem ser descritos por valores numéricos de cor rgb. Por exemplo: color rgb<1,0,0> resulta na cor vermelha. Para especificar objetos transparentes, este comando pode ser alterado para color rgbf<1,0,0,1>, onde f significa filter (filtered transparency é a expressão usada pelo POV-Ray). Atribuir o valor 1 para f significa que a cor é completamente transparente, mas ainda filtra a luz. No exemplo, a cor será um vermelho transparente, como um papel celofane vermelho. Outro tipo de transparência no POV-Ray é chamada de transmittance, ou non-filtering transparency. Neste caso, se usa rgbt, ao invés de rgbf. A diferença é que ele não filtra a luz de acordo com a cor do objeto. Ele deixa passar a luz sem alterá-la. Altere o arquivo teste1.pov para ilustrar a definição de objetos transparentes (por exemplo, faça com que a esfera seja transparente).

Agora use o POV-Ray para compor uma cena com alguns objetos básicos. Seja criativo na hora de montar a cena e defina: pelo menos um objeto transparente, um objeto com brilho e duas fontes de luz. Se der tempo, aproveite para testar a utilização da textura bump mapping usando o seguinte comando: normal { bumps 0.4 scale 0.2 }. Leia a seção 3.5.2.3 do tutorial para entender como funciona este comando.

Nesta aula foram apresentadas apenas algumas características disponíveis no POV-Ray. Para descobrir como utilizar as vantagens desta poderosa ferramenta para gerar cenas com um alto grau de realismo, consulte o tutorial disponível no menu Help.

 ../../Imagens/EMBAN15.GIF (1469 bytes)

../../Imagens/E-MAIL.JPG (3237 bytes) Comentários, dúvidas, sugestões, envie um mail para [email protected]

../../Imagens/EMBAN15.GIF (1469 bytes)

[Homepage CG]  [Homepage CG-SI]

Última alteração em 29 de outubro de 2006.