Mudanças entre as edições de "Transformações em Imagens Vetoriais no Espaço"

De Aulas
 
 
Linha 1: Linha 1:
 +
 
Afluentes: [[Computação Gráfica]]
 
Afluentes: [[Computação Gráfica]]
  
 
= Representação =
 
= Representação =
  
{{note|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).}}
+
{{note|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.
 
O seguinte exemplo apresenta um algoritmo para a representação aramada de um cubo.
Linha 43: Linha 44:
 
</pre>
 
</pre>
  
{{note|O algoritmo acima é apresentado em linguagem C no código fonte exemplo cubo.c.
+
{{note|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.}}
 
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.}}
Linha 53: Linha 54:
 
== Translação ==
 
== 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 é a seguinte:
+
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:
  
 
<math>
 
<math>
Linha 67: Linha 68:
 
  Tz é a translação em relação à profundidade.
 
  Tz é a translação em relação à profundidade.
  
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
+
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:<math>
 
+
\begin{pmatrix} x & y & z \end{pmatrix} + \begin{pmatrix} Tx & Ty & Tz \end{pmatrix}
<math>
+
</math>tal que:
\begin{pmatrix} x & y & z \end{pmatrix} \cdot \begin{pmatrix} Tx & Ty & Tz \end{pmatrix}
+
x = x + Tx
</math>
+
y = y + Ty
 
+
z = z + Tz
tal que:
 
 
 
<math>
 
x = x + Tx
 
</math>
 
 
 
<math>
 
y = y + Ty
 
</math>
 
 
 
<math>
 
z = z + Tz
 
</math>
 
  
 
=== Algoritmo ===
 
=== Algoritmo ===
Linha 101: Linha 89:
 
</pre>
 
</pre>
  
Ou seja, a operação é executada em todos os pontos do elemento.
+
Lembrando que a operação é executada em todos os pontos do elemento, por isso temos o laço.
  
 
== Escala ==
 
== 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 é a seguinte:
+
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:
  
 
<math>
 
<math>
Linha 121: Linha 109:
 
  ''Sz'' : é a modificação da escala em relação à profundidade.
 
  ''Sz'' : é a modificação da escala em relação à profundidade.
  
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
+
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:
  
 
<math>
 
<math>
Linha 136: Linha 124:
  
 
tal que:
 
tal que:
 
+
x' = (x * Sx) + (y * 0) + (z * 0) = x * Sx
<math>
+
y' = (x * 0) + (y * Sy) + (z * 0) = y * Sy
x = (x \cdot Sx) + (y \cdot 0) + (z \cdot 0) = x \cdot Sx
+
z' = (x * 0) + (y * 0) + (z * Sz) = z * Sz
</math>
 
 
 
<math>
 
y = (x \cdot 0) + (y \cdot Sy) + (z \cdot 0) = y \cdot Sy
 
</math>
 
 
 
<math>
 
z = (x \cdot 0) + (y \cdot 0) + (z \cdot Sz) = z \cdot Sz
 
</math>
 
  
 
=== Algoritmo ===
 
=== Algoritmo ===
Linha 178: Linha 157:
  
 
=== Rotação em z ===
 
=== 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.
  
 
<math>
 
<math>
Linha 187: Linha 169:
 
</math>
 
</math>
  
tal que:
+
Conforme nossa matriz, temos que:
  
  ''θ'' é o ângulo, em radianos, que se quer rotacionar o objeto,
+
  ''θ'' é o ângulo, '''em radianos''', que se quer rotacionar o objeto,
 
  ''sin'' é a operação do seno sobre o ângulo e
 
  ''sin'' é a operação do seno sobre o ângulo e
 
  ''cos'' é a operação do cosseno sobre o ângulo.
 
  ''cos'' é a operação do cosseno sobre o ângulo.
  
Logo, a fórmula matemática da operação de translação fica da seguinte forma:
+
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:
  
 
<math>
 
<math>
Linha 208: Linha 190:
  
 
tal que:
 
tal que:
 
+
x' = (x * cos(θ)) + (y * -sen(θ)) + (z * 0)
<math>
+
y' = (x * sin(θ)) + (y * -cos(θ)) + (z * 0)
x' = (x \cdot \cos(\theta)) + (y \cdot -\sin(\theta)) + (z \cdot 0)
+
z' = (x * 0) + (y * 0) + (z * 1) = z
</math>
+
{{note|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.}}
 
 
<math>
 
y' = (x \cdot \sin(\theta)) + (y \cdot \cos(\theta)) + (z \cdot 0)
 
</math>
 
 
 
<math>
 
z' = (x \cdot 0) + (y \cdot 0) + (z \cdot 1) = z
 
</math>
 
 
 
{{note|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 pivo do elemento.}}
 
  
 
==== Algoritmo ====
 
==== Algoritmo ====
Linha 250: Linha 222:
 
=== Rotação em x ===
 
=== 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.
+
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
  
 
<math>
 
<math>
Linha 260: Linha 232:
 
</math>
 
</math>
  
Logo, a fórmula matemática da operação de translação em x fica da seguinte forma:
+
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:
  
 
<math>
 
<math>
Linha 275: Linha 247:
  
 
tal que:
 
tal que:
 
+
x' = (x * 1) + (y * 0) + (z * 0) = x
<math>x' = (x \cdot 1) + (y \cdot 0) + (z \cdot 0) = x</math>
+
y' = (x * 0) + (y * cos(θ)) + (z * -sin(θ))
 
+
z' = (x * 0) + (y * sin(θ)) + (z * cos(θ))
<math>y' = (x \cdot 0) + (y \cdot \cos(\theta)) + (z \cdot -\sin(\theta))</math>
 
 
 
<math>z' = (x \cdot 0) + (y \cdot \sin(\theta)) + (z \cdot  \cos(\theta))</math>
 
 
 
{{note|Na rotação em x, apenas o x não se modifica.}}
 
  
 
==== Algoritmo ====
 
==== Algoritmo ====
 
+
Dessa forma, temos o algoritmo da rotação em x apresentado abaixo:<pre>
<pre>
 
 
Entrada ang
 
Entrada ang
  
Linha 305: Linha 271:
 
=== Rotação em y ===
 
=== Rotação em y ===
  
Por fim, segue a matriz de 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.
  
 
<math>
 
<math>
Linha 315: Linha 281:
 
</math>
 
</math>
  
Aplicando a multimplicação de matrizes:
+
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:
  
 
<math>
 
<math>
Linha 329: Linha 295:
 
</math>
 
</math>
  
tem-se:
+
sendo que:
 
+
x' = (x * cos(θ)) + (y * 0) + (z * -sin(θ))
<math>x' = (x \cdot \cos(\theta)) + (y \cdot 0) + (z \cdot -\sin(\theta))</math>
+
y' = (x * 0) + (y * 1) + (z * 0)) = y
 
+
z' = (x * sin(θ)) + (y * 0) + (z * cos(θ))
<math>y' = (x \cdot 0) + (y \cdot 1) + (z \cdot 0) = y</math>
 
 
 
<math>z' = (x \cdot \sin(\theta)) + (y \cdot 0) + (z \cdot \cos(\theta))</math>
 
  
 
==== Algoritmo ====
 
==== Algoritmo ====
 
+
E, por fim, temos nosso algoritmo de transformação de rotação no eixo y:<pre>
<pre>
 
 
Entrada ang
 
Entrada ang
  
Linha 354: Linha 316:
  
 
Transladar (Pivo.x, Pivo.y, Pivo.z)
 
Transladar (Pivo.x, Pivo.y, Pivo.z)
</pre>
+
</pre>O código em python das transformações no espaço é apresentado na aula de transformações de perspectiva ou projeção cônica.

Edição atual tal como às 09h52min de 16 de abril de 2025

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.