Transformações em Imagens Vetoriais no Espaço

De Aulas

Afluentes: Computação Gráfica

Representação

Tpl note.png

O espaço tridimensional é composto por três vetores. Desta forma, para representar os elementos vetoriais neste espaço é necessário acrescentar o eixo z aos já conhecidos x e y. Dessa forma, cada ponto pode ser representado por (x, y, z). Sendo que x é o eixo horizontal, y o eixo vertical e z a distância longitudinal de um ponto.

O seguinte exemplo apresenta um algoritmo para a representação aramada de um cubo.

Ponto {
	Real x
	Real y
	Real z
}

Cubo = Vetor [8] Ponto

Cubo[0].Ponto = ( 5,  5,  5);
Cubo[1].Ponto = (10,  5,  5);
Cubo[2].Ponto = (10, 10,  5);
Cubo[3].Ponto = ( 5, 10,  5);
Cubo[4].Ponto = ( 5,  5, 10);
Cubo[5].Ponto = (10,  5, 10);
Cubo[6].Ponto = (10, 10, 10);
Cubo[7].Ponto = ( 5, 10, 10);

j = 1;
Para i = 0 até 3 Fazer
	j = i + 1;
	Se j == 4
		Então j = 0
	Fim se
	Desenhar_linha(
		Cubo[i].Ponto.x, Cubo[i].Ponto.y,
		Cubo[i+4].Ponto.x, Cubo[i+4].Ponto.y)
	Desenhar_linha(
		Cubo[i].Ponto.x, Cubo[i].Ponto.y,
		Cubo[j].Ponto.x, Cubo[j].Ponto.y)
	Desenhar_linha(
		Cubo[i+4].Ponto.x, Cubo[i+4].Ponto.y,
		Cubo[j+4].Ponto.x, Cubo[j+4].Ponto.y)
Fim para


Tpl note.png

O algoritmo acima é apresentado em linguagem Python no código fonte da aula de prespectiva.

Observe que o vetor z dos pontos não estão envolvidos na apresentação da figura na tela do computador. Isso por que a tela não possui profundidade. Temos que apresentar todos os elementos chapados na tela do monitor do computador.

Transformações

As transformações no espaço tridimensional devem ser aplicadas, assim como nas transformações no plano, em todos os pontos do objeto. Aqui são apresentadas as transformações de translação, escala e rotação em x, y e z.

Translação

A operação da translação ocorre com a soma da matriz de translação com todos os pontos do objeto, assim como a translação no espaço. Porém, agora a matriz de translação possui um elemento a mais para tratar do eixo z, o Tz. A matriz de translação no espaço tridimensional é uma matriz horizontal de um por três com os elementos Tx, Ty e Tz:

tal que:

Tx é a translação na horizontal e
Ty é a translação na vertical e
Tz é a translação em relação à profundidade.

Logo, a fórmula matemática da operação de translação é a soma da matriz horizontal de um por três do ponto x, y z com a matriz de transformação Tx, Ty e Tz:tal que:

x = x + Tx
y = y + Ty
z = z + Tz

Algoritmo

Baseado na matriz e na fórmula para a operação de translação no plano, o algoritmo para esta operação fica da seguinte maneira:

Entrada Tx, Ty e Tz

Para i = 0 Até Quantidade_de_pontos Fazer
	Ponto[i].x = Ponto[i].x + Tx
	Ponto[i].y = Ponto[i].y + Ty
	Ponto[i].z = Ponto[i].z + Tz
Fim para

Lembrando que a operação é executada em todos os pontos do elemento, por isso temos o laço.

Escala

A operação da escala ocorre com a multiplicação da matriz de Escala com todos os pontos do objeto, agora com o eixo Z acrescido e o novo elemento Sz (Escala em profundidade). A matriz de escala no espaço tridimensional é uma matriz quadrada de três por três, sendo que temos os elementos da primeira linha Sx, 0 e 0, da segunda linha 0, Sy e 0 e da terceira linha 0, 0 e Sz. Ou seja, a operação de escala usa uma matriz diagonal:

tal que:

Sx : é a modificação da escala na horizontal,
Sy : é a modificação da escala na vertical e
Sz : é a modificação da escala em relação à profundidade.

Logo, a fórmula matemática da operação de translação é a multiplicação da matriz horizontal de um por três do ponto x, y e z pela matriz da transformação da escala apresentada acima:

tal que:

x' = (x * Sx) + (y * 0) + (z * 0) = x * Sx
y' = (x * 0) + (y * Sy) + (z * 0) = y * Sy
z' = (x * 0) + (y * 0) + (z * Sz) = z * Sz

Algoritmo

Baseado na matriz e na fórmula para a operação de escala no plano, o algoritmo para esta operação fica da seguinte maneira:


Tpl note.png

Lembre-se que é necessário transladar o objeto para seu ponto de origem, utilizando-se de um pivô para isso, e depois transladar de volta para sua localização no espaço tridimensional. Assim como na operação de Escala no plano.

Entrada Sx, Sy e Sz

Pivo = Ponto[0];

Transladar(-Pivo.x, -Pivo.y, -Pivo.z);

Para i = 0 Até Quantidade_de_pontos Fazer
	Ponto[i].x = Ponto[i].x * Sx
	Ponto[i].y = Ponto[i].y * Sy
	Ponto[i].z = Ponto[i].z * Sz
Fim para

Transladar(Pivo.x, Pivo.y, Pivo.z);

A operação é executada em todos os pontos do elemento, assim como na operação de translação.

Rotação

A operação de rotação ocorre com a multiplicação da matriz de Rotação com todos os pontos do objeto. Porém, é importante observar que a matriz de rotação agora pode ser aplicada nos eixos x, y e z. No plano, a rotação é considerada sobre o eixo z. Dessa forma, as matrizes de rotação são apresentadas a seguir:

Rotação em z

A matriz de rotação em z é uma matriz quadrada de três por três em que os componentes da primeira linha são cosseno do ângulo, seno do ângulo e zero, da segunda linha menos seno do ângulo, cosseno do ângulo e zero e da terceira linha zero, zero e um.

Observe que como estamos rotacionando em z, as linha horizontal e vertical de z tem os elementos zerado e a intersecção da linha, que é z, fica um. A operação de rotação que tínhamos no plano (primeira linha cosseno de ângulo e seno do ângulo e segunda linha menos seno do ângulo e cosseno do ângulo) são aplicadas a x (posição 0, 0 da matriz de rotação) e y (posição 1, 1 da matriz de rotação). Isso significa que estamos rotacionando x e y dobre o eixo z, ou seja, o elemento z dos pontos não será modificado.

Conforme nossa matriz, temos que:

θ é o ângulo, em radianos, que se quer rotacionar o objeto,
sin é a operação do seno sobre o ângulo e
cos é a operação do cosseno sobre o ângulo.

Logo, a fórmula matemática da operação de rotação no espaço sobre z se dá pela matriz horizontal do ponto x, y e z multiplicada pela matriz de rotação no eixo z apresentada acima:

tal que:

x' = (x * cos(θ)) + (y * -sen(θ)) + (z * 0)
y' = (x * sin(θ)) + (y * -cos(θ)) + (z * 0)
z' = (x * 0) + (y * 0) + (z * 1) = z

Tpl note.png

Aqui temos x', y' e z', assim como na rotação no plano. Porém, z não se modifica, se mantêm. Isso é devido à operação de rotação ser sobre o eixo z. Ainda aqui, assim como na escala, devemos transladar nosso objeto para o ponto de origem do espaço, baseando-se em um pivô do elemento.

Algoritmo

Baseado na matriz de rotação em z, o algoritmo para esta operação fica da seguinte maneira:

Entrada ang

Pivo = Ponto[0];

Transladar (-Pivo.x, -Pivo.y, -Pivo.z)

Para i = 0 Até Quantidade_de_pontos Fazer
	xAux = (Ponto[i].x * cos(ang)) + (Ponto[i].y * -sen(ang))
	yAux = (Ponto[i].x * sen(ang)) + (Ponto[i].y *  cos(ang))
	Ponto[i].x = xAux
	Ponto[i].y = yAux
Fim para

Transladar (Pivo.x, Pivo.y, Pivo.z)


Tpl note.png

Como nesta operação (rotação em z) o z do ponto não se modifica, então não é necessário executar qualquer operação sobre z.

Aqui, também, operação é executada em todos os pontos do elemento, assim como na operação de translação e na escala.

Rotação em x

Seguindo o esquema da rotação em z, a rotação em x também possui sua matriz de rotação, sendo que agora é o elemento x na posição (0, 0) da matriz quadrada de três por três será 1 e sua linha e coluna zeradas. Ou seja, x não será modificado porque estamos rotacionando os pontos sobre o eixo x. Então a matriz quadrada de três por três tem como elementos da primeira linha 1, 0 e 0, segunda linha 0, cosseno do ângulo e seno do ângulo e terceira linha 0, menos seno do ângulo e cosseno do ângulo, conforme vista abaixo

Logo, a fórmula matemática da operação de translação em x se dá pela multiplicação da matriz horizontal de um por três de x, y e z pela matriz de rotação em x apresentada acima:

tal que:

x' = (x * 1) + (y * 0) + (z * 0) = x
y' = (x * 0) + (y * cos(θ)) + (z * -sin(θ))
z' = (x * 0) + (y * sin(θ)) + (z * cos(θ))

Algoritmo

Dessa forma, temos o algoritmo da rotação em x apresentado abaixo:

Entrada ang

Pivo = Ponto[0];

Transladar (-Pivo.x, -Pivo.y, -Pivo.z)

Para i = 0 Até Quantidade_de_pontos Fazer
	yAux = (Ponto[i].y * cos(ang)) + (Ponto[i].z * -sen(ang))
	zAux = (Ponto[i].y * sen(ang)) + (Ponto[i].z *  cos(ang))
	Ponto[i].y = yAux
	Ponto[i].z = zAux
Fim para

Transladar (Pivo.x, Pivo.y, Pivo.z)

Rotação em y

Por fim, segue a matriz de rotação em y, sendo que temos a matriz quadrada de três por três com a primeira linha cosseno do ângulo, 0 e seno do ângulo, segunda linha 0, 1 e 0 e terceira linha menos seno do ângulo, 0 e cosseno do ângulo.

Aplicando a multiplicação da matriz horizontal de 1 por 3 do ponto x, y e z na matriz de rotação em y, temos que:

sendo que:

x' = (x * cos(θ)) + (y * 0) + (z * -sin(θ))
y' = (x * 0) + (y * 1) + (z * 0)) = y
z' = (x * sin(θ)) + (y * 0) + (z * cos(θ))

Algoritmo

E, por fim, temos nosso algoritmo de transformação de rotação no eixo y:

Entrada ang

Pivo = Ponto[0];

Transladar (-Pivo.x, -Pivo.y, -Pivo.z)

Para i = 0 Até Quantidade_de_pontos Fazer
	xAux = (Ponto[i].x * cos(ang)) + (Ponto[i].z * -sen(ang))
	zAux = (Ponto[i].x * sen(ang)) + (Ponto[i].z *  cos(ang))
	Ponto[i].x = xAux
	Ponto[i].z = zAux
Fim para

Transladar (Pivo.x, Pivo.y, Pivo.z)

O código em python das transformações no espaço é apresentado na aula de transformações de perspectiva ou projeção cônica.