![]() |
![]() |
![]() |
|
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{
} }
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 } }
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{
} } }
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 } } }
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
{} } }
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 } } }
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 } } }
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" } } }
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 }
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" } } }
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" } } }
|
|
![]() |
![]() |
![]() |