esta unidade terá a finalidade de introduzir os principais ... · a modelagem em 3 dimensões...
TRANSCRIPT
Unidade 2: Introdução à modelagem 3D utilizando a linguagem VRML
Saudação:
Olá Aluno!
Esta unidade terá a finalidade de introduzir os principais aspectos sobre modelagem 3D utilizando a linguagem VRML. Destacaremos uma breve descrição sobre a VRML, como a linguagem é estruturada e os conceitos iniciais sobre modelagem 3D.
Bom estudo!
Prof. Daniel.
O que veremos:
1. Introdução
2. A linguagem VRML
2.1. Apresentação do plug-in Cortona 3D Viewer
2.2. Estrutura dos arquivos VRML 2.0
3. Nodes
3.1. Nós-filhos
3.1.1 Nó Shape
3.2. Primitivas gráficas 3D em VRML (Nodes de desenho)
3.2.1. Cubo
3.2.2. Esfera
3.2.3. Cilindro
3.2.4. Cone
3.3. Aparência
3.4. Nós de agrupamento
3.4.1. Nó Transform
3.4.1.1. Translação
3.4.1.2. Escala
3.4.1.3. Rotação
4. Modelagem de objetos mais complexos a partir das primitivas gráficas
5. Reaproveitamento de objetos (comandos DEF e USE)
1 Introdução
Modelagem tridimensional (ou modelagem 3D) é uma área da computação gráfica que tem como objetivo a geração de entidades em três dimensões, geração de cena estática, imagem em movimento (animação) com ou sem interatividade. É basicamente a criação de formas, objetos, personagens, cenários. Para elaboração são utilizadas ferramentas computacionais avançadas e direcionadas para este tipo de tarefa. Existem diversos profissionais habilitados na área. A modelagem em 3 dimensões conta com uma enorme variedade de ferramentas genéricas, permitindo uma comunicação mais fácil entre dois programas diferentes e usuários iguais. Todas elas são realizadas através da criação de uma malha complexa de segmentos que dão forma ao objeto. Antes de iniciarmos o estudo sobre os princípios para a modelagem 3D, é necessário conhecer um pouco sobre a linguagem que iremos utilizar. A linguagem VRML foi escolhida por ser extremamente simples lidar com ela. Isto deve-se ao fato de que não é preciso saber nenhuma outra linguagem de programação como pré-requisito. Inicialmente, serão apresentados conceitos iniciais sobre a estruturação da linguagem e, em seguida, os princípios sobre a modelagem 3D em VRML.
2 A linguagem VRML
A linguagem VRML (Virtual Reality Modeling Language) surgiu em 1994 a partir da
idéia de se levar a realidade virtual para a Internet. Criada pela Silicon Graphics, a
linguagem é interpretada por qualquer browser (navegador para internet, como o Internet
Explorer) que suporte a visualização de mundos virtuais ou que contenham um plug-in para
tal finalidade.
A Silicon Graphics é conhecida do grande público especialmente por dezenas de
filmes produzidos por Steven Spielberg, George Lucas, e Estúdios Walt Disney, onde os
efeitos especiais produzidos em sistemas Silicon Graphics tornaram-se verdadeiros
personagens. Essa é, no entanto, apenas uma das faces desta empresa, que é líder mundial
em computação gráfica e supercomputação, ao lado de sua subsidiária Cray Research. A
Silicon Graphics é um dos principais fornecedores de workstations (estações de trabalho),
servidores e supercomputadores, com aplicações nas mais diferentes áreas como
manufatura, bancos de dados, geociências, telecomunicações, Web/Intranet, medicina,
simulação visual, realidade virtual e, obviamente, entretenimento, em que se encaixam as
áreas de TV/filme/animação.
A linguagem VRML já está em sua segunda versão. O VRML 1.0 permitia apenas a
navegação pelos mundos, com pouca interação do usuário com o ambiente e cenas
tridimensionais estáticas. A partir da versão 2.0, a linguagem tornou-se mais poderosa em
relação a recursos de animação por meior de scripts, determinação de eventos relacionados
aos mais variados fatores (tempo, ações do usuário, etc.), entre outros. Na Figura 1 é
mostrado um exemplo de um ambiente criado utilizando recursos da linguagem.
Figura 1: Ambiente criado utilizando recursos da linguagem VRML
Antes de introduzir os conceitos iniciais sobre a linguagem, vamos conhecer os
principais recursos que o plugin (utilizado para interpretar os códigos em VRML) proporciona.
2.1 Apresentação do plug-in Cortona 3D Viewer
Um plug-in é um programa adicional que o navegador (browser) precisa para abrir
certos tipos de arquivos. No caso de arquivos VRML, o browser irá utilizar o Cortona 3D
Viewer, da empresa Parallel Graphics, que é um visualizador dos mundos virtuais criados em
VRML. Ao abrir um arquivo VRML em um navegador, que possua o plug-in já instalado no
computador, aparecerá um painel de controle que permite a manipulação dos objetos bem
como a navegação e interação do usuário com o mundo virtual. O Cortona 3D possui duas
barras de ferramenta, aos quais são descritas a seguir:
- Vertical: contém botões utilizados para especificar o tipo de navegação no ambiente 3D;
- Horizontal: contém botões onde são pré-definidas ações com a finalidade o posicionamento
no ambiente 3D.
Nas figuras 2 e 3 estão descritos as funções de cada botão que compõe os painéis.
Figura 2: Controles da barra horizontal do plugin Cortona 3D Viewer
Figura 3: Controles da barra vertical do plugin Cortona 3D Viewer
Walk: utilizado para
movimentar o objeto na
janela de visualização.
Goto: serve para
mover a câmera
diretamente para o
objeto selecionado. Align: serve para alinhar
a posição horizontal da
câmera em relação à
cena.
ViewPoints:
serve para
configurar qual
ponto de vista
(posição da
câmera)será
utilizado em uma
cena.
Restore: retorna
automaticamente
para a posição
original no qual a
cena foi criada.
Fit: torna a cena
completamente
visível na janela de
visualização.
Fly: utilizado para
navegar pela cena na
janela de visualização.
Study: utilizado para
manipular o objeto e
visualizá-lo por vários
ângulos.
Plan, Pan, Turn e Roll:
são utilizados em
conjunto com os botões
Walk, Fly e Study e
possibilita diversos
efeitos de navegação na
cena.
2.2 Estrutura dos arquivos VRML 2.0
Tudo que se precisa para escrever um código VRML é um editor de textos. Uma vez
editados, os arquivos são gravados em formato ASCII com a extensão .wrl. Na verdade, a
linguagem apenas descreve como os ambientes tridimensionais serão representados pelo
browser. O arquivo não precisa ser compilado e não é executado por ninguém. Pode-se, por
exemplo, criar um cubo e gravá-lo em um arquivo chamado cubo.wrl. O código VRML para
este cubo descreverá as características do ambiente, como coordenadas, luz, cores,
sombreamento etc. Também pode-se colocar em um mundo objetos que estão localizados
remotamente em outros lugares na internet, além de links que levam a outros homeworlds
ou homepages.
Os arquivos-fonte em VRML possuem obrigatoriamente o seguinte cabeçalho na
primeira linha:
#VRML V2.0 utf8
Este cabeçalho indica que o programa está escrito na versão 2.0 da linguagem VRML
e “utf8”, que é um padrão mundial para especificação de arquivos-texto, aceitando
caracteres de todos os tipos (desde caracteres japoneses até caracteres acentuados em
português, espanhol, etc.).
A VRML usa o sistema cartesiano 3D. A seqüência dos eixos é X,Y,Z e a unidade de
medida para distâncias é metros e para ângulos, radianos. A medida para distância não é
definida formalmente, mas adotou-se o metro como unidade para que mundos diferentes
feitos por usuários diferentes possam ser eventualmente unidos em um só mundo.
O sistema de coordenadas tem as seguintes características: o eixo-X positivo está
para a direita, o eixo-Y positivo está para cima e o eixo-Z positivo está perpendicular aos
dois anteriores. Os eixos X, Y e Z formam o sistema de coordenadas 3D, cuja origem
consiste na coordenada espacial (0.0, 0.0, 0.0). Agora, uma "caneta virtual" pode ser
movida para esquerda e para direita, para cima e para baixo e para frente e para trás. Para
facilmente identificar como o eixo Z é posicionado em relação a X e Y pode-se utilizar a regra
da mão direita para os eixos 3D. Nesta regra a mão direita deve ficar reta com o indicador
apontando para direção positiva de Y (para cima), o polegar apontando para a direção
positiva de X (para o lado) e com o dedo do meio apontando para a direção positiva de Z
(para frente). A figura 4 mostra o "funcionamento" da regra da mão direita.
Figura 4: Regra da mão direita para o eixo 3D
3 Nodes
O paradigma para a criação de mundos VRML é baseado em conceitos de nós (ou
node em inglês), que são conjuntos de abstrações de objetos e de certas entidades do
mundo real, tais como formas geométricas, luz e som. Um nó Shape, por exemplo, contém
um nó (geometry) que indica a forma do objeto e outro (appearance) que controla a sua
aparência. Estes nós podem, por sua vez, conter outros, e assim por diante.
Além dos nós que têm um efeito visual óbvio, em VRML estão definidos uma série de
nós que provêm alguns recursos especiais, como ligações com outros arquivos hyperlinking),
a inclusão de objetos definidos em outros arquivos, e a detecção de colisões. Cada nó
contém campos que mantêm os dados que o caracterizam como um elemento único dentro
do arquivo.
Um mundo VRML é um grafo hierárquico em forma de árvore (Figura 5). As
hierarquias são criadas através de nós de agrupamento, os quais contêm um campo
chamado “children” que engloba uma lista de nós filhos. Há vários tipos de nós em VRML.
Figura 5: Grafo de uma cena em VRML
Os nós podem ser classificados em dois tipos principais: nós de agrupamento e nós-
filhos. No entanto, podemos classificá-los de modo mais específico de acordo com a função
que desempenham no arquivo.
3.1 Nós-filhos
Inicialmente será apresentado o nó-filho que iremos utilizar para construir as
primeiras cenas em VRML. Existem vários outros nós-filhos, os quais serão discutidos
conforme a necessidade.
3.1.1 Node Shape
Escrever um arquivo VRML com apenas um node não fará nada. O node especifica
apenas a forma de um objeto e não sua aparência (cor). VRML tem também um node
"Appearance", que será detalhado mais adiante, que define a cor. Quando se tem um
geometry (forma) e Appearance (cor) já se tem o suficiente para definir um objeto VRML.
Isso é feito com o node "Shape", e sua definição é essa:
Shape {
appearance (recebe o node Appearance)
geometry (recebe os nodes Box, Cylinder, Cone, Sphere, IndexedFaceSet ou IndexedLineSet)
}
O valor padrão é "NULL" para ambos os campos (appearance e geometry), que
significa que contém NADA. Um campo geometry NULL não faz muito para nós, mas o
appearance NULL faz o geometry aparecer branco puro. Mesmo assim, uma cena simples em
VRML se parece com isto:
Shape {
geometry Cone { }
}
3.2 Primitivas gráficas 3D em VRML (Nodes de desenho)
As primitivas gráficas 3D são elementos básicos na Computação Gráfica. Por meio
deles, outros objetos mais complexos podem ser construídos. Em VRML, as primitivas são
criadas a partir dos nodes de desenho, os quais são definidos dentro do node geometry. Os
nodes de desenho mais utilizados serão conhecidos nos tópicos a seguir.
3.2.1 Cubo
Este node desenha um cubo ou paralelepípedo, dependendo das medidas atribuídas.
Possui o campo size que receberá 3 valores (Figura 6):
- x: largura do objeto;
- y: altura do objeto;
- z: profundidade do objeto.
Figura 6: O cubo (Box) e suas dimensões
Box {
size x y z (onde x, y e z receberão os valores de largura, altura e profundidade do cubo)
}
3.2.2 Esfera
Este node desenha uma esfera e seu único campo é o valor do raio da esfera (Figura
7).
Figura 7: A esfera (Sphere) e seu único parâmetro (raio)
Sphere {
radius (raio da esfera)
}
3.2.3 Cilindro
Este node desenha um cilindro, com medidas de altura, raio e habilitação das faces
do topo, base e lados (Figura 8).
Figura 8: O cilindro (Cylinder) e suas medidas
Cylinder {
bottom*(TRUE ou FALSE, habilita a base)
height (altura)
radius (raio do cilindro)
side* (TRUE ou FALSE, habilita o lado)
top* (TRUE ou FALSE, habilita topo)
}
*campos opcionais que podem ser omitidos.
3.2.4 Cone
Este node desenha um cone, onde podem ser definidas as medidas de raio da base,
altura (Figura 9). Além disso, há a possibilidade de habilitar a existência ou não de lado e
base (faces). Se forem omitidas as medidas, será desenhado um cone com todas as medidas
com valor 1 (esta propriedade também é válida para o node Cylinder, Box e Sphere).
Figura 9: O cone (Cone) e suas medidas
Cone {
bottomRadius (raio da base)
height (altura)
side* (TRUE ou FALSE, habilita o lado)
bottom* (TRUE ou FALSE, habilita a base)
}
*campos opcionais que podem ser omitidos.
3.3 Aparência
É possível controlar a aparência de qualquer shape especificando-se atributos do
material a partir do qual ele é feito. Atributos do material incluem cor, quando ele brilha e
qual é a cor do brilho, quando e o quanto ele é transparente, etc. Usando os nós Appearance
e Material é possível controlar estes atributos. Como já visto, shapes VRML são definidos
através de dois campos, geometria (geometry) e aparência (appearance), onde o valor
utilizado é o nó Appearance. Similarmente, os atributos deste nó são separados nos nós
Material e de textura. A sintaxe destes nós, cujos campos são descritos neste capítulo, está
apresentada a seguir.
Appearance {
material NULL
texture NULL
textureTransform NULL
}
Material {
ambientIntensity 0.2
diffuseColor 0.8 0.8 0.8
emissiveColor 0.0 0.0 0.0
shininess 0.2
specularColor 0.0 0.0 0.0
transparency 0.0
}
As cores em VRML são descritas de uma maneira mais precisa, combinando porções
de vermelho, verde e azul (ou RGB). Cores RGB contêm três valores de ponto flutuante que
variam de 0.0 (não possui a cor) a 1.0 (cor máxima). A cor refletida pelo objeto é
especificada através do campo diffuseColor. Já o campo emissiveColor, por sua vez,
possibilita a obtenção de efeitos de brilho, pois através dele é possível especificar-se a cor
emitida pelo objeto. É importante salientar que através deste campo não é possível iluminar
shapes próximas, ele só indica que o shape é mais brilhante do que o usual.
O valor do campo transparency determina um fator de transparência entre 0.0
(opaco) e 1.0 (transparente), e ambientIntensity determina como o material é afetado pelo
nível de luz ambiente do "mundo" VRML. Quanto mais baixo for o valor, menor é o efeito da
luz sobre o material. specularColor especifica a cor da luz refletida pelo shape, isto é, a cor
do brilho. O valor default para este campo é preto, que desabilita a reflexão especular.
Finalmente, shininess controla a intensidade do brilho, sendo que 0.0 torna-o mais escuro. O
efeito visual para este campo consiste na redução do tamanho da reflexão especular. É
importante salientar que os navegadores VRML incluem automaticamente uma headlight que
move-se de acordo com a posição do observador.
Suponha que se queira construir um cubo com dimensão 2 na cor laranja (ver
código). Esta cor pode ser obtida fazendo o seguinte cálculo: na paleta de cores do Windows,
as cores são definidas com valores entre 0 e 255 (Figura 10). Basta tomar o valor de cada
componente e dividir por 255. A cor pretendida possui os valores 255, 128 e 0 ,
respectivamente, para R, G e B. Fazendo os cálculos, teremos os valores 1 = 255/255, 0.501
= 128/255 e 0 = 0/255.
Figura 10: Paleta de cores do Paint Brush com a cor laranja em destaque
Definindo-se a cor e o objeto a ser criado, eis aqui o primeiro programa em VRML:
#VRML V2.0 utf8
Shape {
Appearance Appearance {
material Material {
diffuseColor 1 0.501 0
}
}
geometry Box{
size 2 2 2
}
}
3.4 Nodes de agrupamento
Nós de agrupamento são usados para criar grafos de transformações gráficas
hierárquicas. Eles têm um campo children que contém uma lista de nós que são os
descendentes da transformação do grupo. Cada nó de agrupamento define um espaço de
coordenadas para seus filhos, que é relativo ao espaço de coordenadas do seu nó-pai, ou
seja, as transformações são cumulativas no sentido da descendência dos nós na hierarquia
do grafo de cena. Inicialmente será apresentado o nó Transform, sendo que existem vários
outros nós de agrupamento, os quais serão discutidos conforme a necessidade.
3.4.1 Node Transform
O node Transform permite que transformações geométricas sejam aplicadas aos
objetos criados em VRML. As transformações geométricas são operações matemáticas que
permitem alterações uniformes de uma figura definida em um sistema de coordenadas,
agindo sobre o conjunto de coordenadas dos pontos que compõe a figura. Em VRML, as
transformações que iremos utilizar são as seguintes: translação, rotação e escala.
3.4.1.1 Translação
Consiste na movimentação da figura pelo deslocamento de suas coordenadas . Tal
movimentação pode ser realizada em x, y ou z, utilizando o comando translation. No
exemplo abaixo é possível observar uma translação de 3 unidades em x e -2 unidades em y.
Transform{
translation 3 -2 0
chidren Shape{
appearance Appearance {
material Material {
diffuseColor 0 0 1
}
}
geometry Cone{
bottomRadius 0.5
height 2
}
}
3.4.1.2 Escala
Consiste na ampliação ou redução de uma figura, obtida pela multiplicação das
coordenadas por fatores de escala. Tal operação pode ser realizada em x, y ou z, utilizando o
comando scale. No exemplo abaixo é possível observar uma escala de 2 unidades em x e 4
unidades em y.
Transform{
scale 3 -2 0
chidren Shape{
appearance Appearance {
material Material {
diffuseColor 0 0 1
}
}
geometry Cone{
bottomRadius 0.5
height 2
}
}
3.4.1.3 Rotação
A partir de um ângulo de rotação, as coordenadas de uma figura têm o
posicionamento alterado por meio de um deslocamento angular no sentido anti-horário. Tal
operação pode ser realizada em x, y ou z, utilizando o comando rotation. Para configura qual
ou quais eixos sofrerão a transformação, basta definir 1 para o eixo escolhido e 0 para o não
escolhido. Isso deve ser feito nos 3 primeiros parâmetros do comando. Além de escolher o
eixo de rotação, deve-se definir quantos graus o objeto irá girar. Como já foi dito
anteriormente, os graus são definidos em radianos. Vejamos um exemplo: PI equivale a 180
graus, então 45 graus equivale a PI/4. Sabendo que o valor de PI, em radianos, é
aproximadamente 3.1415, então o valor de 45 graus em radianos é 0.78 (3.1415/4). Este
valor é definido no 4º. parâmetro do comando. No exemplo abaixo é possível observar uma
rotação em y de 45 graus.
Transform{
rotation 0 1 0 0.78
chidren Shape{
appearance Appearance {
material Material {
diffuseColor 0 0 1
}
}
geometry Cone{
bottomRadius 0.5
height 2
}
}
4 Modelagem de objetos mais complexos a partir das primitivas
gráficas
Em VRML, é possível se modelar objetos mais elaborados a partir das primitivas
gráficas Box, Cone, Sphere e Cylinder. Uma característica que deve ser levada em conta é
que o posicionamento dos objetos no mundo virtual é baseado no sistema de referência, que
é determinado por um ponto 3D, conhecido como pivô. Todos os objetos têm um pivô. Você
pode pensar sobre o pivô como o centro do objeto ou o centro de coordenadas locais. Na
Figura 11 é mostrado que, quando criamos um objeto qualquer em VRML, o pivô é
posicionado (por default) no seu centro.
Figura 11: Localização do pivô em um Box
Exemplo 1: Suponha que você queira colocar um Cilindro sobre um Cubo. Utilizando
a informação de que o Cubo tem dimensão 2 e está localizado em (0,0,0), como posicionar o
Cilindro se ele tem altura 3 e raio 0.5? Como o Cubo está na origem do sistema de
coordenadas e tem duas unidades de altura, considera-se que há uma unidade para cima e
uma para baixo do pivô, como mostrado na Figura 12. Além disso, a altura do Cilindro
também deve ser levada em conta, sendo 1.5 unidades para cima e para baixo do pivô.
Figura 12: Determinação das unidades de distância com relação ao pivô
pivô
1,0
1,0 1,5
1,5
Portanto, para colocar o Cilindro sobre o Cubo é necessário considerar uma unidade
acima do pivô do Cubo mais 1.5 unidades abaixo do pivô do Cilindro totalizando 2.5
unidades, conforme ilustrado pela Figura 13. Logo abaixo desta Figura é mostrado o código
fonte.
Figura 13: Processo de modelagem considerando o pivô
Código Fonte:
1,0
#VRML V2.0 utf8
Transform {
children Shape {
appearance Appearance {
material Material {
diffuseColor 0 0 1
}
}
geometry Box{
size 2 2 2
}
}
}
1,0
1,5
(0, 0, 0)
(0, 2.5, 0)
5 Reaproveitamento de objetos (comandos DEF e USE)
Estes comandos servem para o aproveitamento de um objeto criado anteriormente,
reinserindo-o no mundo virtual numa posição diferente daquela em que o mesmo fora
criado. Para isto, no objeto original escrevemos DEF <nome do objeto> antes de Shape para
definirmos um objeto. Para replicá-lo em outro local, basta escrever USE <nome do objeto>
e este será inserido na posição desejada, determinada pelo campo translation do node
Transform. Isso poupa o trabalho de definir vários objetos idênticos a serem inseridos num
mundo. No código abaixo é mostrado um exemplo do uso destes comandos.
Transform {
translation 0 2.5 0
children Shape {
appearance Appearance {
material Material {
diffuseColor 1 0 0
}
}
geometry Cylinder{
radius 0.5
height 3
}
}
}
Transform {
translation -2 -2 0
children DEF Pe_Mesa Shape {
appearance Appearance {
material Material {
diffuseColor 1 1 1
}
}
geometry Cylinder {
radius 0.2
height 4
}
}
}
Transform {
translation -2 -2 -4
children USE Pe_Mesa
}
Este comando também pode ser útil para outras finalidades. Por exemplo: se com os
comandos acima você cria uma mesa, não seria interessante poder replicar a mesa inteira
em outro local? Isto é possível usando o comando "Group", que agrupa vários objetos e
permite que este grupo seja copiado para outro local do mundo virtual. Veja o exemplo:
DEF Mesa Group {
children [
#Mesa
Transform {
translation 0 0 -2
children Shape {
appearance Appearance {
Aqui o Pe_Mesa é
definido e inserido no
cenário.
Aqui o Pe_Mesa é
chamado, sendo inserido
em nova posição.
Aqui é definido um
grupo de objetos que
formam uma mesa.
material Material {
diffuseColor 1 1 1
}
}
geometry Box {
size 5 0.5 5
}
}
}
#Pes da mesa
Transform {
translation -2 -2 0
children DEF Pe_Mesa Shape {
appearance Appearance {
material Material {
diffuseColor 1 1 1
}
}
geometry Cylinder {
radius 0.2
height 4
}
}
}
Transform {
translation -2 -2 -4
children USE Pe_Mesa
}
Transform {