m e n u
início > realidade virtual > vrml > transformações
realidade virtual
    conceitos básicos
    dispositivos
    vrml
         introdução
         primitivas              
        transformações
         imagens
         formas arbitrárias
         animação
                
multimídia
    
referências
             
turma atual
    
projetos

pesquisa

    

Transformações

Neste capítulo veremos como deslocar as nossas primitivas gráficas (já coloridas ou forradas com texturas) pelo espaço virtual. Além de posicioná-las, aprenderemos a aplicar rotações e modificações de escala nelas.

Antes disso, veremos como agrupar os nossos objetos. A técnica de agrupamento serve para tratar primitivas (ou grupos de primitivas) como se fossem um único objeto e, desta maneira, poupar a aplicação de transformações.

Para facilitar ainda mais a construção do nosso mundo virtual, veremos neste capítulo como definir objetos e, a partir desta definição, como reaproveitá-los para poupar-nos a digitação repetitiva de código já existente.

Agrupamento

Objetos quaisquer em mundos virtuais podem ser agrupados. Exemplos de objetos agrupáveis são as primitivas já conhecidas (caixa, esfera, cilindro, cone e texto), grupos e outros objetos que aparecerão num futuro próximo. O nó que permite realizar o agrupamento chama-se GROUP, e um nó deste tipo pode conter outros nós do tipo GROUP. Os elementos que formam um GROUP chamam-se CHILDREN.

Um exemplo do uso da sintaxe do agrupamento é dado a seguir, sem ilustração pois não apresenta nenhuma novidade na hora de ser visualizado. A diferença entre agrupar e não fazê-lo reside na possibilidade de tratar os objetos agrupados como formando uma única entidade, fato que ficará ainda mais explícito com o uso do comando DEF.

grupo.wrl
grupo.wrl #VRML V2.0 utf8
 Group{ children[
 Shape{
    geometry Box{size 10 .1 10}
    }
       Shape{ geometry Text {string "Realidade Virtual"
            } 
       }
    ]
} 

 

Definição e reaproveitamento

Imaginemos a situação de havermos construído um objeto, e de querermos repeti-lo em outro lugar do mundo. Já foi feito isto na listagem dos eixos mostrada a seguir, e com bastante sucesso. As sintaxes para definir um objeto e reaproveitá-lo são muito simples:

DEF nome objeto

onde o nome do objeto é escolhido livremente desde que não seja um comando VRML, e o objeto é qualquer componente VRML válida. Para referenciar o objeto assim batizado, basta dar o comando:

USE nome

 

Transformações Geométricas

Tal como já foi mencionado, para completarmos as nossas possibilidades criativas básicas em VRML precisamos deslocar, modificar a escala e rotacionar os objetos previamente definidos. De posse deste conhecimento poderemos construir o mundo idealizado.

A linguagem VRML permite realizar as chamadas transformações geométricas, que dão uma enorme flexibilidade e aumentam notadamente o poder criativo do construtor. Essas transformações, além de serem muito expressivas, possuem propriedades matemáticas muito interessantes, que o leitor pode consultar na página de Computação Gráfica.

Para trabalharmos a vontade, utilizaremos um guia (em VRML, é claro) para visualizar o sistema de coordenadas vigente. Esse guia deverá ficar armazenado localmente onde o leitor ou leitora estiver trabalhando, para poder utilizá-lo. Alguns comandos poderão parecer obscuros, mas serão vistos ainda neste capítulo.

eixos.wrl
#VRML V2.0 utf8
# Sistema de coordenadas cartesianas
DEF eixo Group { 
children [
   Shape{geometry Cylinder{height 50}}
      Transform {
         translation 0 25 0
         children [
            Shape {geometry Cone{bottomRadius 2}}]
      }
]}
Transform {
   rotation 1 0 0 1.57
   children USE eixo
}
Transform {
   rotation 0 0 1 -1.57
   children USE eixo
}   

Para incluir qualquer arquivo VRML dentro de um outro arquivo, basta utilizar o comando inline, seguido da URL do arquivo.

No resto do capítulo utilizaremos intensamente cones para ilustrar o efeito das transformações geométricas e, para facilitar a tarefa, sugerimos seja criado um mundo com os eixos coordenados e com dois cones de cores semitransparentes distintas. Um deles sofrerá e ilustrará as transformações.

Translações

As translações são especificadas para um conjunto de objetos através das três coordenadas que as definem. O conjunto de objetos a sofrerem a translação são agrupados pelo comando delimitador children[ ], que também aparece no nó Group.

transl1.wrl
#VRML V2.0 utf8
# Translações
Inline {url "eixos.wrl"}
Shape{
    appearance Appearance {
        material Material {
          diffuseColor .7 .7 1
          transparency .8
        }
    }
    geometry Cone{bottomRadius 10 height 10}
}

Transform {
translation 5 10 -8
children [
Shape{
    appearance Appearance {
        material Material {
          diffuseColor 1 .7 .7
          transparency .8
        }
    }
    geometry Cone{bottomRadius 10 height 10}
}]}

Antes de dar prosseguimento o leitor ou leitora deverá familiarizar-se com a transformação de translação aplicando-a a outros objetos e com outros parámetros. Sugere-se a construção de uma barraca de coco (um cone apoiado num cilindro) e de um arco formado por dois cilindros que sustentam uma caixa.

 

Aplicação dos conhecimentos

Vamos construir um corredor de arcos aplicando os conhecimentos de translações, agrupamento e reaproveitamento de objetos. O exemplo mostrado aqui é inspirado no conteúdo do livro de Ames et al.

O primeiro passo consiste em criar o arco, que poderá ser o resultado de dois cilindros (as colunas) e a laje, que é uma caixa de tamanho conveniente na posição adequada.

arco.wrl
#VRML V2.0 utf8
# coluna esquerda
  Transform {
    translation -2.0 3.0 0.0
      children DEF coluna Shape {
        geometry Cylinder {radius 0.3
                           height 6.0}
      }
  }

# coluna direita
  Transform {
    translation 2.0 3.0 0.0
      children USE coluna
  }

# laje
  Transform {
    translation 0.0 6.05 0.0
      children Shape {
        geometry Box {size 4.6 0.4 0.6}
      }
  }

A passagem de colunas será construída repetindo-as nas posições desejadas.

passagem.wrl

#VRML V2.0 utf8
DEF arco Group {
children [
# coluna esquerda
  Transform {
    translation -2.0 3.0 0.0
      children DEF coluna Shape {
        geometry Cylinder {radius 0.3
                           height 6.0}
      }
  }
# coluna direita
  Transform {
    translation 2.0 3.0 0.0
      children USE coluna
  }
# laje
  Transform {
    translation 0.0 6.05 0.0
      children Shape {
        geometry Box {size 4.6 0.4 0.6}
      }
  }
]
} # fim do grupo
Transform {
  translation 0 0 3
   children USE arco
}

Fica por conta do/a leitor/a a construção de um corredor com mais colunas.

Escalonamentos

As transformações de escala alteram as relações entre as coordenadas originais dos objetos. Devem ser especificados os três fatores correspondentes a cada um dos eixos coordenados. A sintaxe desta transformação é completamente análoga à das translações.

escala1.wrl

#VRML V2.0 utf8
# Escalas
Inline {url "eixos.wrl"}
Shape{
    appearance Appearance {
        material Material {
          diffuseColor .7 .7 1
          transparency .8
        }
    }
    geometry Cone{bottomRadius 10 height 10}
}
Transform {
scale 2 -1 .5
children [
Shape{
    appearance Appearance {
        material Material {
          diffuseColor 1 .7 .7
          transparency .8
        }
    }
    geometry Cone{bottomRadius 10 height 10}
}]}

Veja que o fator de escala pode ser qualquer número real, incluindo valores negativos. Deixa-se por conta do leitor ou leitora a exploração do poder desta transformação; em particular sugere-se verificar o que acontece quando o valor absoluto dos fatores de escala é "1", mas os sinais mudam. Também é importante verificar o efeito de zerar um ou mais dos fatores de escala da transformação.

Rotações

Para especificar a rotação de um ou mais objetos deve-se forncer não apenas o ângulo, mas também o eixo ao redor do qual a rotação é realizada.

Para especificar o eixo precisamos de dois pontos. Em VRML um dos pontos que definem o eixo de rotação é a origem, o outro deve ser fornecido pela especificação de três coordenadas. Ao redor desta reta assim especificada será realizada a rotação pelos graus dado em radianos (90o equivalem a Pi/2 radianos, isto é, aproximadamente a 1.57).

A sintaxe desta transformação é análoga à das outras duas, bastando especificar rotation seguido de quatro valores: três para o eixo e um para o ângulo em radianos.

As rotações mais comuns são aquelas realizadas ao redor dos eixos do sistema cartesiano, e para facilitar um pouco as coisas são fornecidos a seguir os valores que as especificam.

Definição dos pontos que estabelecem as rotações ao redor dos eixos cartesianos
Ao redor do eixo
Definição do eixo
X
1 0 0
Y
0 1 0
Z
0 0 1

É fundamental que o leitor ou leitora apliquem uma boa variedade de rotações a diferentes objetos.

escala1.wrl

#VRML V2.0 utf8
# Rotações

Inline {url "eixos.wrl"}

Shape{
    appearance Appearance {
        material Material {
          diffuseColor .7 .7 1
          transparency .8
        }
    }
    geometry Cone{bottomRadius 10 height 10}
}

Transform {
rotation 1 0 0 1.57
children [
Shape{
    appearance Appearance {
        material Material {
          diffuseColor 1 .7 .7
          transparency .8
        }
    }
    geometry Cone{bottomRadius 10 height 10}
}]}     

Nesta altura o/a leitor/a já poderá construir uma passagem de arcos em várias direções.