Formas arbitrárias


Autor/fonte: Márcio Serrolli Pinho e Cláudio Kirner



Digg del.icio.us

Até agora o nosso mundo está limitado à utilização das primitivas gráficas. Caso seja do nosso interesse descrever objetos mais complicados, teríamos que fazê-lo concatenando cubos, esferas, cones e cilindros. Para sanar esta limitação veremos nesta seção técnicas que nos darão maior liberdade criativa.

Pontos, segmentos e faces

É possível especificar pontos isolados em VRML os que, convenientemente unidos, poderão formar segmentos ou faces. Dado que a sintaxe dos respectivos nós é bastante intuitiva, proceder-se-á a apresentação de exemplos ao invés de discutir a sua estrutura.

pontos1.wrl:

#VRML V2.0 utf8
Shape { appearance Appearance
{ material Material {emissiveColor 1 1 1 } }
geometry PointSet { coord Coordinate {
point [
-1 1 1, 1 1 1, 1 1 -1, -1 1 -1,
-1 -1 1, 1 -1 1, 1 -1 -1, -1 -1 -1
]
}
}
}

Mas é muito difícil enxergar alguma coisa, dado que os pontos são adimensionais. Eles são, contudo, os elementos básicos para a definiçào de segmentos, tal como se mostra no seguinte exemplo.

pontos2.wrl:

#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material {emissiveColor 1 1 1}
}
geometry IndexedLineSet {
coord Coordinate {
point [
-1 1 1, 1 1 1, 1 1 -1, -1 1 -1,
-1 -1 1, 1 -1 1, 1 -1 -1, -1 -1 -1
]
}
coordIndex [
0, 1, 2, 3, 0, -1,
4, 5, 6, 7, 4, -1,
0, 4, -1,
1, 5, -1,
2, 6, -1,
3, 7
]
}
}

É fácil perceber que o que mudou do exemplo anterior para este é o nome do nó (IndexedLineSet) e a especificação da seqüência de pontos que devem ser unidos (coordIndex).

Com a mesma filosofia podem ser contruídas faces, tal como ilustrado a seguir.

pontos3.wrl:

#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material {emissiveColor 1 1 1}
}
geometry IndexedLineSet {
coord Coordinate {
point [
-1 1 1, 1 1 1, 1 1 -1, -1 1 -1,
-1 -1 1, 1 -1 1, 1 -1 -1, -1 -1 -1
]
}
coordIndex [
0, 1, 2, 3, -1,
7, 6, 5, 4, -1,
0, 4, 5, 1, -1,
1, 5, 6, 2, -1,
2, 6, 7, 3, -1,
3, 7, 4, 0
]
}
}

Desta maneira podem ser construídas figuras côncavas mas, para tanto, deve ser acrescentada a opção convex FALSE dentro do nó geometry.

Topografia

A maneira usual de descrever cenários topográficos em VRML é através do uso do nó ElevationGrid. Esse nó permite especificar a altura (coordenada y) de cada ponto no plano (x,z), desde que estes pontos estejam regularmente espaçados.

A sintaxe deste nó de geometria requer a especificação do número de pontos amostrados na coordenada x (xDimension), o número de pontos amostrados na coordenada z (zDimension), o espaçamento entre pontos no eixo x (xSpacing), o espaçamento entre pontos no eixo z (zSpacing) e as alturas observadas em cada um destes pontos (height). O número total de alturas deve ser o resultado do produto entre o número de pontos em cada eixo.

Na hora de construir o modelo o primeiro ponto da lista de alturas é colocado na origem do sistema de coordenadas, o segundo ponto é colocado à direita ao longo do eixo x e à distância especificada para esse eixo, e assim por diante até completar a primeira linha. O primeiro ponto da segunda linha é colocado frente à primeira linha (mais próximo ao/à observador/a) à distância especificada para o espaçamento no eixo z.

O modelo padrão supõe que a topografia assim definida é sólida, i.e., que não poderá ser vista dese abaixo. Para que a visão inferior seja construída é necessário especificar que o modelo não é sólido; isto é feito usando a variável lógica solid.

A suavidade com que as faces são construídas pode ser controlada com o parâmetro creaseAngle (ângulo de dobra ou prega). Esse ângulo, especificadom em radianos, é um limiar:

. Faces adjacentes que formam um ângulo menor que o limiar de dobra são desenhadas suavemente de forma a ocultar a transição entre elas;
. Faces adjacentes que formam um ângulo maior que o limiar de dobra são desenhadas sem nenhum suavizado, deixando a transição entre elas evidente como se fosse uma prega ou dobra.

Quando não especificado o creaseAngle vale zero, fazendo com que não seja feita nenhuma tentativa de suavizado da superfície.

Disponibiliza-se a seguir um exemplo fornecido no livro de Ames et al., para que o/a leitor/a modifique as especificações de solid, de creaseAngle, de espaçamento nos dois eixos e verifique o resultado visual destas alterações.

montes.wrl:

#VRML V2.0 utf8
# The VRML 2.0 Sourcebook
# Copyright [1997] By
# Andrea L. Ames et al.
Shape {
appearance Appearance {
material Material { }
}
geometry ElevationGrid {
xDimension 9
zDimension 9
xSpacing 1.0
zSpacing 1.0
solid FALSE
creaseAngle 0.785
height [
0.0, 0.0, 0.5, 1.0, 0.5, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 2.5, 0.5, 0.0, 0.0, 0.0,
0.0, 0.0, 0.5, 0.5, 3.0, 1.0, 0.5, 0.0, 1.0,
0.0, 0.0, 0.5, 2.0, 4.5, 2.5, 1.0, 1.5, 0.5,
1.0, 2.5, 3.0, 4.5, 5.5, 3.5, 3.0, 1.0, 0.0,
0.5, 2.0, 2.0, 2.5, 3.5, 4.0, 2.0, 0.5, 0.0,
0.0, 0.0, 0.5, 1.5, 1.0, 2.0, 3.0, 1.5, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 1.5, 0.5,
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0,
]
}
}

O/a leitor/a pode pegar um conjunto de dados bastante interessante, disponível no arquivo tenda.dat. Nesse arquivo foi gerada uma matriz de 50x50 pontos em função de uma equação que envolve uma função exponencial cujo argumento é a soma de duas funções trigonométricas. A tarefa consiste em visualizar esses dados modificando os parâmetros do nó ElevationGrid.

Extrusão

Este substantivo, sinônimo de explosão, é empregado em engenharia para denominar o processo de formar sólidos fazendo passar materiais pastosos através de orifícios, para depois esperar que o material se solidifique... mais ou menos o que acontece quando se decora um bolo.

Para formar uma extrusão em VRML (técnica que nos dará ainda mais liberdade para criar objetos) precisamos descrever a seção do objeto e a trajetória que essa seção percorrerá. Adicionalmente podem ser fornecidas, a escala a aplicar a esta seção em cada ponto da trajetória e a orientação da mesma em cada instante.

Novamente, ilustraremos o uso deste novo nó através de exemplos.

pontos4.wrl:

#VRML V2.0 utf8

Shape {
appearance Appearance {
material Material {emissiveColor .1 1 .3}
}

geometry Extrusion {
crossSection [
1 1,
1 -1,
-1 -1,
1 1
]
spine [0 0 0, 1 1 1]
scale [1 1, 1 1]
orientation [0 0 0 0, 0 0 0 0]
}
}

Aqui vale a mesma observação já feita para construir objetos côncavos.




Enviado por xKuRt em 26/09/2006 às 14:11


Avaliação

Esta publicação ainda não foi avaliada!


Avaliar:


A avaliação de publicações é restrita a membros cadastrados e logados no nosso site.



Comentários

Este artigo ainda não foi comentado ou o(s) comentário(s) que foi(ram) enviado(s) a ele ainda não foi(ram) publicado(s).


Envio de comentário:




  

Quarta, 20 de Agosto de 2014




Top 5 membros

Últimos membros online

Últimos membros cadastrados



Capa do livro
Organização e Projeto de Computadores


Capa do livro
Crie um Sistema Web com PHP 5 e AJAX - Controle de Estoque


Capa do livro
Computação Gráfica: Processamento de Imagens Digitais - Volume 2





Hostnet

IMD