Visualização Realística em 3D, zbuffering e Raytracing
Author: Aldo von Wangenheim
Description: INE 5341 - Programa da Disciplina Computação Gráfica - Prof. Aldo von Wangenheim
Keywords: Graphic Computing, Computacao Grafica

ine 5341 Programa OpenGL Trabalhos 2001 Trabalhos 2002 Links Bibliografia Plano de Ensino | Parte IV - Topicos Avançados Realidade Virtual Cenário Gráfico e Nós Um browserVRMLdeve reconhecer um arquivo como código VRML para interpretá-lo (Parser). Este é acoplado com um simples cabeçalho string no início do arquivo: #VRMLV1.0 ascii Este cabeçalho deve estar na primeira linha do arquivo VRMLpara ser interpretado corretamente. Note que em muitos casos o símbolo ‘ # ‘ indica comentário, exceto aqui. Os objetos em um arquivo VRMLsão chamados nós ou nodos. Quando organizados hierarquicamente, os nós compõe um cenário gráfico. Cada mundo VRML , por mais simples que seja, é um cenário gráfico. Os nós são de três tipos: * nós de forma: descreve geometria real; * nós de propriedade: que modifica geometria; * nós de grupo: podendo modificar um grupo de objetos como se fosse apenas um objeto. O efeito cumulativo dos nós em um cenário gráfico é chamado estado (state). Para muitos propósitos o nodo mais importante de grupo é o node Separator, cujo uso é: Separator{ outros nós aqui } O nó separador (Separator) mantém encerrados os efeitos de modificação dapropriedade dos nós com ele. Assim, somente nós com separador podem ser modificados por propriedades de nós com o mesmo separador; nós fora daquele separador nãoserão afetados por aquelas propriedades de nós. Unidades de Medida VRMLassume os seguintes valores para unidades de mensuramento: * distância e tamanho: metro (m); * ângulo: radianos; * outros valores: porcentagem (expressa em frações de 1). Material A propriedade material para qualquer forma pode ser especificada comoNó Material, cujo uso é: #VRMLV1.0 ascii Separator{ Material{ ambientColor0.20.20.2 diffuseColor0.80.80.8 specularColor000 emissiveColor000 shininess0.2 transparency0 } } Cada documento de nó Material que especifica um tipo de cor usa valores RGB (Intensidades Red, Green and Blue), o valor vermelho é o mais esquerdo, o valor verde é central e o azul é o valor mais da direita. Teoricamente, qualquer cor (nuança, saturação, valor) podem ser criados combinando vermelho, verde e azul em diferentes intensidades. Deseja-se uma esfera azul. Usam-se alguns componentes básicos do VRML: cabeçalho, Separator, Material, Sphere. Vai-se criar um arquivo VRML quequando traduzido por um browser VRML ,será descrito um mundo VRMLque contém uma esfera azul: #VRMLV1.0 ascii Separator{ Material{ emissiveColor001 } Sphere{ } } Esfera Azul Note que o argumento radius (radianos) nãofoi usado no nó sphere. Logo foi assumido um valor padrão. Textura Qualquer forma pode ter a textura aplicada na sua superfície. A textura pode vir de um arquivo externo de imagem para um arquivo mundo VRMLou especificado com o arquivo mundo como uma série de coordenadas. Exemplo: usaremos arquivos imagem, desde que seja a maneira mais fácil para envolver rapidamente a forma de um objeto VRMLnuma textura. Uma textura de um arquivo de imagem pode ser aplicada a uma forma como nó Texture2: #VRMLV1.0 ascii Separator{ Texture2{ filename“ “ image000 wrapSREPEAT wrapTREPEAT } } Para nossos propósitos, somente o argumento filename será usado nesses exemplos. Vamos dizer que queremos fazer uma tora de pedra. Usando somente os componentes: cabeçalho, Separator, Texture2, Cube. Vamos criar um arquivo VRML , que quando interpretado descreve o mundo VRML um objeto assemelhado a uma tora de pedra . #VRMLV1.0 ascii Separator{ Texture2{ filename“stone.jpg” } Cube{ width1 height2 depth0.15 } } Cubo Texturizado (Stone Slab) Transformações Por default, objetos num cenário VRML : * tem como local do centro, o centro do cenário; * tem como orientação, a orientação padrão do cenário; * tem como dimensões, as primitivas, isto é, as dimensões especificadas. Exceto quando é necessário modificar alguns dessas convenções para um objeto, uma ou mais transformações serão usadas. Os nodos de transformações são um tipo de nó propriedade. Termos especiais costumam descrever as funções executadas pelos nós de transformação são: * translate: muda a locação do centro do objeto; * rotate: muda a orientação dos eixos do objeto; * scale: muda dimensões do objeto. O nó Transform contém todas as funções de transformações mencionadas acima. Exemplo: #VRMLV1.0 ascii Separator{ Transform{ translation000 rotation0010 scaleFactor111 scaleOrientation0010 center000 } } Para o propósito de simplicidade e melhor esclarecimento o relacionamento de hierárquico de nós no cenário VRML , três outros nós de transformação, que executam somente um tipo de transformação cada, serão usadas nesses exemplos. Os nós sãoTranslation, Rotation e Scale. O nó Translation como um objeto de um ou mais de três eixos. Seu uso é: #VRMLV1.0 ascii Separator{ Transform{ translation000 } } Digamos que se queira incluir uma esfera vermelha num mundo já existente que contém uma esfera azul. Usando os nós VRML , podemos criar um mundo VRMLque contenha ambas. Entretanto, por convenção, ambas esferas serão colocadas no centro exato do cenário. Por isso, usaremos nó Translation para transformar o local de uma das esferas, a azul, situando-as lado a lado. Exemplo: #VRMLV1.0 ascii Separator{ Separator{#esfera vermelha,default é o centro do cenário Material{ emissiveColor100 } Sphere{ } } Separator{#esfera azul,deslocada pelo eixo X positivo Translation{ translation2.2500 } Material{ emissiveColor001 } Sphere{ } } } Esfera Vermelha e Esfera Azul Deslocada Note que cada nodo Sphere foi situada com um diferente nodo Separator com as propriedades que influenciam cada uma. Assim os efeitos de cada nós de propriedade (Material, Translation, nesse exemplo) para que cada uma somente afete os nós de forma (por exemplo: Sphere) cujas propriedades desejamosmodificar. Note que o Separator contém todos os outros nós do cenário gráfico. Embora nãoseja obrigatório, é aconselhável usar “ Separator Cenário “ em cada cenário gráfico. O nó Rotation pode rotacionar um objeto em um ou mais de três eixos, mas é usado normalmente para fazer rotação somente de um eixo por vez. O nó Rotation afeta a orientação: #VRMLV1.0 ascii Separator{ Rotation { rotation0010 } } Digamos que se deseja um mundo com dois cones, um sobre o outro, um apontando para cima e um para o lado. Usando nós de propriedade de VRML e o nó de forma Cone, poderemos criar um mundo VRML que contém um cone marrom e um azul, um sobre o outro. Entretanto, por convenção, ambos cones devem apontar para cima. Portanto, usaremos o nó Rotation para mudar a orientação de um dos cones, o azul, inclinando-o 90° para o lado. #VRML V1.0 ascii Separator { Separator { # brown cone, translated along the negative Y axis Translation { translation 0 -2 0 } Material { emissiveColor1 0.6 0.44 } Cone { height2 bottomRadius0.5 } } Separator { # blue cone, rotated 90 degrees on the Z axis Rotation { rotation0 0 11.57 } Material { emissiveColor0.4 0 1 } Cone { height2 bottomRadius0.5 } } } Cone Marrom e Cone Azul Rotacionado Nó Scale atribui escala ao objeto ao longo de um ou mais dos seus três eixos. #VRML V1.0 ascii Separator { Scale { scaleFactor 1 1 1 } } Este nó pode criar uma versão das esferas em que pode se ver as duas sem que uma comprima a outra. #VRML V1.0 ascii Separator { Separator { # red sphere Material { emissiveColor1 0 0 } Sphere {} } Separator { # blue sphere, scaled down on the X and Z axes Translation { translation 2.25 0 0 } Scale { scaleFactor 0.6 1 0.6 } Material { emissiveColor0 0 1 } Sphere {} } } Esfera Vermelha e Esfera Azul Escalada O nó Scale foi situado após o nó Translation com o Separator da esfera azul. O estado do cenário varia de acordo com a ordem dos seus nós, o efeito de “ Scale, Translation ” é diferente de “ Translation, Scale “. Instancialização Uma maneira de reduzir o número de nós que são usados no arquivo mundo que descreve muitas formas, é reutilizar definições de objetos em cenários. Esse processo é a instancialização. As sentençasDEF e USE permitemo processo: #VRML V1.0 ascii Separator { DEF name shape node or DEF name Material {} or DEF name Separator { grouping, property and shape nodes } Separator { USE name } } Exemplo do siri no fundo do mar, com partes instanciadas: #VRML V1.0 ascii Separator { Separator { # viewpoints DEF Cameras Switch { whichChild0 DEF "Crab!" PerspectiveCamera { position0 0 7 } } } Separator { Rotation { rotation 0 1 01.57 } Separator { # body Scale { scaleFactor 1 0.3 1 } Material { diffuseColor0.8 0.8 1 } DEF Ball Sphere { radius 2 } } DEF 3Legs Separator { # 3 legs 1 DEF Leg Separator { # leg 1 Material { diffuseColor1 0.3 0.3 } Separator { # upper leg Translation { translation 0 0.55 2.3 } Rotation { rotation1 0 00.9 } DEF LegSegment Cylinder { height2 radius0.13 } } Separator { # joint Translation { translation 0 1.26 3.15 } Scale { scaleFactor 0.095 0.095 0.095 } USE Ball } Separator { # lower leg Translation { translation 0 0.7 3.85 } Rotation { rotation1 0 0-0.9 } Scale { scaleFactor 0.8 0.8 0.8 } USE LegSegment } } Separator { # leg 2 Translation { translation 0.62 0.2 -0.2 } Rotation { rotation0 1 00.65 } USE Leg } Separator { # leg 3 Translation { translation -0.62 0.2 -0.2 } Rotation { rotation0 1 0-0.65 } USE Leg } } Separator { # 3 legs 2 Rotation { rotation0 1 03.14 } USE 3Legs } DEF Eye Separator { # eye 1 Material { diffuseColor1 1 1 Translation { translation -1.95 0 -0.45 } Rotation { rotation0 0 1-1.9 } Cone { # eyeball height0.4 bottomRadius0.2 } Material { diffuseColor0 0 0 } Translation { translation 0 -0.015 0 } Cone { # iris partsBOTTOM height0.4 bottomRadius0.1 } } Separator { # eye 2 Translation { translation 0 0 0.9 } USE Eye } } } Siri no Fundo do Mar com Partes Instanciadas Inlines É uma outra forma de instanciar objetos. Esta forma é acoplada com o nó WWWInline : #VRML V1.0 ascii Separator { WWWInline { name"" bboxSize0 0 0 bboxCenter0 0 0 } } O campo Name é o caminho do arquivo World a ser usado. Os campos bboxSize e bboxCenter opcionalmente descrevem caixa limitada (bounding box), que é dados ao usuário como indicativo da locação do objeto e tamanho antes de ser interpretado. Caixas limitadas podem ser bastante úteis para a construção de mundos muito grandes ou muito complexos. Iluminação É possível também prover iluminação para os mundos VRML. Caso nãose especifique as propriedades referentes a iluminação, o mundo VRML assume o padrão do browser de VRML . Para isso usa-se nós de iluminação, isto é, para criar fonte de iluminação. Basicamente dependendo da sua posição no cenário gráfico e tipo, nós de iluminação afetam outras formas no cenário e podem ser transformadas. Como outros nós de propriedade se um nó de iluminação está num Separator nãoafetará formas externas a este Separator. Os nós de iluminação de VRML são: DirectionalLight, PointLight e SpotLight. O nó DirectionalLight cria uma fonte de iluminação que afeta a todas formas na direção especificada: DirectionalLight { onTRUE intensity1 color111 direction0 0-1 } Alguns browsersVRMLassumem uma luz de centro por convenção, que brilha no cenário, ao longo do eixo Z negativo. Definiremos fonte de luz para iluminar o eixo X: #VRML V1.0 ascii Separator { DirectionalLight { onTRUE intensity0.4 direction-1 0 0 } DirectionalLight { onTRUE intensity0.4 direction1 0 0 } Separator { # brown cone, translated along the negative Y axis Translation { translation 0 -2 0 } Material { emissiveColor1 0.6 0.44 } Cone { height2 bottomRadius0.5 } } Separator { # blue cone, rotated 90 degrees on the Z axis Rotation { rotation0 0 11.57 } Material { emissiveColor0.4 0 1 } Cone { height2 bottomRadius0.5 } } } Dois Cones Iluminados Cameras (Pontos de Vista) Um ponto de vista (viewpoint) é a posição exata da qual o mundo VRML é visto: é definida no cenário gráfico do arquivo world . Nos exemplos anteriores o viewpoint padrão, também conhecido como entry view , foi o único considerado. O entry view é a posição da qual vemos o cenário quando o mundo VRML é representado no browser, se nenhum outro ponto de vista foi definido no mundo. Para ver os exemplos anteriores de novos pontos de vista, é necessário navegar manualmente para aquela posição. O que se faz para o usuário ver um mundo VRML de uma posição especial, além da padrão, assim que o cenário é carregado o primeiro momento? VRML nós camera para definir posições exatas para visualizar um cenário. Além da dificuldade de precisá-lo, nós camera podem ser vistos como nós propriedade (propertynodes), desde que: 1. eles pareçam transformar as formas em um cenário; 2. alguns dos seus parâmetros, comportando-se como lentes de efeitos especiais, criem a ilusão de distanciamento das formas, mesmo depois do usuário ter-se afastado da posição da camera. Dois nós camera, PerspectiveCamera e OrthographicCamera , são definidos em VRML . Mas apenas o PerspectiveCamera é normalmente suportado por browsers VRML : #VRML V1.0 ascii Separator { PerspectiveCamera { position001 orientation0010 focalDistance5 heightAngle0.785398 } } Usa-se o nó de agrupamento Switchpara melhor definirmos múltiplos viewpoints: #VRML V1.0 ascii Separator { Switch { whichChild-1 } } Usando o exemplo do siri no fundo do mar (deep sea crab), demonstramos nós WWWInline, PerspectiveCamera e Switch: #VRML V1.0 ascii Separator { Separator { # viewpoints DEF Cameras Switch { whichChild0 DEF "Front" PerspectiveCamera { position0 0 7 } DEF "Back" PerspectiveCamera { position0 0 -7 orientation 0 1 03.14 } DEF "Side" PerspectiveCamera { position7 0 0 orientation 0 1 01.57 } DEF "Top" PerspectiveCamera { position0 10 0 orientation 1 0 0-1.57 } DEF "Bottom" PerspectiveCamera { position0 -10 0 orientation 1 0 01.57 } } } Separator { # crab WWWInline { name "1crab1.wrl" } } } Siri no Fundo do Mar com Ponto de Vista Nível de Detalhes #VRML V1.0 ascii LOD { range[ ] center0 0 0 } Usando três nodos forma primitiva, instancialização e o nó LOD, será possiível definir três níveis de detalhe, contendo um grupo de formas primitivas, cada grupo contendo uma cor diferente: #VRML V1.0 ascii Separator { PerspectiveCamera { position 0 0 102 } DirectionalLight { onTRUE intensity0.7 direction0 0 -1 } LOD { # level-of-detail range[ 50,70 ] Separator { # third level, red Material { emissiveColor1 0 0 } DEF ObjectSet Separator { Separator { # Cube Translation { translation -2 0 0 } Cube { width1 height1 depth1 } } # end of Cube Separator Separator { # Cone Translation { translation 0 -2 0 } Cone { height1.5 bottomRadius0.5 } } # end of Cone Separator Separator { # Cylinder Translation { translation 2 0 0 } Cylinder { height1.5 radius0.65 } } # end of Cylinder Separator } # end of ObjectSet definition Separator Translation { translation 0 0 25 } Rotation { rotation0 1 10.4 } Rotation { rotation0 1 03.14 } USE ObjectSet } # end of third level Separator Separator { # second level, green Translation { translation 0 0 50 } Material { emissiveColor0 1 0 } USE ObjectSet Translation { translation 0 0 10 } Rotation { rotation0 1 10.4 } Rotation { rotation0 1 03.14 } USE ObjectSet } # end of second level Separator Separator { # first level, blue Translation { translation 0 0 70 } Material { emissiveColor0 0 1 } USE ObjectSet Translation { translation 0 0 25 } Rotation { rotation0 1 10.4 } Rotation { rotation0 1 03.14 } USE ObjectSet } # end of first level Separator }# end of level-of-detail } Primitivas com Nível de Detalhes CRIANDO MUNDOS VRML Cores de Fundo Live3D permite definir cor para fundos de mundos VRML , com extensão BackgroundColor do Live3D de VRML : DEF BackgroundColor Info { string "" } Criaremos uma versão do siri no fundo do mar (Deep Sea Crab) que tenta mostra-se no oceano. Criando um mundo que importa (por Inlines) o modelo do siri e usando o nó BackgroundColor, um siri será mostrado no campo azul esverdeado: #VRML V1.0 ascii Separator { DEF BackgroundColor Info { string "0.15 0.6 0.7" } Separator { # viewpoints DEF Cameras Switch { whichChild0 DEF "Crab!" PerspectiveCamera { position0 0 7 } } } Separator { # crab WWWInline { name "1crab1.wrl" } } } Siri no Fundo do Mar com Cor de Fundo Imagem de Fundo Live3D permite usar imagens para fundos nos mundos VRML . Extensões BackgroundImageVRML possibilitam isso: DEF BackgroundImage Info { string "" } Para criar uma versão mais realista do siri no fundo do mar tenta se mostrar no oceano, modifica-se exemplo usado para rever o nó BackgroundColor substituindo o nó BackgroundImage no Live3D. Assim dá-se a impressão da vibração da água do mar atrás do modelo do siri: #VRML V1.0 ascii Separator { DEF BackgroundImage Info { string "bakimage.jpg" } Separator { # viewpoints DEF Cameras Switch { whichChild0 DEF "Crab!" PerspectiveCamera { position0 0 7 } } } Separator { # crab WWWInline { name "1crab1.wrl" } } } Siri no Fundo do Mar com Imagem de Fundo |