#### 4.3.3 Objetos de Transformação

Onde uma matriz simples 4x4 é esperada – como no campo de `transform` `INST`, a transformação da câmera `camtoworld` e os comandos do Geomview `xform*` – use um objeto de transformação.

Note que uma transformação é diferente de uma `TLIST`, que é um tipo de geometria. `TLIST`s podem conter uma ou mais transformações 4x4; objetos "transform" devem ter exa-tamente uma.

Por que temos ambos ("transform" e TLIST)? Em muitos lugares – e.g. posicionamento de câmeras – é somente significativo ter uma transofrmação simples. Usando um tipo separado de objeto reforça isso.

A sintaxe para um objeto de transformação "transform" é

         <transform> ::=
           [ "{" ]             (Abertura de chave, geralmente necessário para
                                tornar o fim do objeto claramente explicitado.)

            [ "transform" ]    (palavra chave opcional; desnecessária se o tipo
                                for determinado pelo contexto, o que comumente
                                ocorre.)
            [ "define" <nome> ]
                               (define uma transformação chamada <nome>,
                               escolhendo seus valores do material adiante)

               <dezesseis números em ponto flutuante>
                               (interpretado como uma transformação homogênea 4x4
         		       fornecida linha por linha, intencionalmente aplicada a um
                                vetor linha multiplicado à ESQUERDA, de forma que
                                e.g. translações euclidianas apareçam na linha
                                inferior)
            |
               "<" <nomedearquivo>  (significando: leia a transformação a partir
                                daquele arquivo)
            |
               ":" <nome>      (significando: use a variável <nome>,
                                 definida em algum lugar; se não definido o valor
                                 inicial é a transformação identidade)

          [ "}" ]              (fechamento de chave correspondente)

O conjunto pode ser colocado entre { chaves }. As chaves não são essenciais se exatamente um dos itens acima estiver presente, então e.g. um array 4x4 de números em ponto flutuante independente não precisa necessariamente ter chaves.

Alguns exemplos, em contextos onde eles podem ser usados:

         # Exemplo 1: Um comando GCL para definir uma transformação
         # chamada "fred"

         (read transform { transform  define fred
                  1 0 0 0
                  0 1 0 0
                  0 0 1 0
                 -3 0 1 1
             }
         )

         # Exemplo 2:  Um objeto câmera usando a transformação
         # "fred" para posicionamento de câmera
         # Fornecida a definição acima, isso coloca a câmera em
         # (-3, 0, 1), olhando na direção -Z.

         { camera
                 halfyfield 1
                 aspect 1.33
                 camtoworld { : fred }
         }