esta unidade terá a finalidade de introduzir os principais ... · a modelagem em 3 dimensões...

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

Upload: ngodang

Post on 25-Nov-2018

216 views

Category:

Documents


0 download

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 {

translation 2 -2 -4

children USE Pe_Mesa

}

Transform {

translation 2 -2 0

children USE Pe_Mesa

} ]

}

Transform {

translation –8 0 0

children USE Mesa

}

E aqui o grupo de

objetos é chamado,

sendo que o mundo

agora possui duas

mesas.