Next: , Previous: image objects, Up: Objetos nao-geometricos


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. TLISTs 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 }
     }