Comencé a aprender OpenGL recientemente y tengo problemas para visualizar qué son las matrices y su papel en los gráficos por computadora. Dada la plantilla de una matriz 4x4 como esta:
Supongo que cada matriz como esta son las coordenadas de un vértice en el espacio mundial. ¿Y varios de ellos juntos y sombreados dan un objeto?
Pero, ¿por qué hay un Xx
, un Xy
y un Xz
? Leí que es un eje diferente (arriba, izquierda, adelante), pero aún no puede hacer cara o cruz de la importancia.
En gráficos de computadora, utilizamos matrices para codificar transformaciones .
Las matrices que contienen solo transformaciones de traslación, rotación o escalado tienen una interpretación comúnmente explotada: el 3x3 superior izquierdo de la matriz contiene solo datos de rotación o escala, la fila inferior o la columna derecha contiene datos de traducción. Esto no es una generalidad, pero es cierto a menudo suficiente para el subconjunto de transformaciones representadas en los gráficos de computadora que la gente hace uso de él.
Hay, de manera similar, una relación entre los valores de la matriz y el marco de coordenadas correspondiente que representa la matriz (que no siempre es "espacio mundial", debo señalar). Las columnas (o filas) 3x3 superiores izquierdas representan los ejes X, Y y Z del marco de coordenadas.
Que las filas representen o no ejes o que la columna lo haga depende de si está utilizando la convención de multiplicar como
row vector * matrix
omatrix * column vector
. Al realizar la multiplicación de matrices, las dimensiones internas de las dos matrices deben coincidir, por lo que si representa vectores como matrices de filas o matrices de columnas afecta esa elección (OpenGL y las matemáticas tradicionales tienden a preferir los vectores de columnas).Recomiendo obtener un buen libro sobre álgebra lineal, o al menos echar un vistazo a las preguntas frecuentes de Matrix y Quaternion y esta publicación sobre diseños de matriz en DirectX y OpenGL .
fuente
¿Qué es una matriz?
Una matriz con
m
columnas yn
filas representa una función que consume un vector * conm
elementos (o coordenadas) y produce un vector conn
elementos.A partir de esto, puede observar que si y solo si una matriz es cuadrada, la dimensionalidad del vector no cambiará. P.ej. obtienes un vector 3D al transformar un vector 3D, un 2D de un 2D, etc.
* : En física, los vectores se usan generalmente para indicar fuerzas u otras "influencias" que "se mueven" cosas como la velocidad o la aceleración. Pero no hay nada que le impida usar un vector para representar un punto o cualquier matriz arbitraria de números (algunas bibliotecas y lenguajes de programación incluso usan "vector" para significar "matriz 1D"). Para usar con matrices, cualquier cosa puede ser los elementos de su vector (incluso cadenas o colores), siempre que tenga una forma de sumarlos, restarlos y multiplicarlos por cualesquiera que sean los elementos de su matriz. De ahí el vector de nombre , que significa "portador": transporta o mantiene valores para usted.
¿Qué significa multiplicar por una matriz?
Entonces, si una matriz es una función, ¿qué tipo de función ? ¿Qué hace la función? La receta para ello está definida por los elementos de la matriz. Llamemos a la entrada
u
, a la salidav
, a la matrizM
(la multiplicaciónM*u=v
es entonces la misma quef(u)=v
) yu(i)
da eli
elemento th deu
(el segundo elemento es la coordenada y, por ejemplo). Para la matriz,M(i,j)
significa filai
, columnaj
.La construcción del elemento
v(1)
, la primera en el resultado, se describe en la primera fila de la matriz.u(1)
tiemposM(1,1)
, másu(2)
tiemposM(1,2)
, ... másu(i)
tiemposM(1,i)
. Una matriz es un poco como un lenguaje de programación muy simple, que solo es bueno para las funciones de programación que funcionan mezclando las entradas, agregándolas, etc. **Es útil imaginar que está trabajando en un elemento de salida a la vez, por lo tanto, está usando solo una fila de la matriz a la vez. Escribes
u
horizontalmente. Escribe la i-ésima fila deM
abajo. Multiplica cada par arriba / abajo y escribe los productos a continuación, luego suma los productos. Repita para cada fila para obtener cada elemento dev
. (Ahora puede ver por qué una matrizm
byn
debe operar en unm
vector y producir unn
vector).Otra forma de pensar sobre esto: digamos que estamos haciendo una transformación 3D a 3D, por lo que una matriz de 3x3 (o transformación 3D como se las llama a menudo porque puede pretender que esta "función" es "mover" puntos 3D, aunque en realidad es solo cambiando los números). Digamos que la primera fila es
[1 2 0]
. Esto significa que, para obtener x del resultado, obtenga 1 de la entrada x, 2 de la entrada y, y 0 de la entrada z. Entonces es realmente una receta.** : Si una matriz es un lenguaje de programación, entonces ni siquiera está completa.
¿Qué significa multiplicar dos matrices?
Si ambos son matrices de tamaño apropiado, a continuación,
A*B
significa "una función que se aplica primeroB
a continuaciónA
". Puede ver por qué existen restricciones en los tamaños para la multiplicación, porque el tamaño determina el tamaño de entrada y salida, y una matriz consume la salida de la otra. ¿Por qué la multiplicación significa combinar funciones? Es más fácil notar que tiene que ser así. SiA*u
es igual af(u)
yB*u
es igual ag(u)
entoncesf(g(u))
es igual af(B*u)
cual es igual aA*(B*u)
.Del mismo modo, las aplicaciones repetidas de la misma función pueden mostrarse como potencias, ya que
A*A*A
significa aplicar la función queA
representa tres veces.¿Cómo son útiles las matrices?
¿De qué sirve hacer una transformación
new_x = 1*x+2*y+0*z
(si la primera fila es [1 2 0])? Eso no es muy obvio, pero tomemos otra matriz 2D para explicar eso. La matriz es:O
[0 1; 1 0]
usando la conveniente notación de Matlab. ¿Qué hace esta matriz? Transforma un vector 2D así: para la x del resultado, tome 1 de la y de la entrada. Para la y del resultado, tome 1 de la x de la entrada. Acabamos de intercambiar las coordenadas x e y de la entrada; esta matriz refleja puntos sobre la línea x = y. Eso es algo útil! Por extensión, verá que todas las matrices con 1 a lo largo de la línea SW - NE se reflejan. También puede ver por qué las matrices de identidad le devuelven la entrada (para x de salida, tome x de entrada; para y de salida, tome y de entrada ...).Ahora puede ver por qué los símbolos son, por ejemplo.
Xx
,Yx
- que significan la cantidad de entradaX
,Y
etc. entra en la salidax
.¿De qué otra manera son útiles las matrices?
¿Qué otra transformación puedes hacer? Puede cambiar el tamaño tomando una matriz de identidad, pero con un número diferente a 1 a lo largo de la diagonal. Por ejemplo,
[2.5 0; 0 22.5]
multiplicará cada coordenada de la entrada por 2.5, y si aplica esta matriz a cada punto de una imagen, la imagen será 2.5 más grande. Si solo coloca un 2.5 en una fila ([2.5 0; 0 1]
), entonces solo se multiplicará la coordenada x, por lo que solo se extenderá a lo largo de x.Otras matrices pueden dar otras transformaciones, como "sesgo", que tienen diversos grados de utilidad. Personalmente, el sesgo es mi menos favorito porque la matriz parece muy simple, pero la transformación en sí rara vez hace algo más que destrozar una imagen. Una útil es la "rotación": ¿cómo se rota un punto? Intente calcular la posición del punto
(x, y)
después de rotar entheta
grados en sentido antihorario sobre el origen. Encontrará que las nuevas coordenadas x e y surgen de multiplicar las viejas x e y por algunos senos y cosenos de theta. Debería poder escribir fácilmente una matriz de rotación utilizando senos y cosenos que correspondan a esta función.Con matrices no cuadradas, también puede cambiar la dimensionalidad de una entrada. Convertir una entrada 2D en 3D no es muy útil, ya que es difícil "fabricar" algo para poner en la nueva coordenada, pero 3D en 2D es muy útil. Entre otras cosas, esta es la forma en que su equipo sabe proyectar *** una escena 3D imagen 2D en dibujar en el monitor.
Dado que los vectores pueden contener cosas diferentes, incluso podría describir una matriz que encripta una cadena de caracteres n a la vez, barajándolos o "multiplicándolos" (tendría que crear la función de multiplicación / suma).
*** : Cuando proyectas , tomas un objeto 3D como una escultura, le das una luz y ves qué tipo de sombra 2D cae en una pared.
¿Cuáles son las limitaciones de las matrices?
¿Puedes hacer todas las funciones con matrices? No. Pensando gráficamente, es difícil imaginar algo que una matriz no podría hacer (pero existe: un efecto de "remolino", por ejemplo). Sin embargo, aquí hay un ejemplo fácil: Digamos que la función
f
es tal quef(u)
te devuelveu
con cada elemento al cuadrado . Verá que no puede escribir una matriz para esto: con las matrices solo hay una facilidad para describir recetas que multiplican las coordenadas por un número constante, no se pueden expresar otras funciones sofisticadas como la potencia.**** : Esta es también la razón por la que se llama álgebra lineal : la función de potencia no es lineal , no forma una línea recta cuando se traza.
En la extraña fila extra en matrices 4D
Ahora, ¿por qué la matriz en su ejemplo es 4 por 4? ¿No significa esto un espacio de 4 dimensiones? No tenemos computadoras 4D, entonces ¿por qué? Esto es realmente un truco interesante con matrices que se relaciona con el punto anterior sobre operaciones lineales.
Con respecto a qué funciones no se pueden hacer con matrices: ¿Cuál es la matriz para mover un punto 2D en 2 unidades a la derecha (que produce el punto
(x+2, y)
? Nuevamente, nos quedamos atascados. Hay una manera de multiplicar la entrada, pero no hay manera de agregar una constante. Para el trabajo 2D, el truco es fingir que en realidad no estás en el espacio 2D, sino en el espacio 3D, excepto que la altura (coordenada z o tercer elemento) de todo es siempre 1 (es un poco como es un universo 2D solo una "placa" que se extiende sobre el piso de un universo 3D, en ese caso la tercera coordenada siempre es 0). Luego puede usar esta última coordenada mágica como una constante, porque sabe que siempre es 1 para cada entrada.Del mismo modo, para mover puntos 3D, necesita coordenadas 4D. Esa es también la razón por la cual todas las matrices de transformación 3D que verá tendrán
[0 0 0 1]
como última fila: nunca debe alterar la cuarta dimensión, ¡o el resultado será demasiado complicado para representarlo en 3D!fuente
Xx Yx Zx Tx
... y la última fila es en realidad0t 0t 0t 1t
como sustituida porXt Yt Zt Tt
. Hacer(x+2, y)
de(x, y)
ti podría ir1x 0y 0z 2t
que te daría1*x + 0*y + 0*z + 2*1
desde entoncest=1
¿verdad? Lo que equivale a x + 2. Oh querida, ahora puedes arruinar tu renderizado con divertidos valores T, ¿no? -grin- (lectura larga, aún mejor valor, thx)Esa es una matriz de columna mayor de 4x4, y por lo que parece, una matriz de vista.
Las primeras 3 columnas definen la dirección de sus vectores base (arriba, izquierda, adelante como los llamó), y la última columna define la traducción del punto del ojo. Póngalos juntos y puede describir la orientación de su cámara, y lo más importante, puede usar esta matriz para transformar puntos en un espacio de coordenadas conocido como "espacio ocular", "espacio visual" o "espacio cámara".
Esos son todos sinónimos para el mismo espacio de coordenadas. Desafortunadamente, debes aprender todos los sinónimos cuando trabajas con gráficos de computadora porque diferentes libros y personas los llamarán con diferentes nombres. La mayoría de los espacios de coordenadas tienen múltiples nombres.
Por cierto, las tres columnas en su matriz de vista son generalmente ortogonales, es decir, forman ángulos rectos entre sí. Esto no es obligatorio, pero es una propiedad muy común al construir una cámara tradicional.
fuente
TL; versión DR:
Los primeros tres elementos
[x y z]
en cada fila representan un vector base único de un sistema de coordenadas transformado. El último elementow
es un componente de traducción.La versión larga
Si desea una matriz que, cuando se aplica a un vértice, rotaría el vértice sobre el origen, por ejemplo, 45 grados, llenaría la matriz con tres vectores que representan los ejes transformados:
i
en elx
eje[1 0 0]
, pero girado 45 grados. Esto es simplemente[i_x i_y i_z]
, dondei_x
yi_y
son los catetos de un triángulo con un ángulo interior de 45 grados con respecto al eje X:[cos(45) sin(45) 0]
.j
en el eje y[0 1 0]
, pero girado 45 grados desde ese eje. Dibuje en un pedazo de papel y verá que, al girar en sentido antihorario, los componentes se convierten[-sin(45) cos(45) 0]
.k
en elz
eje. En este ejemplo,z
no se ve afectado ya que estamos girando en el plano xy (alineado con la pantalla)Entonces, tenemos tres nuevos vectores: i, j, k. La manera fácil de visualizar esto es simplemente tomando los ejes X e Y y girando la disposición cruzada completa.
¿Cómo los ponemos en una matriz?
O
Si multiplicas cualquier vértice por esa matriz, obtendrás
para
v = [1 0 0]
, yΘ = 90°
, esto se conviertev1 = [0 1 0]
Para la traducción, agregamos una cuarta fila y columna, y colocamos los componentes de traducción en la última columna. Agregamos un cuarto componente al vértice
w
que generalmente es1
. Esto es así, cuando multiplicamos el vértice por la matriz, el componente w hace que la última columna se agregue al vértice de entrada, por lo que el vértice se mueve o traduce. Llamamos a estas "coordenadas homogéneas". (Para nuestros propósitos, "homogéneo" solo significa que hay un 4to componentew
en cada vector, y usamos una matriz 4x4 en lugar de un 3x3. Con frecuencia verá sombreadores que usan matrices 4x3 para evitar enviar la 4ta fila en su mayoría inútil a la GPU, que consume memoria y ancho de banda valiosos. La cuarta fila es necesaria para la proyección en perspectiva, pero no mucho más).Espero que esto ayude.
fuente