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:
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 Xy
e 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.
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 * matrix
oumatrix * 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 .
fonte
O que é uma matriz?
Uma matriz com
m
colunas en
linhas representa uma função que consome um vetor * comm
elementos (ou coordenadas) e produz um vetor comn
elementos.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ídav
, a matrizM
(a multiplicaçãoM*u=v
é a mesma quef(u)=v
) eu(i)
fornecer oi
th elemento deu
(o segundo elemento é a coordenada y, por exemplo). Para a matriz,M(i,j)
significa linhai
, colunaj
.A construção do elemento
v(1)
, a primeira no resultado, é descrita pela primeira linha da matriz.u(1)
vezesM(1,1)
, maisu(2)
vezesM(1,2)
, ... maisu(i)
vezesM(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
u
horizontalmente. Você escreve a i-ésima linhaM
abaixo 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 dev
. (Agora você vê por que uma matrizm
byn
deve operar em umm
vetor e produzir umn
vetor.)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*B
significa "uma função que se aplica primeiro eB
depoisA
". 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. SeA*u
é o mesmo quef(u)
eB*u
é o mesmo queg(u)
entãof(g(u))
é o mesmof(B*u)
que é o mesmo queA*(B*u)
.Da mesma forma, aplicações repetidas da mesma função podem ser mostradas como potências, pois
A*A*A
significa aplicar a função queA
representa 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 é: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 entradaX
,Y
etc. entra em produçãox
.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 emtheta
graus 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
f
seja tal quef(u)
o devolvau
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!fonte
Xx Yx Zx Tx
... e a última linha é na verdade0t 0t 0t 1t
substituída porXt Yt Zt Tt
. Para fazer(x+2, y)
com que(x, y)
você pudesse ir,1x 0y 0z 2t
isso daria1*x + 0*y + 0*z + 2*1
desdet=1
certo? 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)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.
fonte
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 elementow
é 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:
i
nox
eixo[1 0 0]
, mas girado 45 graus. Isto é simplesmente[i_x i_y i_z]
, ondei_x
ei_y
sã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]
.j
no 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]
.k
noz
eixo. Neste exemplo,z
nã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?
Ou
Se você multiplicar qualquer vértice por essa matriz, receberá
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
w
que 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 componentew
em 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.
fonte