
Tutorial
VRML 1.0
Por Juliano
Ipolito
Todos os direitos reservados.
![]()
Este tutorial faz parte dos projetos de pesquisa
do Grupo de Realidade Virtual
do Departamento de Computação
da Universidade Federal de São Carlos.
Quaisquer dúvidas, críticas ou sugestões podem ser
enviadas diretamente ao autor.
Há um arquivo ZIP contendo todos
os arquivos deste tutorial para uso local.
Última atualização : 18-03-97.
Você é o usuário
que passou por aqui.
![]()
Começando com a linguagem Unidades de Medida Nodes
Nodes Básicos - Criando objetos
- AsciiText - Começando com texto
- FontStyle - Mudando a aparência do texto
- Cube - Definindo Cubos
- Cone - Definindo Cones
- Sphere - Definindo Esferas
- Cylinder - Definindo Cilindros
- IndexedFaceSet, IndexedLineSet, Coordinate3 - Trabalhando com polígonos
Nodes de Transformação - Mudando as características dos objetos
![]()
Há um tempo atrás, surgiu a idéia de levar a Realidade Virtual para a Internet. Dessa idéia surgiu o VRML, que é a abreviação de Virtual Reality Modeling Language, ou Linguagem para Modelagem em Realidade Virtual. VRML é uma linguagem independente de plataforma que permite a criação de ambientes virtuais por onde se pode passear, visualizar objetos por ângulos diferentes e até interagir com eles. A primeira versão da linguagem não possibilita muita iteração do usuário com o mundo virtual, mas versões recentes acrescentam características como animação, movimentos de corpos e interação entre usuários. A última versão é a 2.0, chamada Moving Worlds VRML 2.0. A Especificação VRML é a documentação que descreve todas as características da linguagem.
Apresentada pela primeira vez em 1994 na Primeira Conferência sobre World Wide Web, a linguagem tem como objetivo dar o suporte necessário para o desenvolvimento de mundos virtuais multi-usuários na Internet, sem precisar de redes de alta velocidade. O código VRML é um subconjunto do formato de arquivo ASCII do Open Inventor, da Silicon Graphics, com características adicionais para navegação na Web. Esta característica é equivalente às âncoras do HTML, ou seja, pode-se criar âncoras em um mundo virtual que levem a outros mundos virtuais.
A linguagem trabalha com geometria 3D (VRML 1.0 possui algumas primitivas : cubo, cone, cilindro e esfera) e suporta transformações (rotação, translação, escala), texturas, luz e sombreamento. Outra característica importante da linguagem é o Nível de Detalhe (LOD, level of detail) que disponibiliza a quantidade certa de dados para um objeto baseado na sua importância na cena. Isso torna rápida a visualização e possibilita ao usuário ajustar o nível de detalhe que lhe for melhor.
Para navegar em mundos virtuais criados com a linguagem você precisará usar browsers que suportem VRML. Assim, ao invés de visitar homepages, você visitará homeworlds. Existem muitos browsers disponíveis que suportam diretamente a linguagem. Outros browsers que não suportam necessitam de software adicional (plug-in).
[Índice]
![]()
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.
Ficou definido, para fins de identificação, que todo arquivo VRML 1.0 tem que ter o cabeçalho :
#VRML V1.0 asciiFuturamente, em outras versões da linguagem, isto muda. Na versão atual, o cabeçalho fica da seguinte maneira :
#VRML V2.0 utf8O caracter '#' também significa comentário. Toda linha que começa com # será ignorada pelo browser. É bom usar comentários no meio do código, isso facilita a compreensão e identificação de partes do cenário, como por exemplo :
# Universidade Federal de São Carlos - Departamento de Computação . . .
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 adoutou-se o metro como unidade para que mundos diferentes feitos por usuários diferentes possam ser eventualmente unidos em um só mundo. É o caso do Projeto UFSCar Virtual, cujo objetivo é modelar a Universidade Federal de São Carlos em VRML. O projeto foi dividido em partes. Se cada pessoa que modelasse o ambiente usasse uma unidade diferente, poderia ser um problema juntar todos os prédios, já que um poderia ter 30 metros de altura e outro 30 km.
Tomando esta página como referência, 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, saindo da página na direção do leitor.
Basicamente, pode-se dizer que um node
é um conjunto de especificações que determinam as
características dos objetos contidos no cenário.Os nodes
definem a hierarquia e as características individuais de cada objeto
dentro do contexto geral.
O node descreve o tipo do objeto, que pode ser uma esfera, um cilindro,
uma transformação, uma definição de luz ou
textura etc. Também define as características de cada um,
como tamanho de um cubo, diâmetro de uma esfera, intensidade da luz
ambiente, cor etc. Não é necessário dar nome a um
node, mas se isso for feito, não se pode ter dois nodes com nomes
iguais.
Sintaxe para definição de um node :
DEF Nome_do_Objeto Tipo_do_Objeto {
campos valores
. .
. .
}
Exemplo :
#VRML V1.0 ascii
#Exemplo de um cubo
DEF PrimeiroCubo Cube {
width 30
height 30
depth 30
}
O exemplo acima demonstra a criação
de um objeto cubo chamado PrimeiroCubo de largura, altura e profundidade
iguais a 30 unidades. Width, heitgh e depth são
propriedades ou parâmetros do objeto Cube, com valores iguais
a 30. Mais detalhes sobre este node serão vistos adiante.
[Índice]
VRML possui diferentes classes de nodes. Esta
seção mostra em detalhes alguns nodes que são usados
mais freqüentemente para construir os cenários 3D. São
os que definem propriedades, grupos e sólidos (cubo, esfera, etc.).
Para começar, AsciiText é um bom exemplo.
O node AsciiText é usado para colocar texto no cenário. Por definição, o texto é colocado pela primeira vez na posição (0,0,0). Outros parâmetros como tipo e estilo da fonte podem ser mudados usando o node FontStyle. Os parâmetros para AsciiText são os seguintes :
- justification - Define a justificação do texto, que pode ser :
LEFT - alinha o texto à esquerda.
CENTER - centraliza o texto.
RIGHT - alinha o texto à direita.- string - String contendo o texto a ser mostrado.
- spacing - espaçamento (número real).
- width - Largura do texto (número real).
Exemplo :
#VRML V1.0 ascii AsciiText { string "UFSCar" justification CENTER }[Índice]
FontStyle - Mudando a aparência do texto
Este node é usado para mudar a aparência dos textos que são mostrados com AsciiText. Os atributos que são especificados por este node afetam o modo como o texto é mostrado por todos AsciiText subseqüentes. FontStyle permite mudar o tamanho da fonte, estilo e família a qual ela pertence. Os parâmetros para AsciiText são os seguintes :
- size - número real que define o tamanho da fonte a ser usada.
- family - tipo de fonte :
SERIF - estilo serif, geralmente a fonte Times New Romam.
SANS - estilo sans serif.
TYPEWRITER - estilo teletipo.- style - estilo da fonte :
BOLD - fonte em negrito.
ITALIC - itálico.
NONE - nenhuma mudança no estilo.Exemplo :
FontStyle { size 10 # número real family SANS # SANS ou SERIF ou TYPEWRITER style BOLD # BOLD ou ITALIC ou NONE }Cube - Definindo Cubos O node Cube é usado para definir paralelepípedos. Para isso, entramos com sua largura (width), sua altura (height) e sua profundidade (depth). A posição do cubo no espaço será definida pela posição do seu centro. Então quando falarmos em posição de um cubo, estaremos falando da posição do seu centro. Esta regra vale para muitos outros objetos.
Exemplo 1 :#VRML V1.0 ascii Cube { width 30 height 30 depth 60 } Ver exemplo 1Exemplo 2 :VRML V1.0 ascii Cube { width 30 height 30 depth 60 } Translation { translation -70 0 0 } Cube { width 45 height 45 depth 45 } Ver exemplo 2Veja os exemplos acima. O exemplo 1 demonstra um cubo. O exemplo 2 mostra como podemos criar um outro cubo deslocado para a posição (-70, 0, 0) do espaço, usando o node de transformação Translation. Este node é usado para posicionar objetos no espaço. Se colocássemos no arquivo texto outro objeto logo abaixo da definição do cubo, este teria seu centro na mesma posição que o centro do cubo, porque o novo objeto estaria no mesmo contexto ou hierarquia que o cubo. Quem define a hierarquia dos objetos no ambiente é o node Separator. Se tivéssemos definido cores, luz, rotação etc., estas características só estariam presente nos objetos contidos nesse contexto.
[Índice]
Cone - Definindo Cones O node Cone é usado para criar cones simples. Os parâmetros para este node são : bottomRadius, que define o raio da base, e height, que define sua altura. Por default, o cone é centralizado na posição (0,0,0), tem raio 1 e altura 2. Exemplo de um cone de altura 3 e raio 1 :
#VRML V1.0 ascii Cone { bottomRadius 1 height 3 } Ver este exemploVamos agora acrescentar mais um objeto ao exemplo acima. Vamos colocar mais um cone em outra posição no cenário. Para isso temos de usar o node Translation para definir a posição deste novo objeto. O novo exemplo é o seguinte :
#VRML V1.0 ascii Cone { bottomRadius 10 height 15 } Translation { translation 70 0 0 } Cone { bottomRadius 10 height 30 } Ver este exemploNo exemplo acima são criados dois cones : um de altura 15 e outro de altura 30. Devido ao node Translation o cone de altura 30 é colocado na posição (70,0,0). Se outro objeto for acrescentado ao exemplo, este terá seu centro nesta mesma posição.
[Índice]Sphere - Definindo Esferas O node Sphere é usado para representar uma esfera. Por default, o raio da esfera é 1 unidade e seu centro está em (0,0,0). O único parâmetro para Sphere é radius, que define o comprimento do seu raio. Exemplo de uma esfera de raio 10 :
#VRML V1.0 ascii Sphere { radius 10 } Ver este exemploVamos agora acrescentar outro objeto ao exemplo acima :
#VRML V1.0 ascii Sphere { radius 10 } Translation { translation 0 -15 0 } Rotation { rotation 1 0 0 3.1415 } Cone { bottomRadius 8 height 25 } Ver este exemploNo exemplo acima uma esfera de raio 10 é criada. Em seguida, um cone é criado. O cone de altura 25 e raio 8 sofre duas transformações : uma rotação e uma translação. Primeiro, a translação desloca o cone um pouco para baixo em relação ao eixo-y. Depois, o node Rotation rotaciona o cone para que sua base fique para cima. Os parâmetros para o node Rotation indicam que os objetos subseqüentes sofrerão rotação no eixo-x (1,0,0) de 3.1415 radianos (ou 180 graus). Após estes procedimentos teremos um objeto parecido com um sorvete.
[Índice]
Cylinder - Definindo Cilindros O node Cylinder é usado para definir cilindros. Por default, o cilindro está na vertical, com seu centro na posição (0,0,0) e com raio igual a 1 unidade. Existem dois parâmetros para Cylinder : radius, que define seu raio, e height, que define sua altura. Exemplo :
#VRML V1.0 ascii Cylinder { radius 10 height 30 } Ver este exemploA seguir, um outro exemplo mostrando como modelar um simples pinheiro :
#VRML V1.0 ascii Cone { height 30 bottomRadius 10 } Translation { translation 0 -22.5 0 } Cylinder { radius 3 height 15 } Ver este exemploNo exemplo acima criamos um cone e um cilindro. Como o cone tem altura 30, a coordenada y do seu centro será 15. Deslocando 22.5 pontos em relação ao eixo-y no sentido negativo, teremos a posição y = -7.5 (15 - 22.5 = -7.5). Para que o cilindro alcance o cone ele precisa ter altura 15, pois assim seu centro estará em y = -7.5. Assim conseguimos fazer com que os dois objetos fiquem adjacentes. Para visualizar com mais detalhes, clique com o botão direito, selecione a opção Detail, e então selecione Wireframe.
[Índice]
Material - Dando cores aos objetos O node Material define características dos objetos como cor e brilho. Os parâmetros que são usados determinam a forma como a luz irá refletir sobre os objetos. São eles :
- diffuseColor - reflexão da luz que estiver incidindo sobre um objeto. Quanto mais diretamente a luz incidir sobre a superfície do objeto, mais luz será refletida. É usado para dar cor aos objetos.
- ambientIntensity - especifica quanto da luz ambiente um objeto deve refletir.
- shininess e specularColor - determinam a luminosidade de pontos de reflexão com maior quantidade de luz (highlight points). Se o ângulo que a luz incidir for próximo do ângulo de observação, o valor de specularColor é adicionado ao cálculo de diffuseColor e ambientIntensity. Shininess determina o brilho do objeto. Quanto maior seu valor, maior o brilho.
- emissiveColor - usado para representar objetos incandescentes. Usado quando todas as outras cores são preta (0,0,0).
- transparency - determina o grau de transparência do objeto, que varia de 0.0 (totalmente opaco) a 1.0 (totalmente transparente).
A cor dos objetos é formada pela composição das cores básicas vermelho, verde e azul (RGB), cujos valores variam entre 0 e 1. Sendo assim, se quisermos um objeto amarelo temos que especificar (1,1,0), ou seja, 100% de vermelho e verde e nada de azul. Vamos acrescentar cor a alguns objetos do exemplo do pinheiro :
#VRML V1.0 ascii Material { diffuseColor 0 1 0 shininess 0 } Cone {height 30 bottomRadius 10 } Material { diffuseColor 64 0 0 shininess 1 } Translation { translation 0 -22.5 0 } Cylinder {radius 3 height 15 } Ver este exemplo[Índice]
IndexedFaceSet, IndexedLineSet, Coordinate3 - Trabalhando com polígonos Este conjunto de nodes é muito importante pois é com eles que definimos formas geométricas que não estão pré-definidas na linguagem. O node Coordinate3 é usado para definir pontos no ambiente, onde cada ponto tem seu respectivo índice, iniciando em zero. Por exemplo :
#VRML V1.0 ascii Coordinate3 { point [ 0 0 0, #ponto 0 10 0 0, #ponto 1 5 10 0, #ponto 2 ] }Isto define 3 pontos : o ponto 0, cujas coordenadas são (0,0,0), o ponto 1 (10,0,0) e o ponto 2 (5,10,0). Coordinate3 apenas especifica as coordenadas dos pontos no espaço. Isso significa que, por enquanto, não temos nenhuma figura no ambiente. Agora queremos ligar os 3 pontos no espaço para formar um triângulo. Para isso usamos o node IndexedFaceSet.
#VRML V1.0 ascii Coordinate3 { point [ 0 0 0, 10 0 0, 5 10 0, ] } IndexedFaceSet { coordIndex [ 0, 1, 2, -1 ] } Ver este exemplo
Definidos os pontos, basta ligá-los para formarmos um triângulo. No exemplo, IndexedFaceSet definiu quais pontos seriam ligados para formar esta face. O -1 indica o fim da ligação. Se ao invés de um triângulo preenchido quiséssemos só um contorno, usaríamos o node IndexedLineSet. Ele funciona da mesma maneira que IndexedFaceSet, mas ao invés de preencher a face que está sendo definida ele apenas desenha seu contorno. Exemplo usando IndexedLineSet :
#VRML V1.0 ascii Material { diffuseColor 1 1 0 } Coordinate3 { point [ 0 0 0, 10 0 0, 5 10 0, ] } IndexedLineSet { coordIndex [ 0, 1, 2, 0, -1 ] } Ver este exemploO exemplo a seguir mostra como criar uma pirâmide sólida e outra com apenas o contorno :
#VRML V1.0 ascii Separator { DEF CoordPiram Coordinate3 { point [ 0 0 0, #0 30 0 0, #1 30 30 0, #2 0 30 0, #3 15 15 20, #4 ] } Separator { USE CoordPiram IndexedFaceSet { coordIndex [ 0, 1, 2, 3, -1, 0, 1, 4, -1, 1, 2, 4, -1, 2, 3, 4, -1, 3, 0, 4, -1, ] } } Separator { Translation { translation 75 0 0 } USE CoordPiram IndexedLineSet { coordIndex [ 0, 1, 2, 3, -1, 0, 1, 4, -1, 1, 2, 4, -1, 2, 3, 4, -1, 3, 0, 4, -1, ] } } }
Ver este exemplo [Índice]
Rotation - Rotacionando objetos O node Rotation é usado para rotacionar objetos no espaço. Como exemplo, vamos rever o node Cylinder. Por default, todo cilindro é criado na posição vertical. Se quisermos um cilindro na horizontal, basta utilizarmos o node Rotation :
#VRML V1.0 ascii Rotation { rotation 0 0 1 1.57 } Cylinder {}Ver este exemploNo exemplo acima, o cone é rotacionado 90 graus (1.57 radianos) sobre o eixo-z ( 0 0 1 ).
[Índice]
Translation - Deslocando objetos Este node é parecido com o Rotation, mas é usado para deslocar objetos. Veja o exemplo abaixo :
#VRML V1.0 ascii Cube {} Translation { translation 10 0 0 } Sphere {} Translation { translation -20 0 0 } Cone {} Ver este exemploNo exemplo acima, criamos um cone na origem (0,0,0), pois este é o primeiro objeto que está sendo criado e antes dele não foi aplicado nenhum deslocamento ou rotação. Logo após a criação do cubo, usamos o Translation para deslocarmos os objetos subseqüentes para a posição (10,0,0). Isto significa que todo objeto que for criado a partir daí terá seu centro nesta posição. Sendo assim, a esfera que é criada em seguida terá seu centro na posição (10,0,0). Depois aplicamos mais uma vez o Translation. Repare no valor do deslocamento : -20 em relação ao eixo-x. Isto faz com que o cone que é criado em seguida esteja localizado a -20 unidades de distância da esfera em relação ao eixo-x, e a -10 unidades de distância do cubo. A seguir é mostrado um outro modo de se fazer isso :
[Índice]
Separator - Definindo a hierarquia dos objetos Este node define a hierarquia dos objetos dentro do cenário. É usado para separar um grupo de objetos do resto do ambiente, ou seja, as características desse grupo serão diferentes do resto. Veja o exemplo :
#VRML V1.0 ascii Material { diffuseColor 1 1 0 } Separator { Material { diffuseColor 0 1 0 } Cube {} Translation { translation 10 0 0 } Sphere {} } Translation { translation -10 0 0 } Cone {}Ver este exemploQuando definimos a cor amarela pela primeira vez (diffuseColor 1 1 0), esperamos que todos os objetos subseqüentes sejam desta cor. No entanto, apenas o cone é amarelo. Isto se deve ao uso do node Separator, que separa o cubo e a esfera do resto do ambiente. As propriedades definidas para estes objetos (posição e cor) não irão interfirir nos outros objetos que estiverem fora deste contexto ou hierarquia. Repare no translation -10 0 0; não foi necessário deslocar -20 unidades porque este é o primeiro deslocamento feito no contexto em que está o cone. Também a cor verde só vale dentro do contexto do cubo e da esfera.
[Índice]
Texture2 - Trabalhando com texturas Este node é usado para aplicar texturas aos objetos.
#VRML V1.0 ascii Texture2 { filename "granite.gif" } Sphere {}Ver este exemplo[Índice]
LOD - Definindo o nível de detalhe
Este node determina o nível de detalhe de um objeto ou conjunto de objetos dependendo da distância em que estes se encontram do observador. Isto torna rápida a visualização porque objetos com menos importância na cena podem ser substituídos por outros menos complexos. Por exemplo, um carro que estiver a 1000 unidades de distância pode ser substituído por um cubo. Um cubo é bem mais simples que um carro. O objeto pode também ter mais de um nível de detalhe. O carro pode ser representado como um simples cubo a 1000 unidades de distância, dois cubos a 500 unidades, dois cubos e quatro esferas a 500 etc. Exemplo :
#VRML V1.0 ascii LOD { range [15, 25] center 0 0 0 #primeiro nível Separator { Cube {} Translation { translation 3 0 0 } Sphere {} Translation { translation 3 0 0 } Cone {} } #segundo nível Separator { Cube {} Translation { translation 3 0 0 } Sphere {} } #terceiro nível Separator { Cube {} } }Ver este exemploO que acontece no exemplo acima á o seguinte : no primeiro nível de detalhe são mostrados todos os objetos. Isto significa que o observador está posicionado a menos de 15 unidades dos objetos. Se o observador estiver entre 15 e 25 unidades, é mostrado apenas uma esfera e um cubo. Finalmente, se o observador estiver posicionado a mais de 25 unidades de distância apenas um cubo é mostrado.
[Índice]
Recursos on-line
- Documentação e tutoriais
- Tutorial VRML em português
http://www.dc.ufscar.br/grv/vrml/tutoriais/vrml10/- Tutorial Extensões Live3D para VRML 1.0 - em português - crie animação e adicione som ao VRML 1.0
http://www.dc.ufscar.br/grv/vrml/live3d/- Grupo de Realidade Virtual - Departamento de Computação - UFSCar
http://www.dc.ufscar.br/grv/- Realidade Virtual - Introdução, conceitos, aplicações, equipamentos, software etc.
http://www.dc.ufscar.br/~juliano/rv/
http://www.dc.ufscar.br/~juliano/- Especificação VRML 1.0
http://www.eit.com/vrml/- Especificação VRML 2.0
http://vrml.sgi.com/moving-worlds/- Tutorial básico sobre VRML em 13 lições
http://www.mwc.edu/~pclark/index.html- Guia completo sobre como utilizar texturas
http://www.ywd.com/cindy/texture.html- FAQ VRML
http://www.oki.com/vrml/VRML_FAQ.html- Objetos e cenários prontos
http://vrml.arc.org/worlds/
http://www.sdsc.edu/SDSC/Partners/vrml/examples.html- Índices, referências, grupos de discussão
- Índice VRML Yahoo
http://www.yahoo.com/Computers_and_Internet/Internet/World_Wide_Web/Virtual_Reality_Modeling_Language_VRML_/- Muitos links sobre VRML : browsers, ferramentas, documentação
http://www.3dsite.com/cgi/VRML-index.html- Repositório
http://www.sdsc.edu/vrml/- Fórum
http://vrml.wired.com/- Referências
http://www.yahoo.com/Entertainment/Virtual_Reality/Indices/- Informações técnicas, software, documentos
http://www.well.com/user/caferace/vrml.html- Newsgroups, mailing lists
http://www.sdsc.edu/SDSC/Partners/vrml/repos_mailing.html
- Ferramentas para modelagem e conversores
- Caligari Pioneer Pro
http://www.caligari.com- Sony CyberPassage
http://vs.sony.co.jp/VS-E/works/editor/what.html- HomeSpace Builder
http://www.us.paragraph.com/whatsnew/homespce.htm- Conversor 3D Studio para VRML
http://www.best.com/~adhoc/html/vrml.html- Conversor DXF para VRML
http://www.organic.com/vrml/- Conversor WLK para VRML
http://ima-www.informatik.uni-hamburg.de/Students/1hempel/hempel.html- Ferramentas e conversores
http://webspace.sgi.com/Tools/index.html[Índice]
![]()
Copyruight (C) 1996 Juliano Ipolito.
Todos os direitos reservados.