O que uma matriz representa?

19

Comecei a aprender OpenGL recentemente e estou tendo problemas para visualizar o que são matrizes e seu papel na computação gráfica. Dado o modelo de uma matriz 4x4 como esta:

insira a descrição da imagem aqui

Eu diria que cada matriz como esta são as coordenadas de um vértice no espaço do mundo. E vários deles juntos e sombreados dão um objeto?

Mas por que existe um Xx, um Xye um Xz? Eu li que é um eixo diferente (para cima, para a esquerda, para a frente), mas ainda não pode fazer cara ou coroa do significado.

Sad CRUD Developer
fonte

Respostas:

19

Matrizes em computação gráfica são as transformações dadas a cada coordenada no modelo. Cada matriz é uma combinação de várias transformações a serem aplicadas a uma coordenada (um ponto no espaço 3).

A construção de uma transformação é baseada em um dos três tipos de transformação: Traduzir, Girar e Dimensionar.

Uma matriz de tradução é algo como:

Uma matriz de tradução

E uma matriz de escala: Matriz de escala

Matrizes de rotação são parecidas com:

insira a descrição da imagem aqui

Para combinar qualquer uma dessas matrizes, basta multiplicá-las. Para aplicar a transformação a um vértice, multiplique-o (como visto no diagrama de conversão).

Alex Shepard
fonte
4
O então matrizes não representam pontos. Estou embargado agora
Sad CRUD Developer
Muitas vezes eles são aplicados a um objeto ou a porta de visualização como um todo (isso é como você começa o seu orto vs vistas em perspectiva)
Alex Shepard
3
@BDillan: Não, mas certamente eles podem conter pontos. A última coluna em uma matriz ModelView (GL / column-major), por exemplo, define como a origem é convertida. Ou, em outras palavras, define onde o olho está localizado no espaço do mundo e pode literalmente ser usado como um ponto por si só.
Andon M. Coleman
sua coordenada é uma tupla de três. por que a matriz não é 3 vezes 3? Suponha que, por ser capaz de combinar os três tipos de transformação em uma única matriz e ainda tenha espaço suficiente, o que está fazendo no canto inferior direito, parece que sempre é 1?
N611x007
A quarta linha / coluna está especificamente lá para traduções. Uma das características mais agradáveis ​​da matemática matricial é que eu posso combinar todas as traduções e rotações que desejo realizar em uma única matriz. Isso significa que conjuntos de transformações muito, muito complexos (teoricamente infinitos) podem ser compactados em uma matriz. Sim, essa última célula permanece 1, mas nos permite fazer o resto das contas.
Alex Shepard
10

Em computação gráfica, usamos matrizes para codificar transformações .

Matrizes que contêm apenas conversões de conversão, rotação ou escala têm uma interpretação comumente explorada: o 3x3 superior esquerdo da matriz contém apenas dados de rotação ou escala, a linha inferior ou a coluna da direita contém dados de conversão. Isso não é uma generalidade, mas é verdade o suficiente para o subconjunto de transformações representadas na computação gráfica que as pessoas fazem uso dela.

Da mesma forma, existe uma relação entre os valores da matriz e o quadro de coordenadas correspondente que a matriz representa (que nem sempre é "espaço do mundo", devo observar). As colunas 3x3 no canto superior esquerdo (ou linhas) representam os eixos X, Y e Z do quadro de coordenadas.

Se as linhas representam ou não eixos ou a coluna depende de você estar usando a convenção de multiplicar como row vector * matrixou matrix * column vector. Ao executar a multiplicação de matrizes, as dimensões internas das duas matrizes devem concordar e, portanto, se você está representando vetores como matrizes de linha ou matrizes de coluna afeta essa escolha (OpenGL e matemática tradicional tendem a preferir vetores de coluna).

Eu recomendo que você obtenha um bom livro sobre álgebra linear ou, pelo menos, dê uma olhada nas Perguntas freqüentes sobre Matrix e Quaternion e esta postagem sobre layouts de matriz no DirectX e OpenGL .

wjl
fonte
Existem muitos livros "bons" sobre álgebra linear, alguns dos quais eu já li e entendi. O fato é que isso não ajuda um pouco, não que eu os tenha, nem que eu tenha entendido. Sinto que seu último conselho é responder à suposição errada.
N611x007
9

O que é uma matriz?

Uma matriz com mcolunas e nlinhas representa uma função que consome um vetor * com melementos (ou coordenadas) e produz um vetor com nelementos.

A partir disso, é possível observar que, se e somente se uma matriz for quadrada, a dimensionalidade do vetor não será alterada. Por exemplo. você obtém um vetor 3D ao transformar um vetor 3D, um 2D de um 2D etc.

* : Na física, os vetores são geralmente usados ​​para indicar forças ou outras "influências" que "movimentam" coisas como velocidade ou aceleração. Mas não há nada que o impeça de usar um vetor para representar um ponto ou qualquer matriz arbitrária de números (algumas bibliotecas e linguagens de programação até usam "vetor" para significar "matriz 1D"). Para uso com matrizes, qualquer coisa pode ser os elementos do seu vetor (mesmo seqüências de caracteres ou cores), desde que você possa adicionar, subtrair e multiplicá-los por quaisquer que sejam os elementos da sua matriz. Daí o vetor de nome , que significa "transportadora" - carrega ou mantém valores para você.

O que significa multiplicar por uma matriz?

Então, se uma matriz é uma função, que tipo de função ? O que a função faz? A receita para isso é definida pelos elementos da matriz. Vamos chamar a entrada u, a saída v, a matriz M(a multiplicação M*u=vé a mesma que f(u)=v) e u(i)fornecer o ith elemento de u(o segundo elemento é a coordenada y, por exemplo). Para a matriz, M(i,j)significa linha i, coluna j.

A construção do elemento v(1), a primeira no resultado, é descrita pela primeira linha da matriz. u(1)vezes M(1,1), mais u(2)vezes M(1,2), ... mais u(i)vezes M(1,i). Uma matriz é um pouco como uma linguagem de programação muito simples, que é boa apenas para funções de programação que funcionam alterando as entradas, adicionando-as a si mesmas, etc. **

É útil imaginar que você está trabalhando em um elemento de saída de cada vez; portanto, você está usando apenas uma linha da matriz por vez. Você escreve uhorizontalmente. Você escreve a i-ésima linha Mabaixo dela. Você multiplica cada par acima / abaixo e escreve os produtos abaixo e depois os soma. Repita para cada linha para obter todos os elementos de v. (Agora você vê por que uma matriz mby ndeve operar em um mvetor e produzir um nvetor.)

Outra maneira de pensar sobre isso - digamos que estamos fazendo uma transformação 3D em 3D, portanto, uma matriz 3x3 (ou transformação 3D como costuma ser chamada porque você pode fingir que essa "função" está "movendo" pontos 3D, mesmo que seja realmente apenas mudando os números). Digamos que a primeira linha seja [1 2 0]. Isso significa que, para obter x do resultado, obtenha 1 do x da entrada, 2 do y da entrada e 0 do z da entrada. Então é realmente uma receita.

** : Se uma matriz é uma linguagem de programação, ela nem está completa.

O que significa multiplicar duas matrizes?

Se ambas são matrizes de tamanho apropriado, A*Bsignifica "uma função que se aplica primeiro e Bdepois A". Você pode ver por que existem restrições nos tamanhos para multiplicação, porque o tamanho determina o tamanho da entrada e da saída e uma matriz consome a saída da outra. Por que multiplicação significa combinar funções? É mais fácil perceber que tem que ser. Se A*ué o mesmo que f(u)e B*ué o mesmo que g(u)então f(g(u))é o mesmo f(B*u)que é o mesmo que A*(B*u).

Da mesma forma, aplicações repetidas da mesma função podem ser mostradas como potências, pois A*A*Asignifica aplicar a função que Arepresenta três vezes.

Como as matrizes são úteis?

Qual a vantagem de fazer uma transformação new_x = 1*x+2*y+0*z(se a primeira linha for [1 2 0])? Isso não é muito óbvio, mas vamos dar outra matriz 2D para explicar isso. A matriz é:

[ 0 1
  1 0 ]

Ou [0 1; 1 0]usando a notação conveniente do Matlab. O que essa matriz faz? Ele transforma um vetor 2D da seguinte maneira: para o x do resultado, tire 1 do y da entrada. Para o y do resultado, tire 1 do x da entrada. Acabamos de trocar as coordenadas xey da entrada - essa matriz reflete pontos sobre a linha x = y. Isso é útil! Por extensão, você verá que todas as matrizes com 1s na linha SW - NE refletem. Você também pode ver por que as matrizes de identidade retornam a entrada (para x de saída, pegue x de entrada; para y de saída, pegue y de entrada ...).

Agora você vê por que os símbolos são, por exemplo. Xx, Yx- que significa o quanto de entrada X, Yetc. entra em produção x.

De que outra forma as matrizes são úteis?

Que outra transformação você pode fazer? Você pode redimensionar usando uma matriz de identidade, mas com um número diferente de 1 ao longo da diagonal. Por exemplo,[2.5 0; 0 22.5] multiplicará todas as coordenadas da entrada por 2,5 e, se você aplicar essa matriz a todos os pontos da imagem, a imagem será 2,5 maior. Se você colocar apenas 2,5 em uma linha ( [2.5 0; 0 1]), apenas a coordenada x será multiplicada; portanto, você somente estenderá ao longo de x.

Outras matrizes podem dar outras transformações, como "inclinação", que têm graus variados de utilidade. Pessoalmente, a inclinação é a minha menos favorita, porque a matriz parece tão simples, mas a transformação em si raramente faz nada, exceto alterar uma imagem. Uma útil é a "rotação" - como você gira um ponto? Tente trabalhar a posição do ponto(x, y) depois de girar em thetagraus no sentido anti-horário sobre a origem. Você descobrirá que as novas coordenadas x e y resultam da multiplicação dos antigos x e y por alguns senos e cossenos de teta. Você deve ser capaz de escrever facilmente uma matriz de rotação usando senos e cossenos que correspondem a esta função.

Com matrizes não quadradas, você também pode alterar a dimensionalidade de uma entrada. Transformar uma entrada 2D em 3D não é muito útil, pois é difícil "fabricar" algo para inserir na nova coordenada, mas 3D em 2D é muito útil. Entre outras coisas, é assim que seu computador sabe projetar *** uma cena 3D em imagem 2D para desenhar em seu monitor.

Como os vetores podem conter coisas diferentes, você pode até descrever uma matriz que criptografa uma seqüência de caracteres n de cada vez, embaralhando-os ou "multiplicando-os" (você teria que criar a função de multiplicação / adição).

*** : Ao projetar , você pega um objeto 3D como uma escultura, lança uma luz sobre ele e vê que tipo de sombra 2D cai na parede.

Quais são as limitações das matrizes?

Você pode fazer todas as funções com matrizes? Não. Pensando graficamente, é difícil imaginar algo que uma matriz não poderia fazer (mas existe: um efeito "turbilhão" não pode ser feito, por exemplo). No entanto, aqui está um exemplo fácil: digamos que a função fseja tal que f(u)o devolva u com todos os elementos ao quadrado . Você verá que não pode escrever uma matriz para isso: com matrizes, existe apenas um recurso para descrever receitas que multiplicam coordenadas por um número constante, nenhuma outra função sofisticada, como poder, pode ser expressa.

**** : É também por isso que se chama álgebra linear - a função de potência é não linear , não faz uma linha reta quando plotada.

Na estranha linha extra em matrizes 4D

Agora, por que a matriz no seu exemplo é 4 por 4? Isso não significa espaço 4-dimensional? Não temos computadores 4D, então por quê? Este é realmente um truque interessante com matrizes que se relaciona com o ponto anterior sobre operações lineares.

Em relação a quais funções não podem ser executadas com matrizes: Qual é a matriz para mover um ponto 2D por 2 unidades para a direita (que produz o ponto (x+2, y)? Mais uma vez, ficamos presos. Existe uma maneira de multiplicar a entrada, mas não há como adicionar Para o trabalho em 2D, o truque é fingir que você não está no espaço 2D, mas no espaço 3D, exceto a altura (coordenada z ou terceiro elemento) de tudo que é sempre 1 (é um pouco como um universo 2D é apenas uma "placa" caída no chão de um universo 3D - nesse caso, a terceira coordenada é sempre 0). Depois, você pode usar essa última coordenada mágica como uma constante, porque sabe que é sempre 1 para cada entrada.

Da mesma forma, para mover pontos 3D, você precisa de coordenadas 4D. É também por isso que todas as matrizes de transformação 3D que você vê terão [0 0 0 1]a última linha - você nunca deve alterar a quarta dimensão, ou o resultado será muito complicado para representar em 3D!

Superbest
fonte
Então, como você faz uma matriz para adição? digamos que uma linha é Xx Yx Zx Tx... e a última linha é na verdade 0t 0t 0t 1tsubstituída por Xt Yt Zt Tt. Para fazer (x+2, y)com que (x, y)você pudesse ir, 1x 0y 0z 2tisso daria 1*x + 0*y + 0*z + 2*1desde t=1certo? O que equivale a x + 2. Oh, querida, agora você pode estragar sua renderização com valores engraçados de T, não é? -grin- (longo ler, ainda melhor valor, thx)
n611x007
2

Essa é uma matriz principal da coluna 4x4 e, pelo que parece, uma matriz de visualização.

As três primeiras colunas definem a direção dos seus vetores de base (para cima, esquerda, frente como você os chamou) e a última coluna define a conversão do ponto do olho. Coloque-os juntos e poderá descrever a orientação de sua câmera e, mais importante, você pode usar essa matriz para transformar pontos em um espaço de coordenadas conhecido como "espaço para os olhos", "espaço para visualização" ou "espaço para câmera".

Todos esses são sinônimos para o mesmo espaço de coordenadas. Infelizmente, você precisa aprender todos os sinônimos ao lidar com gráficos de computador, porque livros e pessoas diferentes os chamam por nomes diferentes. A maioria dos espaços de coordenadas tem vários nomes.

A propósito, as três colunas em sua matriz de vista são geralmente ortogonais, ou seja, formam ângulos retos entre si. Isso não é necessário, mas é uma propriedade muito comum ao construir uma câmera tradicional.

Andon M. Coleman
fonte
1

Versão TL; DR:

Os três primeiros elementos [x y z]em cada linha representam um vetor de base única de um sistema de coordenadas transformadas. O último elemento wé um componente de tradução.

A versão longa

Se você quisesse uma matriz que, quando aplicada a um vértice, girasse o vértice sobre a origem em, digamos, 45 graus, você preencheria a matriz com três vetores representando os eixos transformados:

  • Um ponto ino xeixo [1 0 0], mas girado 45 graus. Isto é simplesmente [i_x i_y i_z], onde i_xe i_ysão as pernas de um triângulo com um de 45 graus interior ângulo em relação ao eixo X: [cos(45) sin(45) 0].
  • Um ponto jno eixo y [0 1 0], mas girado 45 graus a partir desse eixo. Faça um esboço em um pedaço de papel e você verá que, ao girar no sentido anti-horário, os componentes se tornam [-sin(45) cos(45) 0].
  • Um ponto kno zeixo. Neste exemplo, znão é afetado, pois estamos girando no plano xy (alinhado à tela)

Portanto, temos três novos vetores: i, j, k. A maneira mais fácil de visualizar isso é pegar os eixos X e Y e girar todo o arranjo transversal.

Como os colocamos em uma matriz?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

Ou

 cos(45)  sin(45)    0
-sin(45)  cos(45)    0
    0        0       1

Se você multiplicar qualquer vértice por essa matriz, receberá

v1_x = v_x cos(Θ)     - v_y sin(Θ) + v_z * 0
V1_y = v_x*sin(Θ)    + v_y cos(Θ) + v_Z * 0
V1_z = v_x * 0        + v_y * 0    + v_z * 1

para v = [1 0 0], e Θ = 90°isso se tornav1 = [0 1 0]

Para tradução, adicionamos uma quarta linha e coluna e colocamos os componentes de tradução na última coluna. Adicionamos um quarto componente ao vértice wque normalmente é 1. Isto é para que, quando multiplicamos o vértice pela matriz, o componente w faz com que a última coluna seja adicionada ao vértice de entrada, para que o vértice seja movido ou convertido. Chamamos essas "coordenadas homogêneas". (Para nossos propósitos, "homogêneo" significa apenas que existe um quarto componente wem cada vetor, e usamos uma matriz 4x4 em vez de um 3x3. Freqüentemente, você verá shaders que usam matrizes 4x3 para evitar o envio da quarta linha, principalmente inútil. para a GPU, que consome memória e largura de banda valiosas. A quarta linha é necessária para projeção em perspectiva, mas não muito mais.)

Espero que isto ajude.

3Dave
fonte
2
Naquele momento em que você percebe que acabou de responder uma pergunta já respondida de três anos atrás ...
3Dave
: Olhar P Sempre na data pergunta antes de responder ...
HolyBlackCat