Tradução usando a versão 1.1.1.1 do cvs em inglês.
Tutorial: Os Formatos Geométricos de Arquivo OOGL 
		(e do Geomview conseqüêntemente)

OOGL é a abreviatura de Object Oriented Graphics Library (Biblioteca Gráfica Orientada a Objetos.  Um objeto OOGL é
chamado um Geom. Existe um formato de arquivo texto  para cada tipo de Geom. Você
pode chamar um arquivo texto em qualquer progama que usa o formato OOGL. Geomview é um
visualizador interativo de objetos tridimensionais construído sobre o topo do OOGL. (Geomview executa sobre
as palntaformas Silicon Graphics, NextStep, e X-Windows.) Existem
notas do Geomview entre colchêtes ao longo deste guia dizendo a
você o que fazer no Geomview para ver do que estamos falando. Posteriormente
notas assumem que você tenha ambos know how para fazer e tenha realizado o que as notas anteriores
disseram para você fazer. Todos os arquivos referenciados nesse documento estão no
diretório de exemplos de arquivos OOGL que acompanham o Geomview.

A seção Os formatos de arquivo OOGL do manual do Geomview é uma referência
completa para a sintaxe dos formatos de arquivo. Esse tutorial é uma tentativa
de levar você mais gentilmente ao mundo dos formatos de arquivos OOGL.

----------------------------------------------------------------------
----------------------------------------------------------------------

				QUAD

Iniciamos um um objeto muito simples: um quadrado. Especificamente, o quadrado
unitário no plano xy em z=0.
----------------------------------------------------------------------
"square.quad":

QUAD
-1 -1 0 
1 -1 0
1 1 0
-1 1 0
----------------------------------------------------------------------
O cabeçalho "QUAD" identifica o tipo de arquivo.  (Você pode tambémusar o
cabeçalho "POLY" para este tipo por razZões históricas.)  Um arquivo QUAD é uma
lista de 4*n vertices onde n é o número de quadriláteros. Esse
arquivo contém somente um quadrilátero.  Você também pode usar esse formato
para especificar triângulos: apenas use um quadrilátero degenerado onde dois
dos quatro vértices são identicos.  Os vértices nesse arquivo são
simples: apenas as coordenadas x,y, e z do ponto.

[GEOMVIEW: Digite "geomview square.quad" de uma janela de shell sobre um
Silicon Graphics Iris. Gire o quadrado em torno de si mesmo com o botão esquerdo do mouse
após geomview Tê-lo carregado. Sinta-se livre para brincar com geomview por um tempo se
a imaginação atingir você durante esse tutorial.  ]

O arquivo seguinte tem vértices mais complexos por incluirem uma cor com as coordenadas do ponto. 
----------------------------------------------------------------------
"csquare.quad":

CQUAD
-1 -1 0		1 0 0 1
1 -1 0		0 1 0 1
1 1 0		0 1 0 1
-1 1 0		1 0 0 1
----------------------------------------------------------------------

Esses foram os mesmos pontos do quadrado anterior, mas com dois cantos vermelhos e
dois cantos verdes. O cabeçalho é agora "CQUAD" para indicar que seus
vértices possuem informações de cores além das informações de ponto.
Cores são especificadas pelas quádruplas (r,g,b,a) de números em ponto flutuante
entre 0 e 1. Qualquer cor que pode ser mostrada na tela de um computador
pode ser codificada por alguma combinação de vermelho (r), verde (g) e azul (b). A quarta
componente, alfa, representa a opacidade: 0 é transparente e 1 é
opaco. As plantaformas X-Window, NextStep, e some SGI ignoram a informação 
alfa inteiramente, mas um instantâneo Renderman irá usar a informação
alfa se a transparência estiver habilitada. Algumas plantaformas SGI utilizam a
informação alfa, mas a figura é garantidamente incorreta.


[geomview: Apague o objeto atual pressionando o botão Delete.  Para
chamar csquare.quad, pressione File/Open/segunda linha do navegador de diretórios 
e localize o "csquare.quad" na lista dos arquivos (pressione o botão OK
quando tiver terminado) dentro da caixa que aparece.

Você está provavelmente surpreso porque esse quadrado está todo com uma cor somente.  O modo de tonalidade de cor 
padrão é o tipo plano, onde cada polígono ou face poligonal é da mesma
cor. Os outros dois modos de tonalidade de cor, constante e liso, irão ambos
mostrar faces multicoloridas onde as cores são lisamente interpoladas
entre os vértices. Tonalidade de cor constante ignora todas as informações de iluminação,
enquanto tonalidade de cor lisa interpola iluminação e também coloração entre
os vértices.

Para mudar o modo de sombreamento, primeiro chame o painel de aparência clicando
sobre a linha Aparência no navegador principal de painéis.  Agora alterne de
modo em modo clicando em diferentes linhas no navegador de @emph{Shading}.
]


É hora de ir na direção de coisas maiores e melhores. 

"dodec.quad":

QUAD
0 0 0.794654 0 0.491123 0.794654 0.356822 0.491123 0.794654 0.467086 0.151765 0.794654
0 0 0.794654 -0.467086 0.151765 0.794654 -0.356822 0.491123 0.794654 4.89153e-09 0.491123 0.794654
0 0 0.794654 -0.288675 -0.397327 0.794654 -0.57735 -0.187593 0.794654 -0.467086 0.151766 0.794654
0 0 0.794654 0.288675 -0.397327 0.794654 4.36694e-09 -0.607062 0.794654 -0.288675 -0.397327 0.794654
0 0 0.794654 0.467086 0.151766 0.794654 0.57735 -0.187592 0.794654 0.288675 -0.397327 0.794654
0 0.710761 0.35538 0 0.491123 0.794654 -0.356822 0.491123 0.794654 -0.467086 0.642889 0.491123
	.
	.
	.
 < 55 lines of numbers deleted>


Agora pegamos um objeto mais interessante: um dodecaedro.  Uma vez que
dodecaedro tem faces de 5 lados, cada uma de suas 12 faces é atualmente feita
de 5 quadriláteros de um total de 20 quadriláteros nesse objeto do tipo Quad.

[geomview: 
Apague o quadrado e chame o arquivo "dodec.quad". Uma vez que os 5
quadriláteros que formam cada face todos se ajustam perfeitamente uns aos outros, o fato de que
existe realmente muitos deles em cada face é somente aparente quando as
bordas são desenhadas. Para habilitar o desenho das bordas, aperte o botão "Edges" no
painel de aparência.
]


				OFF

Existe uma maneira muito mais eficiente de representar um dodecaedro.

"dodec.off":

OFF
20 12 30
	1.214124 0.000000 1.589309
	0.375185 1.154701 1.589309
	-0.982247 0.713644 1.589309
	-0.982247 -0.713644 1.589309
	0.375185 -1.154701 1.589309
	1.964494 0.000000 0.375185
	0.607062 1.868345 0.375185
	-1.589309 1.154701 0.375185
	-1.589309 -1.154701 0.375185
	0.607062 -1.868345 0.375185
	1.589309 1.154701 -0.375185
	-0.607062 1.868345 -0.375185
	-1.964494 0.000000 -0.375185
	-0.607062 -1.868345 -0.375185
	1.589309 -1.154701 -0.375185
	0.982247 0.713644 -1.589309
	-0.375185 1.154701 -1.589309
	-1.214124 0.000000 -1.589309
	-0.375185 -1.154701 -1.589309
	0.982247 -0.713644 -1.589309
	5 0 1 2 3 4
	5 0 5 10 6 1
	5 1 6 11 7 2
	5 2 7 12 8 3
	5 3 8 13 9 4
	5 4 9 14 5 0
	5 15 10 5 14 19
	5 16 11 6 10 15
	5 17 12 7 11 16
	5 18 13 8 12 17
	5 19 14 9 13 18
	5 19 18 17 16 15

O cabeçalho "OFF" nos diz que o arquivo dodec.off é um arquivo do tipo "polylist". A segunda linha no
arquivo nos diz que existem 20 vértices, 12 faces, e 30 arestas.
(As bibliotecas OOGL atualmente não utilizam os valores de arestas, de forma que você
pode apenas usar 0 se acontecer de não saber o número de arestas.)  As próximas 20 seguintes
linhas fornecem uma lista de vértices. TAs últimas 12 linhas especificam as faces:
o primeiro numero é o número de vértices naquela face. Uma vez que nosso
poliedro é regular, todas as faces possuem o mesmo número de
vértices (nesse caso, 5).  Os números restantes na linha são
indices dentro da lista de vértices acima.

Juntamente com o fato de loge mais compacto, o formato de arquivo do tipo "Polylist" incorpora
informação de conectividade no Geom (Objeto OOGL).  OOGL não tem formas de conhecer
se quaisquer dois quadriláteros em um bojeto Quad estão conectados.  Mas
com uma "Polylist", OOGL pode interpolar retas normais ao longo das faces conectadas.
As retas normais de um objeto são usadas para calcular a informação de tonalidade de cor.
Interpolated normals make an object look smooth instead of faceted.
Isso é muitas vezes desejável se você estiver tentando aproximar uma superfície
curva por meio da quebra da mesma em peças pequenas.

[geomview: 
Vá adiante e chame "dodec.off" sem deletar o oddec.quad.  Agora
você tem dois Geoms no seu mundo.  A maioria das ações aplicam-se aos
objetos atualmente selecionados. Quando você inicia o geomview, os objetos
atualmente selecionados é o mundo todo. Você pode independentemente controlar qualquer
objeto no mundo selecionando esse objeto como alvo e suas ações.
Duplo clicando o botão direito do mouse quando o mouse está sobre um
objeto faz com que ele seja selecionado: duplo clicando o botão direito do mouse sobre o espaço vazio
seleciona o mundo completo. Você pode também selecionar objetos clicando sobre a
linha apropriada no navegador de objetos.

Os dois dodecaedros estão provavelmente sobrepostos.  Selecione um deles como
seu alvo, clique sobre a linha "Translate" no navegador de movimentos, e
mova o objeto selecionado afastando-se do centro do mundo com o botão esquerdo
do mouse.  (Para retornar ao modo "Rotate", clique na linha apropriada no
navegador de movimento.)
 
Agora selecione o mundo completo novamente e desenhe as normais pressionando o
botão "Normals" no painel de aparência. Alterne entre os modos de sombreamento
"Flat" e "Smooth" (clicando no navegador de tonalidades) e note
que a "Polylist" modifica-se mas o "Quad" não se modifica.  

Algumas vezes usando o mouse para clicar no navegador de linhas e botões é
incômodo. Os caracteres colchêtes mostram nos painéis de controle os
atalhos de teclado que reproduzem o efeito de usar o mouse para
clicar sobre aquela linha ou butão. Por exemplo, "an" (o "a" representa
"appearance") muda o desenho de normais e "t" uda o movimento para
translação.  Como tecla de atalho adicional, você pode usar o prefixo de um
objeto ("g" ou "c" seguido de um número, como mostrado nos parêtesis no
navegador de objetos) antes da maioria dos comandos para simultâneamente selecionar um objeto
e fazer alguma ação para esse objeto. Pr exemplo, "g0r" permite a você imediatamente
rotacionar o mundo.

]


Vamos comparar duas formas de se colorir uma "Polylist".

facecube.off:

# off file with per face cor
OFF
8 6 12
     1.0 1.0 1.0 
     1.0 1.0 -1.0 
     1.0 -1.0 1.0 
     1.0 -1.0 -1.0 
     -1.0 1.0 1.0 
     -1.0 1.0 -1.0 
     -1.0 -1.0 1.0 
     -1.0 -1.0 -1.0 
     4 0 2 3 1  .05 .8 .1 .75
     4 4 5 7 6  .2 .05 .8 .75
     4 0 4 6 2  .9 .9 .02 .75
     4 1 3 7 5  .0 .7 .4 .75
     4 0 1 5 4  .1 .4 .7 .75
     4 2 6 7 3  .7 .7 0 .75

vertcube.off:

# off file with per vertex cores
COFF
8 6 12
     1.0 1.0 1.0 	.05 .8 .1 .75
     1.0 1.0 -1.0	.2 .05 .8 .75 
     1.0 -1.0 1.0	.9 .9 .02 .75 
     1.0 -1.0 -1.0 	.0 .7 .4 .75
     -1.0 1.0 1.0 	.1 .4 .7 .75
     -1.0 1.0 -1.0 	.7 .7 0 .75
     -1.0 -1.0 1.0 	0. 0. 0. .75
     -1.0 -1.0 -1.0 	1. 1. 1. .75	
     4 0 2 3 1  
     4 4 5 7 6  
     4 0 4 6 2  
     4 1 3 7 5  
     4 0 1 5 4  
     4 2 6 7 3  

Tudo seguindo o caractere "#" é um comentário para humanos ler e é
ignorado por OOGL. O cabeçalho para uma "Polylist" plana é opcional, mas
se você tiver qualquer coisa ao lado de pontos em um vértice você precisará fazer um cabeçalho
apropriado.  O objeto é um cubo unitário, qu tem 8 vértices, 6 faces,
e 12 arestas.  O primeiro coloração por face e o segundo tem
coloração pro vértice.

Um ponto sutil: o cabeçalho para vertcube.off é "COFF" como você pode
esperar mas o cabeçalho para facecube.off é apenas "OFF" por que o
cabeçalho refere-se somente àestrutura dos vértices, não ao arquvo
como um todo.

[geomview: 
Apague tudo selecionando o mundo como alvo e clicando o botão
delete. Agora chae "facecube.off" e "vertcube.off". Translacione um
deles para adiante de centro de forma que você possa ver o que você está fazendo.
Alterne ambas as "Polylists" entre os modos de tonalidade "Constant",
"Flat", e "Smooth".

Tonalidade é realizada conforme a fonte de luz que você controla.
Para brincar com luzes, abra o painel "Light" clicando na linha
"Light" no navegador de "Inspect". Quando você pressionar o botão "Show Lights",
você irá ver raios luminosos que você pode arrastar ao redor para mover as luzes.
Você também pode adicionar "add", apagar "delete", modificar a intensidade da, e modificar a
cor das luzes.
]


				MESH

Os vértices de um arquivo de Malha(Mesh) são conectados em uma grade retangular.

tent.mesh:
CMESH
3 3
0 0 0  1 0 0 1	   1 0 1  0 1 0 1	    2 0 0  0 0 1 1
0 1 0  1 0 0 1	   1 1 1  0 1 0 1	    2 1 0  0 0 1 1
0 2 0  1 0 0 1	   1 2 1  0 1 0 1	    2 2 0  0 0 1 1

O cabeçalho "CMESH" nos diz que esse é um arquivo de Malha e cada vértice
contém ambos ponto e informação de cor.  A segunda linha significa que
ambas as dimensões u e v da malha são 3, então existirão 3*3 =
9 vértices. Cada vértice que não está sobre uma aresta externa está conectado a
seus 4 vizinhos por uma aresta. Em "tent.mesh", somente o
ponto (1,1,1) é um ponto interno. Os 9 vértices, quando chamados (u,v),
são especificados na ordem crescente de v, apenas como um array em C:

(0,0)---(1,0)---(2,0)   
  |	  |	  |
(0,1)---(1,1)---(2,1)
  |	  |	  |
(0,2}---(1,2)---(2,2)

[geomview:
Apague tudo e chame "tent.mesh". Entre no modo de tonalidade "Smooth" (Inspect/Appearence/Shading) para
ver cada vértice com sua própia cor de forma que seja óbvio como os pontos no
arquivo correspondem com a imagem no visualizador.
]

Se você desejar a malha seja fechada ao longo das ou (ou ambas) arestas 
u ou v, insira ou um "u" ou um "v" no cabeçalho apenas antes de
"MESH".
	
"wraptent.mesh" 
CuMESH
3 3
0 0 0  1 0 0 1	   1 0 1  0 1 0 1	    2 0 0  0 0 1 1
0 1 0  1 0 0 1	   1 1 1  0 1 0 1	    2 1 0  0 0 1 1
0 2 0  1 0 0 1	   1 2 1  0 1 0 1	    2 2 0  0 0 1 1

[geomview: 
Chame "wraptent.mesh" e compare as duas malhas, transladando-as
separadamente se necessário.
]

Existe uma forma extremamente eficiente de descrever uma malha quando as coordenadas
x e y coincidem com as coordenadas u e v de todo ponto.

"ztent.mesh":
ZMESH
3 3
0 1 0
0 1 0
0 1 0

"ztent.mesh" é exatamente a mesma aparência que "tent.mesh", embora seus
vértices não tenham quaisquer cores. O cabeçalho "ZMESH" significa que somente
as coordenadas do eixo z de cada ponto é especificada e as coordenadas
x e y de cada ponto são escolhidas para serem iguais à sua posição (u,v) na
grade.

[geomview:
Chame "ztent.mesh" para verificar que esse arquivo realmente tem a mesma aparência que "tent.mesh"
]



				VECT

Um vetor é uma coleção de "polylines", que são linhas com um ou mais
vértices. Aqui está um arquivo especificando um "X" e o eixo x em vermelho, um "Y"
e o eixo y em verde, e um "Z" e o eixo z em azul.

"xyz.vect":
VECT
8 19 3
2 2 2 2 2 3 2 4 
1 0 0 1 0 0 1 0

0 0 0  1 0 0
1 -.05 .05   1  .05 .25
1  .05 .05   1 -.05 .25

0 0 0  0 1 0
-.05 1 .25   0  1   .15
 .05 1 .25   0  1   .15   0  1  .05

0 0 0  0 0 1
-.05 .25 1  .05 .25 1   -.05 .05 1   .05  .05  1

1 0 0 1
0 1 0 1
0 .6 1 1

O cabeçalho é sempre "VECT": nenhuma letra pode ser pregada na frente.
A segunda linha significa que existem 8 "polylines", que possuem um total
de 19 vértices e 3 cores. Não existe indexação dentro de uma lista de
vértices como uma "polylist": todo vértice simples deve ser especificado
separadamente. A terceira linha lista o número de vértices em cada
"polyline". Em "xyz.vect", somente "polylines" com mais que 2 vértices
são a parte superior do "Y", que tem 3, e o "Z", que tem 4.
A quarta linha lista o número de cores em cada "polyline".  Quando uma
"polyline" não possui cores essa "polyline"herda a cor previamente escolhida.  A seguir
vem os 19 vértices: somente pontos são permitidos. Finalmente, as 3 cores
são fornecidas nas últimas três linhas.

[geomview: 
Apague tudo, chame e olhe "xyz.vect". Faça a mesma coisa para
todos os exemplos restantes.
]

				BEZ

Para aqueles que já entenderam como criar ajustes em superfície
paramétrica, a sintaxe do ajuste da superfície de Bezier é descrito página de
manual da OOGL. A arte de construir superfícies paramétricas não é facilmente
explicável: dessa forma, superfícies paramétricas estão dentro da abrangência deste tutorial
discutí-las.


"Lists" e "Insts" são Geoms complexos que podem ser usados para criar uma
árvore hierárquica de objetos. 

				LIST

Uma "List" é apenas uma coleção de outros Geoms.

"ref.list":
LIST
< xyz.vect
< dodec.quad
{ = QUAD -1 -1 0   1 -1 0  1 1 0  -1 1 0}


O cabeçalho é sempre exatamente "LIST". Os primeiros dois subgeoms referem-se a
outros arquivos, usando a sintaxe " < nomearquivo ". Omitimos as
chaves opcionais.  O terceiro é um objeto literal,
ou in-line. Embora essa sintaxe em particular possa ainda trabalhar se esquecermos
as chaves e o sinal de igual, sintaxe muito similar não
pode então seguimos a regra "quando tiver dúvida, use as chaves".

[geomview:
Geomview procura por nomes de arquivos no diretório atual, o camino de nomes na
variável de ambiente GEOMDATA, e no mesmo diretório que o arquivo
que está atualmente sendo lido pelo geomview. 
]

				INST

Um "Inst"é uma ou mais transformações 4x4 aplicada a outro Geom.  Essas
matrizes podem representar todas as transformações em 3D tais como rotação,
translação, homotetia, redução e perspectiva.  Usamos matrizes 4x4
em lugar de matrizes 3x3 de forma que podemos usar coordenadas homogêneas e
concatenar todas as transformações sem tratar translações como
casos especiais que requerem adições em lugar de multiplicações.  Matrizes
4x4 podem também serem usadas para operações tais como rotações em 4D
ou transformações projetivas hiperbólicas. Um livro texto de álgebra linear
ou um livro texto de computação gráfica são bons lugares para iniciar seus estudos se você não está familiarizado com
essas idéias.

"ref.inst":
INST
geom { < ref.list }
transforms { = 
TLIST
 1 0 0 0
 0 1 0 0
 0 0 1 0
 2 0 0 1

 1 0 0 0
 0 1 0 0
 0 0 1 0
 0 2 0 1

 1 0 0 0
 0 1 0 0
 0 0 1 0
 0 0 2 1

 1 0 0 0
 0 1 0 0
 0 0 1 0
 0 0 0 1
}

O cabeçalho é sempre exatamente "INST". O valor seguindo a palavra chave
"geom" é uma referência de nome de arquivo "ref.list", que é a "List" que
mostramos acima.  Isso também pode ser um  Geom in-line ou um manipulador. Cercamos
o valor com chaves para evitar ambiguidade.

O valor da palavra chave "transforms" é uma "TList" in-line. Isso também
pode ser uma referência a um nome de arquivo ou um manpulador. (Veja a seção Os Formatos
de Arquivo do OOGL do manual do Geomview para especificidades.) Uma "TList" é atualmente um
Geom completametne fugidio, mas nós não temos mesmo que chamar um arquivo como "foo.tlist" dentro
do visualizador porque "TLists" são apenas uma coleção de transformações sem
subgeom associado, de forma que não há nada para ver.

Uma transformação é exatamente 16 números. Os primeiros três são translações:
2 unidade nas direções x, y e z, respectivamente. O último é apenas
a identidade. O comprimeto da "TList" é o número de instanciações
da unidade: nesse caso, 4.

Se não pudermos usar instanciação, teremos que calcular 4
Geoms inteiramente novos, uma vez que os atuais pontos no espaço de um objeto são
diferentes se você movê-lo. Uma vez que a unidade de um "Inst" pode ser outro
"Inst", você pode construir uma hierarquía complexa. Por exemplo, para construi um
sistema solar você só precisa gerar uma esfera. Tdos os planetes pode ser
instanciações de homotetias e translações da que simples Geom.


"warp.inst":
INST
transform {
		1 0 0 0
		0 9 0 0
		0 0 3 0
		0 0 0 1
}
geom { < dodec.off }

Esse "Inst" tem uma transformação simples em lugar de uma lista deles. Dessa forma
usamos a palavra chave "transform" em lugar da palavra chave "transforms". Um "transform" não
é um Geom, de forma que não existe cabeçalho antes dos 16. Podemos também
ter um manipulador aqui.  (Manipuladores estão documentados na seção Formatos de Arquivo
do OOGL do manual do Geomview.) Finalmente, temos "dodec.off" como nossa
unidade.  A ordem do geom e das "transform/transforms" é
irrelevante.


Postscripts:

OOGL:

Esse tutorial não documenta arquivos binários ou aparências de objetos.
Veja a seção Formatos de Arquivo do OOGL do manual do Geomview para detalhes. 

Espaços em branco em arquivos OOGL ocorrem para facilitar a vida dos leitores humanos.
"ZMESH 3 3 0 1 0 0 1 0 0 1 0" é um arquivo OOGL válido.  A única
excessão é que não pode haver um fim de linha entre o último índice de
vértice para uma face tipo "OFF" e os 4 números em ponto flutuante representativos de cor.

Geomview: 

Quando um Geom é chamado, ele automaticamente normalizado ajustar dentro de um
cubo unitário centrado em torno da origem. O ponto de visualização padrào da câmera é
em {0,0,-3} olhando na direção da oríge. Para ver a posição e o tamanho
inalterado de um objeto, seleciona a linah "None" no navegador "Normalization"
Em "Inspect/Appearence". Em geral não importa o que o intervalo de
coordenadas é enquanto o arquivo inteiro for consistente: {0,1},
{-1,1}, {0,100}, {-1000,-500}, {17,36} são todos intervalos válidos.


