AM 533A - Computação Gráfica e Multimídia I
Utilização do VRML
Texto: Elisa Calhau de Castro e Léo Pini Magalhães
1o semestre de 1999
Aula 2






O que será visto nesta aula:

IV - Group Node
V - Transformações


IV - Group Node

                        Este nodo é um grouping node (vide item I.4.2) que nos possibilita agrupar geometrias, a fim de criar um novo objeto que seja constituído pela combinação de outros objetos.

                 Group {
          eventIn      MFNode  addChildren
          eventIn      MFNode  removeChildren
          exposedField MFNode  children      []
          field        SFVec3f bboxCenter    0 0 0
          field        SFVec3f bboxSize      -1 -1 -1
        }
 
 
 
Campo                                   Descrição 
bboxCenter centro da área retangular hipotética que circunda os nodos especificados em children
bboxSize dimensões em x, y e z da área retangular hipotética que circunda os objetos especificados em children no nodo Group
children nodos a serem agrupados 
Eventos        eventIn                                   MFNode
addChildren adiciona o nodo especificado na lista de objetos em children do nodo Group. Caso este nodo já exista, a nova inclusão é ignorada
removeChildren remove o nodo especificado da lista de objetos em children do nodo Group. Caso este nodo não exista, a remoção é ignorada.
                        Os campos bboxCenter e bboxSize são usados opcionalmente para especificar uma área ao redor dos objetos agrupados, porém, ajudam o browser a fazer otimizações durante a renderização.  Devem ser tais que sempre sejam capazes de abranger todos os objetos agrupados, mesmo que as dimensões destes variem com o tempo.
                        O exemplo II.2 ilustra o uso deste nodo.

         Exemplo IV - Group Node - Formação de uma seta bidirecional, usando-se dois cones e um cilindro

#VRML V2.0 utf8

Group {
  children [

    DEF Red_Cone  Shape {
         geometry Cone {  bottomRadius 1.5
                          height 2
                          side TRUE
                          bottom TRUE
                 }
        appearance Appearance {
                    material Material {
                          diffuseColor 1 0 0
                             }
                   }
      }

Transform {
           translation 0 -1.5 0
   children [

      Shape {
          appearance Appearance {
            material Material {
                 diffuseColor 1 0 0
                 shininess    .5
            }
          }
          geometry Cylinder {
            radius 1
            height 2
            side   TRUE
            top    TRUE
            bottom TRUE
          }
         }
         ]
       }

       Transform {
           rotation 1 0 0 3.14
           translation 0 -3.5 0
   children [

             USE Red_Cone

         ]
       }
    ]
}

                        Maiores informações são encontradas em Group no Tutorial.
 

V - Transformações

                V.1 - Transform Node

           O nodo Transform é de fundamental importância, pois é ele que define as transformações a serem aplicadas sobre os objetos da cena: translação, rotação em torno de um ponto e escala (diminuir ou aumentar) nas três direções. Através deste nodo, pode-se mover objetos para qualquer lugar na cena.                    Transform {
  eventIn      MFNode      addChildren
  eventIn      MFNode      removeChildren
  exposedField SFVec3f center           0 0 0
  exposedField MFNode  children         []
  exposedField SFRotation rotation         0 0 1 0
  exposedField SFVec3f scale            1 1 1
  exposedField SFRotation scaleOrientation 0 0 1 0
  exposedField SFVec3f translation      0 0 0
  field        SFVec3f     bboxCenter       0 0 0
  field        SFVec3f     bboxSize         -1 -1 -1
}  
      Campo                                           Descrição
bboxCenter centro da "caixa virtual" que envolve os nodos no campo children do nodo Transform
bboxSize dimensões em x, y e z da "caixa virtual" que envolve os nodos children de Transform. Por default, essa "caixa" é inexistente
translation especifica um vetor de translação
rotation especifica uma rotação, definindo um eixo e um ângulo em radianos 
scale especifica um escala, a qual, não necessariamente, precisa ser uniforme
scaleOrientation especifica um orientação rotacional para a operação de escala
center define a origem para as operações de escala e rotação
children nodos que são afetados pelas transformações definidas em Transform
 
    Evento                                     Descrição
eventIn                                                   MFNode
addChildren adiciona um nodo ao campo children de Transform. Caso ele já exista, o acréscimo é ignorado.
removeChildren remove um nodo do campo children de Transform. Caso ele não exista, a operação de remoção é ignorada.
 
 

            O exemplo seguinte ilustra os três casos: no centro da cena, está o cone original. São aplicadas as três operações combinadas, da mais interna para a mais externa, ou seja, o cone é transladado para a posição (2 2 0), rotacionado 3 radianos em torno do eixo z e, finalmente, suas dimensões são alteradas nas três direções não uniformemente, resultando no cone visto mais acima na cena.

Exemplo V.1: Nodo Transform - Translação, Escala e Rotação

#VRML V2.0 utf8

 # Aparece o cone original:

DEF Cone_Vermelho Shape {
                 geometry Cone {}                 # Cone
                 appearance  Appearance {
                         material Material {
                              diffuseColor 1 0 0  # Vermelho
                                   }
                             }
                    }
 # As três operações são aplicadas sobre o cone original, resultando no segundo. A sequência de execução será translação, rotação e escala (operação definida no nodo mais interno para o mais externo):

Transform {
      scale       0.7 1.5 0.6
        children USE Cone_Vermelho
 

  children Transform {
      rotation    0 0 1 3

        children USE Cone_Vermelho
 

     children Transform {
      translation 2 2 0
        children USE Cone_Vermelho
     }
  }
}

                        Maiores informações em Transform Node no Tutorial.
 

V.1.1 - Translação

                        Deslocamento dos objetos nas direções x, y e z. Não existe a necessidade de se preocupar com unidades de medida, desde que se mantenha consistência em toda a cena, sugerindo-se, então, utilizar a unidade padrão de medida (basta não especificar nenhuma unidade).
                        Vide exemplo V.1 .
 

V.1.2 - Rotação

                        Rotaciona-se o objeto especificado no campo children em torno de um eixo determinado e de um ângulo também determinado. O campo associado à rotação ( vide exemplo III.1.2) consiste de quatro números: os três primeiros referem-se à localização espacial de um eixo de rotação e o quarto número, é o ângulo de rotação em torno do tal eixo.
                        Vide exemplo V.1 .
                         Embora não seja obrigatório, sugere-se que se forneça um vetor unitário nos três primeiros números, muito embora a definição:

         rotation 0 0 30# Sugere-se: rotation 0 0 1 3

não seja errada.
                        No exemplo V.1, faz-se uma rotação de 3 radianos (no sentido anti-horário definido pelo valor positivo do ângulo) em torno do eixo z.
                        Quando se deseja rotacionar em torno de mais de um eixo, deve-se utilizar uma combinação de transformações ( como feita no exemplo) ou verificar em torno de que ponto ter-se-ia o mesmo resultado.

V.1.3 - Escala

                        As dimensões do objeto definido em children são diminuídas ou aumentadas. O campo scale apresenta três números: o tamanho da escala em cada uma das direções x, y e z.
                        Uma escala unitária, em qualquer direção, implica na não alteração de tamanho naquela direção e, portanto, uma escala igual a (1 1 1) não implicaria em nenhuma modificação nas dimensões do objeto. Um valor 0 (zero) em qualquer direção não é aconselhável, fazendo com que o browser envie um aviso solicitando que todos os valores do campo scale sejam maiores que 0.0 .
                        Vide exemplo V.1 .

V.2 - Combinação de Transformações
 

                        A ordem em que é realizada uma série de transformações é importantíssima, pois, por exemplo, uma rotação seguida de uma translação, não geraria o mesmo resultado se as operações fossem feitas na ordem inversa (translação seguida de rotação). Além disso, uma transformação definida num "nodo pai" (um parent node) também é aplicada aos "nodos filhos" (este tema é discutido na literatura como "nested transformations").
                        Chama-se a atenção para o fato de que, quando especificadas no mesmo nível dentro de um Transform Node ( vide exemplo V.2), a ordem em que as operações é feita será sempre escala, rotação e translação, independentemente da ordem em que os campos associados a cada uma delas foram escritos no código do programa. Caso se queira que as transformações sejam feitas numa ordem distinta, deve-se realizar o que chamam de "multiple nested transformations" que como citado anteriormente e ilustrado no exemplo V.1, corresponde a uma série de nodos Transform definidos um dentro do outro. A ordem de execução é sempre do nodo Transform mais interno para o mais externo, ou em outras palavras, primeiramente é executada a operação definida no nodo filho mais interno, depois a definida no pai deste e assim sucessivamente, retrocedendo na "árvore genealógica".
 

 Exemplo V.2: Combinação de Transformações

#VRML V2.0 utf8

 # Aparece o cone original:

DEF Cone_Vermelho Shape {
                 geometry Cone {}                 # Cone
                 appearance  Appearance {
                          material Material {
                              diffuseColor 1 0 0  # Vermelho
                                   }
                             }
                    }

 # As operações são definidas no mesmo nível.
 # Apesar da ordem em que aparecem escritas, a ordem de execução será: escala, rotação e translação

Transform {

        rotation    0 0 1 3
        scale       0.7 1.5 0.6
        translation 2 2 0

      children USE Cone_Vermelho
}
 
 

VI - Nodo Viewpoint - Ponto-de-Vista

                        Este nodo especifica uma posição ( position) e orientação (orientation) segundo as quais o observador vê a cena: equivale a definir um ângulo de visão segundo o qual o usuário enxerga a cena.

                   Viewpoint {
  eventIn      SFBool     set_bind
  exposedField SFFloat fieldOfView    0.785398
  exposedField SFBool  jump           TRUE
  exposedField SFRotation orientation    0 0 1 0
  exposedField SFVec3f position       0 0 10
  field        SFString   description    ""
  eventOut     SFTime     bindTime
  eventOut     SFBool     isBound
}

                        Pode-se definir um "campo de visão" (field-of-view) para se especificar o quanto ou que porção da cena será visível. O valor default de position para Viewpoint é (0 0 10) que é adequado para pequenos objetos localizados na origem.

NOTA: O campo field-of-view é especificado em radianos, sendo que 1 radiano equivale a 57 graus aproximadamente e 2pi radianos a 360 graus. Portanto, seu valor default em graus equivale a:      0.785398 rad = 45 graus aproximadamente.
 

                        Os valores de posição e orientação são alterados por transformações locais e também por aquelas definidas nos nodos ancestrais ( parent nodes).
                        O campo description permite atribuir um nome à cena de acordo com o ponto-de-vista em que ela é visualizada. Sendo assim, pode-se definir previamente um conjunto de "pontos-de-vista de câmera", auxiliando o observador a enxergar a cena sob vários ângulos, dispensando a necessidade de "navegar manualmente" por ela. Maiores detalhes de como isso pode ser feito estão na referência [2].

                        Informações adicionais em Viewpoint Node no Tutorial.
 

VII - Luz

            VII.1 - Introdução

                        Existem três tipos de nodos luz, ou light source nodes, em VRML:
DirectionalLight, PointLight e SpotLight que serão vistos mais adiante.
                        A luz, em VRML, não é exatamente como no mundo real, onde há sempre um objeto emissor de luz que também pode ser visto. Em VRML, não necessariamente, é explicitada a fonte luminosa, ou seja, o nodo luz apenas descreve como parte do mundo virtual é iluminada, não sendo obrigatoriamente uma fonte visível. Caso se queira por na cena um objeto como fonte de luz, deve-se criar uma geometria com tal formato (um bulbo de lâmpada por exemplo) e posicioná-lo no local adequado, em geral, na mesma posição do nodo luz. Pode-se ainda, associar um campo emissiveColor à geometria (como parte do nodo Appearance a ela associado) a fim de criar a impressão de que o objeto-fonte está brilhando.
                        Os campos intensity, color, ambientIntensity e on são comuns aos três tipos de nodo luz.
 
 

     Campo                                        Descrição
intensity especifica o quão brilhante é o facho de luz direcionado aos objetos
color especifica a coloração das luzes (valor em RGB) emitidas diretamente e também difusamente pelo ambiente 
ambientIntensity define a intensidade de luz que ilumina os objetos devido a reflexões difusas por todo o ambiente. Seu valor varia de 0.0 (nenhuma luz emitida) a 1.0 (máxima intensidade luminosa) 
on indica se a fonte de luz está ligada ou não. Quando desligada (on = FALSE), este nodo não contribui para a iluminação da cena. Seu valor pode ser alterado através do envio de um evento.
VII.1.1 - DirectionalLight Node

DirectionalLight {
  exposedField SFFloat ambientIntensity  0
  exposedField SFColor color             1 1 1
  exposedField SFVec3f direction         0 0 -1
  exposedField SFFloat intensity         1
  exposedField SFBool  on                TRUE
}

                        Este nodo define uma fonte de luz que ilumina a cena com raios paralelos, segundo uma certa direção. Os campos intensity, color, ambientIntensity e on são comuns aos três tipos de nodo luz e estão descritos no item VII.1 anterior.
                        O campo direction estabelece a direção dos raios luminosos que emanam da fonte de luz, dentro do sistema local de coordenadas. De modo geral, o nodo DirectionalLight somente ilumina os nodos que estão presentes no campo children do nodo que é "seu pai" ( parent node). Porém, há browsers que, em certos sistemas, acabam por iluminar todos os objetos da cena.

VII.1.2 - PointLight Node

PointLight {
  exposedField SFFloat ambientIntensity  0
  exposedField SFVec3f attenuation       1 0 0
  exposedField SFColor color             1 1 1
  exposedField SFFloat intensity         1
  exposedField SFVec3f location          0 0 0
  exposedField SFBool  on                TRUE
  exposedField SFFloat radius            100
}

                        Este nodo define uma fonte pontual luminosa que emite luz para todas as direções igualmente (tal qual uma lâmpada). O nodo PointLight é especificado dentro do sistema local de coordenadas e é afetado pelas transformações definidas em "seus nodos ancestrais" (ancestors transformations). Além dos quatro campos (intensity, color, ambientIntensity e on) comuns a todos os "nodos luz" têm-se:
 
 

  Campo                                              Descrição
location posição da fonte luminosa no sistema local de coordenadas
radius indica a distância máxima que um objeto pode estar da fonte, mas ainda ser iluminado por ela
attenuation efeito realístico que pode ser atribuído à iluminação da cena, indicando que, à medida em que os objetos se afastam da fonte, a luz que os ilumina fica enfraquecida. Três números compõem esse campo: o primeiro para atenuação constante, o segundo linear com a distância e o terceiro quadrática (com o quadrado da distância).
 
 

OBS.: A adição de uma fonte luminosa, em geral, leva a uma queda na performance do browser. Há browsers, no entanto, que não suportam mais que dois nodos PointLight numa mesma cena.
 

VII.1.3 - SpotLight

               SpotLight {
  exposedField SFFloat ambientIntensity  0
  exposedField SFVec3f attenuation       1 0 0
  exposedField SFFloat beamWidth         1.570796
  exposedField SFColor color             1 1 1
  exposedField SFFloat cutOffAngle       0.785398
  exposedField SFVec3f direction         0 0 -1
  exposedField SFFloat intensity         1
  exposedField SFVec3f location          0 0 0
  exposedField SFBool  on                TRUE
  exposedField SFFloat radius            100
}
 
 
 

  Campos                                    Descrição
location posição da fonte luminosa no sistema local de coordenadas
direction eixos do cone de luz
beamWidth ângulo em radianos subentendido pelo cone principal de luz. No seu interior, os objetos são iluminados igualmente e com máxima intensidade e, fora dele, a intensidade luminosa vai decrescendo gradativamente
cutOffAngle ângulo além do qual nada é iluminado na cena
radius assumindo que o objeto está sendo abrangido pelo cone de luz, indica a distância máxima que um objeto pode estar da fonte para ainda ser iluminado por ela
attenuation efeito realístico que pode ser atribuído à iluminação da cena, indicando que, à medida em que os objetos se afastam da fonte, a luz que os ilumina fica enfraquecida. Três números compõem esse campo: o primeiro para atenuação constante, o segundo linear com a distância e o terceiro quadrática (com o quadrado da distância).
                        Neste caso, é especificada uma fonte luminosa pontual que ilumina o ambiente segundo um cone, tal qual indica a Fig. VI.1.- 1: a intensidade de luz diminui exponencialmente à medida em que os objetos se distanciam da região mais clara do cone.
 
 

Fig.VII.1-1: SpotLight


 











                                                             Fig.VII.1-1: SpotLight
 
 

VIII - Nodo Cor

                   Color {
  exposedField MFColor color  []
}
 
 

Campo                                   Descrição
color valor RGB (do Inglês: Red, Green, Blue) a ser aplicado a cada face ou vértice de um objeto.
                        Este nodo é usado para especificar um conjunto de cores a ser definido no campo color de outros nodos (os links se referem à Aula 1): IndexedFaceSet, IndexedLineSet, PointSet e ElevationGrid Node.
                        O nodo Color é usado para especificar múltiplas cores para uma mesma geometria, como por exemplo, para um IndexedFaceSet, seja "por face" ou "por vértice" (vide exemplos II.1.8A, II.1.8B, II.1.8C e II.1.8D). O nodo Material, por sua vez, destina-se à especificação das características luminosas do material que compõe a superfície dos objetos. Caso tanto um nodo Color como um Material sejam especificados para uma geometria, as cores substituem as "características diffuse" do objeto. O nodo Texture, no entanto, tem precedência sobre o nodo Color, de modo que, se ambos forem especificados para uma mesma geometria, o nodo Color é ignorado.

                        Maiores informações em Color Node no Tutorial.
 

IX - Textura

                    IX.1 - Conceito

                        Uma textura, ou texture map, é uma imagem bidimensional que é mapeada sobre uma superfície, cobrindo-a parcial ou totalmente. Os nodos Texture especificam não só a imagem em si, que servirá de textura para um objeto qualquer, mas também como ela encobrirá a superfície do objeto.
                        Os nodos texture são três: ImageTexture, MovieTexture e PixelTexture e cada um deles está descrito com maiores detalhes no Tutorial.
                        Ressalte-se ainda que o nodo Texture tem precedência sobre o nodo Color, de modo que, se ambos forem especificados para uma mesma geometria, o nodo Color é ignorado.
 

IX.2 - TextureCoordinate Node
 

TextureCoordinate {
  exposedField MFVec2f point  []
}
 
 
 

    Campo                                 Descrição 
point coordenadas da textura na forma de pares (s t) a serem mapeados para os vértices de IndexedFaceSet ou ElevationGrid 
                         Ao se mapear uma imagem bi-dimensional sobre um objeto 3D, nem sempre o resultado obtido é o esperado, perdendo-se em verossimilhança, sobretudo se o objeto ou superfície for muito irregular como o são geralmente aqueles definidos através dos nodos ElevationGrid e IndexedFaceSet. Nesses casos, prefere-se utilizar o nodo TextureCoordinate que exatamente confere um aspecto mais realístico às superfícies, uma vez que o mapeamento é feito através da definição dos vértices da figura.
                        Os parâmetros da textura variam de 0 a 1 através da imagem que a representa, como indica a Fig. IX.2-1 abaixo (extraída da referência[2]). As coordenadas horizontais (s) são especificadas primeiro, seguidas das verticais (t).
 


                                                    Fig. IX.2-1: Texture Coordinates
 

OBS.: O nodo TextureCoordinate aparece no campo texCoord dos nodos ElevationGrid e IndexedFaceSet.

                           Maiores informações, consulte TextureCoordinate no Tutorial.
 
 

IX.3 - TextureTransform Node
 

            Este nodo define uma transformação bidimensional que é aplicada às "coordenadas da textura". Ele somente aparece definido no campo textureTransform do nodo Appearance e afeta o modo segundo o qual a textura é mapeada sobre a superfície da geometria a ele associada. Traduz-se como uma maneira de tornar o mapeamento mais realístico, acompanhando as irregularidades (como ondulações) da superfície em questão.
            A ordem em que as operações são executadas é: escala, rotação e translação.

         TextureTransform {
  exposedField SFVec2f center      0 0
  exposedField SFFloat rotation    0
  exposedField SFVec2f scale       1 1
  exposedField SFVec2f translation 0 0
}
 
 
 

   Campos                                                    Descrição 
translation especifica uma translação a ser aplicada sobre a textura
center especifica um ponto que servirá de referência central para as operações de escala e rotação
scale especifica a escala, em relação ao center do objeto; pode ser não uniforme, isto é, dimensões diferentes para cada uma das direções x, y e z
rotation especifica a rotação a ser aplicada, em relação ao center do objeto, como definido em center
                         Maiores informações, consulte TextureTransform no Tutorial.

X - Exercícios
 
 

1. Desenhe algumas primitivas, conforme a Aula 1, e aplique transformações de rotação (45 e 60 graus), escalamento (duplicar e reduzir pela metade) e deslocamento em cada um dos eixos. Modifique a aparência (use o nodo Appearance) em cada um dos casos.

2. Crie um exercício para mostrar que a ordem entre as transformações modifica o resultado final.

3. Repita o exercício 1 incluindo agora fontes de luz dos 3 tipos apresentados. Trabalhe com os diferentes parâmetros.

4. Obtenha uma imagem como a apresentada aqui. Descreva-a (programa VRML comentado).
Obs.: Clicando sobre a figura animada com o botão direito do mouse, você poderá recomeçar a animação ("Reload") ou interrompê-la ("Stop").

Dica: Use o nodo IndexedFaceSet para gerar a figura e, então, o TextureCoordinate para mapear a textura nos vértices da figura.