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