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“ “

image00

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

}

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

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