cubo - opengl ejemplos c++
Entendiendo las matrices de OpenGL (2)
Estoy empezando a aprender sobre renderización 3D y he estado progresando bien. He recogido mucho sobre matrices y las operaciones generales que se pueden realizar en ellas.
Una cosa que todavía no estoy siguiendo es el uso de matrices por parte de OpenGL. Veo esto (y cosas que me gustan) bastante:
x y z n
-------
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
Por lo tanto, mi mejor entendimiento es que es una matriz tridimensional, mayor de columnas, normalizada (sin magnitud). También que esta matriz en particular se llama la "matriz de identidad".
Algunas preguntas:
- ¿Cuál es la dimensión "nth"?
- ¿Cómo y cuándo se aplican?
Mi mayor confusión surge de cómo OpenGL hace uso de este tipo de datos.
En la mayoría de los gráficos 3D, un punto está representado por un vector de 4 componentes (x, y, z, w), donde w = 1. Las operaciones usuales aplicadas en un punto incluyen traducción, escalado, rotación, reflexión, sesgo y combinación de estos.
Estas transformaciones pueden ser representadas por un objeto matemático llamado "matriz". Una matriz se aplica en un vector como este:
[ a b c tx ] [ x ] [ a*x + b*y + c*z + tx*w ]
| d e f ty | | y | = | d*x + e*y + f*z + ty*w |
| g h i tz | | z | | g*x + h*y + i*z + tz*w |
[ p q r s ] [ w ] [ p*x + q*y + r*z + s*w ]
Por ejemplo, la escala se representa como
[ 2 . . . ] [ x ] [ 2x ]
| . 2 . . | | y | = | 2y |
| . . 2 . | | z | | 2z |
[ . . . 1 ] [ 1 ] [ 1 ]
y la traducción como
[ 1 . . dx ] [ x ] [ x + dx ]
| . 1 . dy | | y | = | y + dy |
| . . 1 dz | | z | | z + dz |
[ . . . 1 ] [ 1 ] [ 1 ]
Una de las razones del cuarto componente es hacer que una traducción se pueda representar mediante una matriz.
La ventaja de utilizar una matriz es que se pueden combinar múltiples transformaciones en una a través de la multiplicación de matrices.
Ahora, si el propósito es simplemente traer la traducción a la tabla, entonces diría (x, y, z, 1) en lugar de (x, y, z, w) y hago la última fila de la matriz siempre [0 0 0 1]
, como se hace generalmente para gráficos 2D. De hecho, el vector de 4 componentes se asignará nuevamente al vector normal de 3 vectores mediante esta fórmula:
[ x(3D) ] [ x / w ]
| y(3D) ] = | y / w |
[ z(3D) ] [ z / w ]
Esto se llama coordenadas homogéneas . Permitir esto hace que la proyección en perspectiva se pueda expresar también con una matriz, que de nuevo se puede combinar con todas las otras transformaciones.
Por ejemplo, dado que los objetos más alejados deben ser más pequeños en la pantalla, transformamos las coordenadas 3D en 2D utilizando la fórmula
x(2D) = x(3D) / (10 * z(3D))
y(2D) = y(3D) / (10 * z(3D))
Ahora si aplicamos la matriz de proyección.
[ 1 . . . ] [ x ] [ x ]
| . 1 . . | | y | = | y |
| . . 1 . | | z | | z |
[ . . 10 . ] [ 1 ] [ 10*z ]
entonces las coordenadas 3D reales se convertirían en
x(3D) := x/w = x/10z
y(3D) := y/w = y/10z
z(3D) := z/w = 0.1
así que solo tenemos que cortar la coordenada z para proyectar en 2D.
La respuesta corta que podría ayudarlo a comenzar es que la dimensión "n", como la llama, no representa ninguna cantidad visualizable. Se agrega como una herramienta práctica para habilitar las multiplicaciones de matrices que causan la traducción y la proyección en perspectiva. Una matriz intuitiva de 3x3 no puede hacer esas cosas.
Un valor 3d que representa un punto en el espacio siempre se agrega 1 como el cuarto valor para hacer que este truco funcione. Un valor 3d que representa una dirección (es decir, una normal, si está familiarizado con ese término) se agrega 0 en el cuarto lugar.