Mudanças entre as edições de "Transformações em Imagens Vetoriais no Espaço"
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 | + | {{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 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 | + | 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} | + | x = x + Tx |
− | </math> | + | y = y + Ty |
− | + | z = z + Tz | |
− | tal que: | ||
− | |||
− | |||
− | x = x + Tx | ||
− | |||
− | |||
− | |||
− | y = y + Ty | ||
− | |||
− | |||
− | |||
− | z = z + Tz | ||
− | |||
=== Algoritmo === | === Algoritmo === | ||
Linha 101: | Linha 89: | ||
</pre> | </pre> | ||
− | + | 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 | + | 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 | + | 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 | |
− | + | y' = (x * 0) + (y * Sy) + (z * 0) = y * Sy | |
− | x = (x | + | z' = (x * 0) + (y * 0) + (z * Sz) = z * Sz |
− | |||
− | |||
− | |||
− | y = (x | ||
− | |||
− | |||
− | |||
− | z = (x | ||
− | |||
=== 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> | ||
− | + | 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 | + | 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) | |
− | + | y' = (x * sin(θ)) + (y * -cos(θ)) + (z * 0) | |
− | x' = (x | + | z' = (x * 0) + (y * 0) + (z * 1) = z |
− | + | {{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.}} | |
− | |||
− | |||
− | y' = (x | ||
− | |||
− | |||
− | |||
− | z' = (x | ||
− | |||
− | |||
− | {{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 | ||
==== 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 | + | 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 | |
− | + | y' = (x * 0) + (y * cos(θ)) + (z * -sin(θ)) | |
− | + | z' = (x * 0) + (y * sin(θ)) + (z * cos(θ)) | |
− | |||
− | |||
− | |||
− | |||
− | |||
==== 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 | + | 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> | ||
− | + | 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 ==== | ==== 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
|
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
|
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:
|
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
|
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)
|
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.