2010-03-17 13 views
17

Estoy comenzando a aprender sobre la representación 3D y he estado progresando bastante. He recogido mucho sobre las matrices y las operaciones generales que se pueden realizar en ellas.Comprensión de OpenGL Matrices

Una cosa que aún no estoy siguiendo es el uso de matrices por parte de OpenGL. Veo esto (y cosas así) mucho:

x y z n 
------- 
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

Así que mi mejor entendimiento, es que es un normalizado (sin magnitud) 4, matriz de la columna-principal dimensiones. También que esta matriz en particular se llama la "matriz de identidad".

Algunas preguntas:

  • Cuál es la dimensión "enésimo"?
  • ¿Cómo y cuándo se aplican?

Mi mayor confusión surge de cómo OpenGL hace uso de este tipo de datos.

+0

Consulte el libro "Matemáticas esenciales para juegos y aplicaciones interactivas" . –

+2

Un vector normalizado no es "sin magnitud". Los vectores normalizados tienen una longitud/magnitud de 1. – alesplin

+0

¡Gracias! Creo que me dejé llevar por la comprensión. Al menos yo estaba en el camino correcto. ;) –

Respuesta

3

La respuesta corta que podría ayudarlo a comenzar es que la dimensión 'enésima', como la llama, no representa ninguna cantidad visualizable. Se agrega como una herramienta práctica para permitir multiplicaciones de matrices que causan la traducción y la proyección de perspectiva. Una matriz 3x3 intuitiva 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) obtiene 0 anexado en el cuarto punto.

59

En la mayoría de gráficos 3D, un punto se representa mediante un vector de 4 componentes (x, y, z, w), donde w = 1. Las operaciones habituales aplicadas en un punto incluyen traslación, escala, rotación, reflexión, sesgo y combinación de estos.

Estas transformaciones se pueden representar mediante un objeto matemático llamado "matriz". Una matriz se aplica en un vector de la siguiente manera:

[ 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 para el cuarto componente es hacer una traducción representable por 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 llevar la traducción a la mesa, entonces diría (x, y, z, 1) en lugar de (x, y, z, w) y haré la última fila del matriz siempre [0 0 0 1], como se hace generalmente para gráficos 2D. De hecho, el vector 4-componente se asigna de nuevo al vector normal 3-vector a través de esta fórmula:

[ x(3D) ] [ x/w ] 
| y(3D) ] = | y/w | 
[ z(3D) ] [ z/w ] 

Esto se llama homogeneous coordinates. Permitir esto hace que la proyección de perspectiva expresable con una matriz también, que se puede combinar con todas las demás transformaciones.

Por ejemplo, ya que los objetos más alejados deben ser más pequeñas 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 bien, si aplicamos la matriz de proyección

[ 1 . . . ] [ x ] [ x ] 
| . 1 . . | | y | = | y | 
| . . 1 . | | z | | z | 
[ . . 10 . ] [ 1 ] [ 10*z ] 

entonces la verdadera Las coordenadas 3D 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 z -coordinar para proyectar a 2D.

+2

Desearía poder entender sus ejemplos, pero realmente no los estoy obteniendo. Me disculpo. –

+1

@ Omega Esta sección del OpenGL Red Book podría ayudar http://www.glprogramming.com/red/appendixf.html#name1 – Swiss

+0

@Omega Quizás los conceptos básicos sean útiles también [http://en.wikipedia.org/wiki/Matrix_multiplication]. – Luca