#### 4.2.9 Arquivos do Tipo INST

O sufixo convencional para um arquivo `INST` é `.inst`.

Não existe formato INST BINARY.

Um `INST` aplica uma transformação 4x4 (ou (N+1)x(N+1) no contexto de ND-viewing) a outro objeto OOGL. Um arquivo do tipo `INST` inicia-se com `INST` seguido de as seções mostradas adiante que podem vir em qualquer ordem:

         geom oogl-object

especifica o objeto OOGL a ser instanciado. Veja Referencias, para a sintaxe de um oogl-object. palavra chave `unit` é um sinônimo para `geom`.

         transform   ["{"] transformação 4x4 ["}"]

especifica uma matriz de transformação simples. Ou a matriz pode aparecer literalmente como 16 números, ou a matriz pode aparecer como uma referência a um objeto "transform", i.e.

             "<" arquivo-contendo-matriz-4x4

ou

             ":" símbolo-representando-transformação-de-objeto

Outra forma de especificar a transformação é

         transforms
             objeto-oogl

O objeto-oogl deve ser um objeto `TLIST` (lista de transformações), ou uma `LIST` cujos membros dessa lista são objetos `TLIST` mais recentes. Com efeito, a palavra chave `transforms` toma uma coleção de matrizes 4x4 e replica o objeto `geom`, fazendo uma cópia para cada matriz 4x4.

Se nem a palavra chave `transform` nem a palavra chave `transforms` aparecerem, ne-nhuma transformação é aplicada (atualmente a identidade é aplicada). Você pode usar isso para, e.g., empacotar uma aparência em torno de um objeto externo fornecido, através de uma LIST de membros simples pode-se fazer isso mais eficientemente.

Veja Matrizes de transformacao, para o formato de matriz.

A cópia de um objeto geométrico simples por meio de um objeto `TLIST` (veja ‘`transforms`’ acima) pode ser útil para transformar coordenadas de textura através de outra lista de transformações; essa lista pode ser especificada por

         txtransforms
             objeto-TLIST

O número de transoformações de textura deve coincidir com o número de transformações geométricas. O objeto `SPHERE` (Veja Sphere Objects) utiliza essa técnica para gerar um esfera completamente texturizada fora de alguma fração de uma esfera (usualmente um octante).

Uma transformação (N+1)-dimensional pode ser especificada por

         ntransform ["{"] N+1 N+1 (N+1)x(N+1) floats ["}"]

A linha acima fornece uma matriz de transformação N+1-dimensional. Ou a matriz pode aparecer literalmente como (N+1)x(N+1) números, ou pode existir uma referência a um objeto ‘`ntransform`’, i.e.

             "<" arquivo-contendo-matriz-(N+1)x(N+1)

ou

             ":" símbolo-representando-objeto-ntransform

Veja Matrizes de transformacao ND, para o formato de matriz.

Mais dois campos INST são aceitos: `location` e `origin`.

Note que `location` bem como `origin` são ignorados se esse objeto `INST` realiza uma `ntransform`. Também, se a visualização ND está ativada (comando `ND-axes`, veja GCL) então objetos `INST` com `origin` diferente de `local` não irão ser desenhados, embora o material `location` possa trabalhar (ou não).

         location [global ou camera ou ndc ou screen ou local]

Normalmente um INST especifica uma posição relativa a seu objeto pai; o campo `location` permite colocar um objeto em qualquer lugar.

- `location global` anexa o objeto ao ambiente do sistema de coordenadas global (também conhecido como "universe") – o mesmo dos objetos mundo do Geomview, das geometrias alienígenas, e câmeras são colocados.
- `location camera` coloca o pai do objeto como sendo uma câmera. (Dessa forma se houverem multiplas visualizações, essas visualizações podem aparecer em uma diferente posição espacial em cada visualização.) O centro de visão da camera está em volta da parte negativa do seu eixo z; X positivo está à direita e adiante, Y positivo está acima e adiante. Normalmente as unidades do espaço da câmera são as mesmas das coordenadas globais. Quando uma câmera é colocada de volta à sua posição inicial, a orígem global está localizada em (0,0,-3.0).
- `location ndc` coloca os parentes do objeto no cubo unitário normalizado no qual a projeção da câmera (perspectiva ou ortográfica) mapeia o objeto mundo visível. X, Y, e Z estão no intervalo de -1 a +1, com Z = -1 estando mais próximo e Z = +1 adiante do plano de corte, e X e Y nas direções à direita e adiante e acima e adiante respectivamente. Dessa forma alguma coisa como

                INST  transform  1 0 0 0  0 1 0 0  0 0 1 0  -.9 -.9 -.999 1
                      location ndc
                      geom < label.vect

  cola `label.vect` dentro do canto infeiror esquerdo de cada janela, e em frente de tudo mais que estiver próximo, assumindo o conteúdo `label.vect` como localizado no quadrante positivo do plano XY. É tentado usar -1 em lugar de como a componente Z da posição, mas o -1 pode colocar o objeto apenas nas proximidades em lugar de muito perto do plano de corte e tornar o objeto (parcialmente) invisível, devido a algum erro de cálculo com números em ponto flutuante.

- `location screen` coloca o objeto objeto em coordenadas de tela. O intervalo de Z é ainda de -1 a +1 como para coordenadas ndc; X e Y são medidos em pixels, e a posição de (0,0) localiza-se no canto inferior esquerdo da janela, avançado para a direita e adiante e para cima e adiante.

`location local` é o padrão; o objeto está posicionado relativametne a seus genitores.

         origin [global ou camera ou ndc ou screen ou local] x y z

O campo `origin` reposiciona o conteúdo da INST de forma que o local da orígem seja o ponto especificado do sistema de coordenadas fornecido. A menos que `location` seja especificado, essa opção não muda a orientação, somente a escolha da orígem. Ambas as opções `location` e `origin` podem ser usadas juntas.

Então por exemplo

         { INST
           location screen
           origin ndc 0 0 -.99
           geom { < xyz.vect }
           transform { 100 0 0 0  0 100 0 0  0 0 -.009 0   0 0 0 1 }
         }

coloca a orígem de xyz.vect no centro da janela, apenas transformando o plano de corte mais próximo. O comprimento da unidade das arestas X e Y são ajustados proporcionalmente para ter o comprimento de apenas 100 unidades de tela – pixels – , independentemente do tamanho da janela.