¿Qué representa una matriz?

19

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:

ingrese la descripción de la imagen aquí

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 Xyy un Xz? Leí que es un eje diferente (arriba, izquierda, adelante), pero aún no puede hacer cara o cruz de la importancia.

Sad CRUD Developer
fuente

Respuestas:

19

Las matrices en gráficos de computadora son las transformaciones dadas a cada coordenada en el modelo. Cada matriz es una combinación de múltiples transformaciones para aplicar a una coordenada (un punto en 3 espacios).

La construcción de una transformación se basa en uno de los tres tipos de transformación: Traducir, Rotar y Escalar.

Una matriz de traducción es algo así como:

Una matriz de traducción

Y una matriz de escala: Matriz de escala

Las matrices de rotación se ven así:

ingrese la descripción de la imagen aquí

Para combinar cualquiera de estas matrices, simplemente multiplíquelas. Para aplicar la transformación a un vértice, simplemente multiplique al vértice (como se ve en el diagrama de traducción).

Alex Shepard
fuente
44
O para que las matrices no representen puntos. Estoy avergonzado ahora
Desarrollador Sad CRUD
Muchas veces se aplican a un objeto o a la ventana gráfica como un todo (así es como obtienes tus vistas ortho vs perspectiva)
Alex Shepard
3
@BDillan: No, pero ciertamente pueden contener puntos. La última columna en una matriz ModelView (GL / column-major), por ejemplo, define cómo se traduce el origen. O para decirlo de otra manera, define dónde se encuentra el ojo en el espacio-mundo y, literalmente, puede usarse como un punto por sí mismo.
Andon M. Coleman
tu coordinas una tupla de 3. ¿Por qué la matriz no es 3 por 3? Supongamos que para poder combinar los tres tipos de transformación en una sola matriz y aún tener suficiente espacio, ¿qué está haciendo, entonces, en la esquina inferior derecha, parece que siempre es 1?
n611x007
La cuarta fila / columna está específicamente allí para las traducciones. Una de las mejores características de las matemáticas de matriz es que puedo combinar todas las traducciones y rotaciones que quiero lograr en una sola matriz. Esto significa que se pueden comprimir conjuntos muy complejos de transformaciones (teóricamente infinitos) a 1 matriz. Sí, esa última celda sigue siendo 1, pero nos permite hacer el resto de las matemáticas.
Alex Shepard
10

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 * matrixo matrix * 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 .

wjl
fuente
tengo toneladas de libros "buenos" sobre álgebra lineal, algunos de los cuales incluso he leído y comprendido. Lo que pasa es que no ayuda un poco, no es que los tenga ni que lo haya entendido. Tengo la sensación de que su último consejo es responder a la suposición equivocada.
n611x007
9

¿Qué es una matriz?

Una matriz con mcolumnas y nfilas representa una función que consume un vector * con melementos (o coordenadas) y produce un vector con nelementos.

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 salida v, a la matriz M(la multiplicación M*u=ves entonces la misma que f(u)=v) y u(i)da el ielemento th de u(el segundo elemento es la coordenada y, por ejemplo). Para la matriz, M(i,j)significa fila i, columna j.

La construcción del elemento v(1), la primera en el resultado, se describe en la primera fila de la matriz. u(1)tiempos M(1,1), más u(2)tiempos M(1,2), ... más u(i)tiempos M(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 uhorizontalmente. Escribe la i-ésima fila de Mabajo. Multiplica cada par arriba / abajo y escribe los productos a continuación, luego suma los productos. Repita para cada fila para obtener cada elemento de v. (Ahora puede ver por qué una matriz mby ndebe operar en un mvector y producir un nvector).

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*Bsignifica "una función que se aplica primero Ba continuación A". 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í. Si A*ues igual a f(u)y B*ues igual a g(u)entonces f(g(u))es igual a f(B*u)cual es igual a A*(B*u).

Del mismo modo, las aplicaciones repetidas de la misma función pueden mostrarse como potencias, ya que A*A*Asignifica aplicar la función que Arepresenta 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:

[ 0 1
  1 0 ]

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 entrada X, Yetc. entra en la salida x.

¿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 en thetagrados 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 fes tal que f(u)te devuelve u 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!

Superbest
fuente
Entonces, ¿cómo se hace una matriz para sumar? digamos que una fila es Xx Yx Zx Tx... y la última fila es en realidad 0t 0t 0t 1tcomo sustituida por Xt Yt Zt Tt. Hacer (x+2, y)de (x, y)ti podría ir 1x 0y 0z 2tque te daría 1*x + 0*y + 0*z + 2*1desde entonces t=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)
n611x007
2

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.

Andon M. Coleman
fuente
1

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 elemento wes 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:

  • Un punto ien el xeje [1 0 0], pero girado 45 grados. Esto es simplemente [i_x i_y i_z], donde i_xy i_yson los catetos de un triángulo con un ángulo interior de 45 grados con respecto al eje X: [cos(45) sin(45) 0].
  • Un punto jen 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].
  • Un punto ken el zeje. En este ejemplo, zno 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?

i_x i_y i_z
j_x j_y j_z
k_x k_y k_z

O

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

Si multiplicas cualquier vértice por esa matriz, obtendrás

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], 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 wque generalmente es 1. 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 componente wen 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.

3Dave
fuente
2
Ese momento en que te das cuenta de que has acaba de responder una pregunta contestada ya, desde hace tres años ...
3Dave
: P Siempre mira la fecha de la pregunta antes de responder ...
HolyBlackCat