7.4 Transformações
Nesta seção definiremos as matrizes de transformação em coordenadas homogêneas que correspondem às principais transformações afins utilizadas no pipeline de renderização.
Identidade
A transformação de identidade é a transformação que mapeia um ponto a ele mesmo:
p′=p.
É representada por uma matriz identidade:
I=[1000010000100001]. Assim,
p′=Ip=p.
Translação
Translação é a transformação afim de deslocamento de um ponto p por um vetor t:
p′=p+t
[x′y′z′1]=[xyz1]+[txtytz0].
A figura 7.2 ilustra o resultado da translação de todos os pontos de um cubo centralizado na origem.

Figura 7.2: Translação.
A matriz de translação é definida como
T=T(t)=[100tx010ty001tz0001].
Assim,
p′=Tp
[x+txy+tyz+tz1]=[100tx010ty001tz0001][xyz1].
A inversa da translação é o deslocamento de p no sentido inverso do vetor de deslocamento:
T−1(t)=T(−t).
Note que a transformação de translação não altera o formato do objeto. O objeto deslocado continua com as mesmas proporções. Uma transformação que, como a translação, preserva a distância entre todos os pontos do objeto transformado, é chamada de transformação de corpo rígido.
Escala
A escala é um tipo de transformação linear que faz com que um objeto aumente ou diminua de tamanho de acordo com fatores de escala em x, y e z. Desse modo, a escala não é uma transformação de corpo rígido.
A transformação de escala é obtida multiplicando cada coordenada (x,y,z) de um ponto p pelos escalares (sx,sy,sz):
x′=sxxy′=syyz′=szz.
Se os fatores de escala forem todos iguais (sx=sy=sz), temos uma escala uniforme pois o objeto é redimensionado por igual em todas direções. A figura 7.3 ilustra o resultado da escala uniforme de cada ponto de um cubo centralizado na origem. Como sx=sy=sz=2, o objeto dobra de tamanho em cada dimensão.

Figura 7.3: Escala uniforme sobre um objeto centralizado na origem.
A origem do frame é o ponto fixo da transformação, isto é, é o ponto que não é afetado pela escala. Observe, na figura 7.4, a escala uniforme de um cubo que não está centralizado na origem. O vértice que coincide com a origem é o único ponto que permanece inalterado. Pontos na origem continuam na origem após a escala.

Figura 7.4: Escala uniforme sobre um objeto não centralizado na origem.
Antes da aplicação da transformação de escala, é frequentemente desejável centralizar o objeto na origem ou fazer com que pelo menos a base do objeto fique centralizada na origem, como no modelo mostrado na figura 7.5.

Figura 7.5: Escala em objeto com base centralizada na origem.
Se o objeto não estiver centralizado na origem, a escala poderá deslocar o objeto de forma indireta. Por exemplo, se um cubo unitário estiver centralizado no ponto (10,10,10), a escala com sx=sy=sz=2 dobrará o tamanho do cubo em cada dimensão, como esperado. Porém, o cubo agora estará centralizado no ponto (20,20,20), o que provavelmente não é o que se quer.
Se os fatores de escala estão no intervalo [0,1), o objeto diminui de tamanho. A figura 7.6 mostra o resultado de uma escala uniforme que diminui o tamanho do objeto. Como sx=sy=sz=0.5, o objeto resultante tem 50% do tamanho original em cada dimensão.

Figura 7.6: Escala uniforme com fatores de escala menores que 1.
Se os fatores de escala não são iguais, o resultado é uma escala não uniforme. Na figura 7.7, o cubo triplica de tamanho na direção x (sx=3), mantém o tamanho na direção y (sy=1), e diminui o tamanho pela metade em z (sz=0.5).

Figura 7.7: Escala não uniforme.
Em resumo, se s é um fator de escala (sx, sy ou sz):
- 0≤s<1 faz o objeto diminuir de tamanho na direção correspondente.
- s=1 mantém o tamanho do objeto.
- s>1 faz o objeto aumentar de tamanho na direção correspondente.
Se o sinal de s é negativo, o resultado é uma reflexão na direção correspondente. A figura 7.8 ilustra o resultado da reflexão em x e y sem alteração do tamanho do objeto (|s|=1).

Figura 7.8: Reflexão.
A matriz de escala é definida como
S=S(sx,sy,sz)=[sx0000sy0000sz00001].
Assim,
p′=Sp
[sxxsyyszz1]=[sx0000sy0000sz00001][xyz1].
A inversa é a escala pelo valor recíproco dos fatores de escala:
S−1(sx,sy,sz)=S(1sx,1sy,1sz)
Assim, se um objeto teve seu tamanho dobrado (s=2), para voltar ao tamanho original devemos diminuir seu tamanho pela metade (s=1/2=0.5).
Rotação
A rotação é um tipo de transformação linear que produz uma movimentação radial em torno de um ponto ou eixo de rotação. A rotação é uma transformação de corpo rígido, pois não altera as distâncias entre os pontos do objeto rodado.
Para simplificar, vamos primeiramente definir uma rotação no plano cartesiano e depois estender o conceito para o espaço tridimensional.
Um ponto P=(x,y) é rodado em torno da origem por um ângulo θ no sentido anti-horário, resultando em um ponto P′=(x′,y′) como mostra a figura 7.9.
Figura 7.9: Rotação no plano.
Podemos determinar a transformação que leva P a P′ através da representação dos pontos em coordenadas polares:
x=rcosϕ,y=rsinϕ,x′=rcos(ϕ+θ),y′=rsin(ϕ+θ). Usando a soma de cossenos,
x′=rcos(ϕ+θ)=rcosϕcosθ−rsinϕsinθ,y′=rsin(ϕ+θ)=rsinϕcosθ+rcosϕsinθ.
Substituindo por x e y, obtemos o resultado:
x′=xcosθ−ysinθ,y′=ycosθ+xsinθ.
Em notação matricial:
[x′y′]=[cosθ−sinθsinθ−cosθ][xy]. A matriz
R(θ)=[cosθ−sinθsinθ−cosθ]
representa a transformação de rotação em torno da origem por um ângulo θ no sentido anti-horário.
Rotação 3D
No espaço tridimensional, a rotação ocorre em torno de um eixo de referência.
Vamos derivar as transformações de rotação em torno dos três eixos do sistema de coordenadas cartesiano orientado segundo a regra da mão direita (figura 7.10).
Figura 7.10: Sistema de coordenadas baseado na regra da mão direita.
Um ponto P=(x,y,z) é rodado em torno do eixo z por um ângulo θ no sentido anti-horário, resultando em um ponto P′=(x′,y′,z′), como mostra a figura 7.11.
Figura 7.11: Rotação em torno de z.
Pela regra da mão direita, é como se o eixo z positivo na figura 7.11 estivesse saindo da tela. Assim, as coordenadas x e y mudam como na rotação 2D, e a coordenação z não é modificada:
x′=xcosθ−ysinθ,y′=ycosθ+xsinθ,z′=z.
A figura 7.12 ilustra o resultado da rotação em π/6 radianos (30∘) em torno do eixo z, aplicada sobre um cubo centralizado na origem. Como o ângulo é positivo, o objeto é rodado no sentido anti-horário.

Figura 7.12: Rotação sobre um objeto centralizado na origem.
A figura 7.13 mostra a rotação em π/6 radianos em torno do eixo z sobre um cubo não centralizado na origem. Observe que todos os pontos ao longo do eixo z permanecem inalterados. De fato, na rotação 3D, todos os pontos ao longo do eixo de rotação são pontos fixos.

Figura 7.13: Rotação sobre um objeto não centralizado na origem.
Podemos obter a rotação em torno dos outros eixos através da substituição cíclica das coordenadas x, y e z nas expressões de rotação em torno de z, segundo a ordem mostrada na figura 7.14.
Figura 7.14: Ordem cíclica de substituição das coordenadas.
Assim, a rotação em torno do eixo x resultará em:
y′=ycosθ−zsinθ,z′=zcosθ+ysinθ,x′=x.
A rotação em torno do eixo y é obtida através de mais uma substituição cíclica das coordenadas nas expressões acima:
z′=zcosθ−xsinθ,x′=xcosθ+zsinθ,y′=y.
As matrizes de rotação em torno dos eixos x, y e z ficam como a seguir:
Rx(θ)=[10000cosθ−sinθ00sinθ−cosθ00001],Ry(θ)=[cosθ0sinθ00100−sinθ0cosθ00001],Rz(θ)=[cosθ−sinθ00sinθ−cosθ0000100001].
A matriz inversa de uma rotação por um ângulo θ é simplesmente a matriz de rotação pelo mesmo eixo, mas pelo ângulo −θ:
Rx(θ)−1=Rx(−θ),Ry(θ)−1=Ry(−θ),Rz(θ)−1=Rz(−θ).
Além disso, as matrizes de rotação são matrizes ortogonais. Desse modo, sua inversa é sua transposta:
Rx(θ)−1=Rx(θ)T,Ry(θ)−1=Ry(θ)T,Rz(θ)−1=Rz(θ)T.