VRML-Virtual Reality Modeling Language
Documento elaborado originalmente para a
JAI - Jornada de Atualização em Informática
Congresso Nacional da Sociedade Brasileira de Computação


A idéia de VRML foi concebida em junho de 1994, durante a primeira conferência anual de WWW, na Suiça. Surgiu baseada na necessidade de se ter uma ferramenta de especificação e visualização gráfica 3D na rede. A sigla originalmente significava Virtual Reality Markup Language inspirada em HTML. Posteriormente o nome foi mudado para Virtual Reality Modeling Language. Ao final da conferência, foi criada a lista de discussão eletrônica WWW-VRML moderada por Mark Pesce, com o objetivo de definir a nova linguagem.
O trabalho iniciou na busca de uma linguagem que já existisse e que pudesse ser adaptada para atender aos seguinte objetivos:
Ao final da discussão, o consenso foi de que a linguagem Open Inventor, da Silicon Graphics, era a melhor alternativa.
A Silicon, por sua vez, através de Gavin Bell e Paul Strauss adaptou e deixou disponível na rede seu parser para a nova linguagem. Organizada por Gavin Bell, Mark Pesce e Anthony Parisi(Intervista Software) a versão final da especificação de VRML ficou pronta em maio de 1995. Os melhores locais para se iniciar uma pesquisa sobre VRML são sua FAQ[48] ou a página dos course notes do SIGGRAPH’95[94]. Quanto a livros, bons exemplos são[2, 41, 74].

7.1 Navegadores para VRML

Existem inúmeros visualizadres de VRML, entre eles podemos citar o Netscape, o WorldView, Interent Explorer e VrWeb . Uma extensa lista pode ser encontrada na FAQ.

7.2 Um Primeiro Programa em VRML

A VRML trabalha basicamente com instanciamento de objetos 3D pré-definidos ou construídos a partir de polígonos. Os parâmetros de instanciamento disponíveis são geométricos(posição, escala e rotação) e visuais(cor e textura).
Além dos objetos é possível posicionar fontes de luz e definir posições de observação. Para o uso da rede, VRML possui links e includes. O primeiro permite a navegação pela rede, o segundo, a inclusão de objetos já definidos(remota ou localmente).

7.2.1 Estrutura Básica

Um programa em VRML inicia sempre com a linha #VRML V1.0 ascii. Toda a especificação de objetos, links, atributos ou transformações, é colocada dentro de blocos que são definidos pela expressão Separator. Os comentários em VRML iniciam sempre pelo símbolo # e valem na linha em que aparece. É bom lembrar que assim com C e C++, VRML também é case-sensitive, ou seja, diferencia maiúsculas e minúsculas.

7.2.2 Definindo Cubos

Para definir um cubo(na verdade um paralelepípedo) use a expressão Cube { height h1 width w1 depth d1 }, onde h1, w1 e d1 designam a altura, a largura e a profundidade do paralelepído. Na figura 7.1 aparece um cubo e seu respectivo programa em VRML.
VRML V1.0 ascii 
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 1 - Exemplo de um Cubo
# ******************************************
Separator   
{
   Cube { height 0.5 width 3 depth 1 }
}
 
Figura 7.1 - Exemplo de um Cubo em VRML
ATENÇÃO: Experimente digitar o programa VRML ao lado, no NOTEPAD, gravá-lo como Teste1.wrl e carregá-lo no seu navegador.

7.2.3 Definindo Esferas

Para definir uma esfera, deve ser especificado o raio. A expressão é: Sphere { radius r1}. Se o raio for omitido o Browser assumirá o valor 1. O centro padrão da esfera é (0,0,0). Na figura 7.2 aparece uma esfera e seu respectivo programa em VRML.
#VRML V1.0 ascii
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 2 - Exemplo de uma Esfera
# ******************************************
Separator   
{
   Sphere { radius 2 }
}
 
Figura 7.2 - Exemplo de uma Esfera em VRML
7.2.4 Definindo Cilindros
Um cilindro em VRML é criado através do comando Cylinder { radius r1 height h1}. O centro padrão está na posição (0,0,0) e o raio, se for omitido, assumirá o valor 1. A posição padrão é na vertical. Na figura 7.3 aparece um cilindro e seu respectivo programa em VRML.
#VRML V1.0 ascii 
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 3 - Exemplo de um Cilindro
# ******************************************
Separator   
{
  Cylinder { radius 1 height 2 }
}
 
Figura 7.3 - Exemplo de um Cilindro em VRML
7.2.5 Definindo Cones
Criado com o centro da base na posição (0,0,0), o cone em VRML permite que se defina sua altura e o raio da base. O comando é Cone { bottomRadius r1 height h1 }. O padrão é um cone de altura 2 e raio da base 1. Na figura 7.4 aparece um cone e seu respectivo programa em VRML.
#VRML V1.0 ascii
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 4 - Exemplo de um Cone
# ******************************************
Separator   
{
  Cone { bottomRadius 1 height 2 }
}
Figura 7.4 - Exemplo de um Cone em VRML

7.2.6 Definindo Polígonos

Para criar polígonos(faces de objetos) em VRML, deve-se definir duas estruturas: uma tabela de faces e uma tabela de vértices.Na tabela de vértices, são inseridas as coordenadas X,Y e Z de cada ponto, sendo que cada coordenada é separada por um espaço e cada ponto por uma vírgula.
Na tabela de faces é definido como os vértices se conectam para formar as faces(polígonos). Nesta tabela, cada vértice é especificado por um número, correspondente à sua posição(índice) na tabela de vértices. O primeiro vértice da tabela tem sempre índice 0(zero).
A separação de cada vértice é feita por uma vírgula e o final da descrição de uma face é especificado por "-1". Na figura 7.5 são definidas os vértices e as faces necessárias para criar uma pirâmide de base quadrada, com o ápice em (0,10,0). Para que a remoção das faces seja feita de forma correta, todas as faces devem ser definidas com seus vértices orientados no mesmo sentido(horário ou anti-horário).
#VRML V1.0 ascii

# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 5 - Exemplo de polígonos
# ******************************************
Separator   
{

  Coordinate3         # Tabela de Vértices
  {
    point [  0  10  0,   # vértice 0 
            -5   0  5,   # vértice 1
             5   0  5,   # vértice 2
             5   0 -5,   # vértice 3
            -5   0 -5,   # vértice 4
          ]
  }
  IndexedFaceSet      # Tabela de Faces
  {                             
    coordIndex [
                 1, 2, 3, 4, -1, # Base
                 0, 1, 2, -1,  # Frontal
                 0, 2, 3, -1,  # Direita
                 0, 3, 4, -1,  # Traseira
                 0, 4, 1, -1   # Esquerda
               ]
  }
}
 
Figura 7.5- Exemplo de uma Pirâmide em VRML
7.2.7 Texturas e Cores
Para aplicar uma textura(imagem) sobre um objeto, basta colocar o comando Texture2 antes da definição do objeto. A sintaxe deste comando é apresentada na figura 7.6, onde é mapeada uma figura sobre um cubo.
Para definir uma cor, o VRML possui o comando Material e o comando diffuseColor. Na realidade Material define um grupo de propriedades visuais das quais, cor é uma delas. A especificação da cor é feita definindo-se suas componentes R,G e B, que podem variar no intervalo entre [0..1].
VRML V1.0 ascii
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 6 - Exemplo de TEXTURA
# ******************************************
Separator   
{
  Texture2
  {
      filename "parede.gif"
  }
  Separator
  {
    Cube {}
  }
}
 
Figura 7.6 - Exemplo de um Cubo com Mapeamento de Textura
 
#VRML V1.0 ascii
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada e Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 7 - Exemplo de uso de Cor
# ******************************************
Separator   
{
  Material { diffuseColor 0 1 0 } # Cor Verde
  Separator
  {
    Cube {}
  }
}               
Figura 7.7 - Exemplo de um cubo verde

7.2.8 Transformações Geométricas sobre os Objetos

        Até o momento apresentamos apenas objetos em sua posições originais. Em VRML, para mudar a posição ou orientação de um objeto aplica-se transformações. O comando que define uma transformação é o Transform { ... } dentro do qual é possível especificar, entre outras coisas, a rotação e a posição do objeto.

        Para a posição há o comando translation tx ty tz, para a rotação há o comando rotation ex ey ez ang. Na translação os parametros tx ty tz definem a posição do objeto. Na rotação ex ey ez define o eixo de rotação e ang define o ângulo. Na figura 7.8, são exibidos dois cilindros com diferentes rotações e posições. Note que há um nível a mais de Separator {…} no código. Isto foi colocado pois alguns Browsers, como o WorldView, precisam de um bloco externo que inclua todos os objetos.

É importante lembrar que as transformações geométricas, assim como as propriedades visuais, tem efeito apenas dentro do bloco Separator { ... } onde estão definidos , a partir da posição onde aparecem.
#VRML V1.0 ascii
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
# Programa 8 - Exemplo de Transf. geometrica
# ******************************************
Separator # Bloco externo necessário a alguns 
{          # Browsers
  Separator   # Primeiro cilindro
  {
      Transform
      {            
        translation -2 0 0  # Desloc. à esq.
        rotation 1 0 0 1.7  # Rot. eixo X
      }
                            # Vermelho
      Material { diffuseColor 1 0 0 }
      Cylinder {}
  }
  Separator  # Segundo cilindro
  {
      Transform
      { 
        translation 2 0 0   # Desloc. à dir.
        rotation 0 0 1 -1.7 # Rot. eixo Z
      }
                            # Verde
      Material { diffuseColor 0 1 0 }
      Cylinder {}
  }
}
Figura 7.8 - Transformações Geométricas em Cilindros

7.2.9 "Links" e "Includes"

Em VRML, qualquer objeto pode ser um link para outra página. Para tanto basta colocar dentro do bloco onde o objeto está definido o comando WWWAnchor, seguido da URL destino do link e da definição dos objetos que servirão como âncora. O exemplo da figura 7.9 cria um link para dois endereços diferentes, a partir de dois objetos distintos.
Para incluir objetos já definidos em outros arquivos(locais ou remotos) usa-se o comando WWWInline seguido da URL do arquivo. Na figura 7.10 é apresentado um exemplo do uso do WWWInline.
 
#VRML V1.0 ascii
# ******************************************
#   "Uma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática 
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 9 - Exemplo de link
# ******************************************
WWWAnchor
{    
 # Nome do arquivo que será o destino do link
  name "file:c:/teste2.wrl"  
  Separator 
  {
    Transform
    {
      translation -5.0 0.0 0.0  # Desloca  para esquerda
    }
    Cube { height 1 width 3 depth 3 }
  }
}
Figura 7.9 - Exemplo de Link em VRML
 
#VRML V1.0 ascii
# ******************************************
#   Üma Introdução à realidade Virtual"
#      Congresso da SBC
#      Jornada de Atualização em Informática
#      Refice, PE
#      Agosto, 1996
# ******************************************
#  Programa 10 - Exemplo de include
# ******************************************
Separator  # Bloco externo necessário a alguns Browsers
{
  Separator
  {
    Transform
    {
      translation -7 0 0
      rotation 1 0 0 -0.78
    }
    WWWInline {  name "file:c:/piramide.wrl"  }
  }
  Separator
  {
    Transform
    {
      rotation 1 0 0 0.78
      translation 7 0 0
    }
    WWWInline {  name "file:c:/doc/jai/piramide.wrl"  }
  }
}
 
Figura 7.7 - Exemplo de INCLUDE em VRML