2011-05-06 41 views

Respuesta

24

Primero, algunos antecedentes. En los gráficos 3D, es necesario preocuparse por varios espacios vectoriales:

  • espacio modelo - por lo general son las coordenadas que especifique a OpenGL
  • espacio Mundial - coordenadas se especifican con respecto a algún punto central en el mundo.
  • Espacio de visualización: las coordenadas se especifican con respecto a la cámara
  • Espacio de proyección: todo en la pantalla se ajusta en el intervalo [-1, +1] en cada dimensión.

Las coordenadas se especifican de forma homogénea, por lo que cada vector tiene los componentes (x, y, z, w), donde w es un factor de escala. Puede obtener coordenadas en 3 espacios como (x/w, y/w, z/w). El factor de escala es necesario para ciertas transformaciones como la proyección en perspectiva que no sería posible con coordenadas no homogéneas.

Las matrices 4x4 son necesarias para transformar las coordenadas de un espacio vectorial a otro. Usted podría tener tres matrices diferentes:

  • matriz de modelo (modelo de mundo)
  • Ver matriz (mundo para ver)
  • matriz de proyección (vista al espacio de proyección)

Se podría proyectar una coordenada C en la pantalla usando la fórmula:

C' = P * V * M * C 

OpenGL pasante ally mantiene dos matrices: modelview (modelo y vista multiplicados juntos) y proyección. También hay una matriz de textura de la que no nos preocuparemos. Cuando llamas al glMatrixMode, estás cambiando entre estas matrices. Reemplace la matriz actual con la matriz de identidad usando glLoadIdentity. Aplica transformaciones a la matriz actual con funciones como glTranslatef, glRotatef o gluProjection. Cada una de estas funciones solo crea una matriz de 4x4 implementa la transformación específica, luego multiplica la matriz actual por ella. Puede ver cuáles son las matrices de transformación en el OpenGL 2.1 reference pages.


Ahora para la respuesta real. Necesita mantener una matriz de modelo 4x4 para cada objeto en su escena. La matriz del modelo contendrá todas las transformaciones necesarias para cambiar las coordenadas del modelo en coordenadas mundiales.Por ejemplo, cada vez que llame glTranslate, que actualizaría su matriz de modelo:

T = [ 1 0 0 x ] 
    [ 0 1 0 y ] 
    [ 0 0 1 z ] 
    [ 0 0 0 1 ] 
M' = M * T 

continuación, puede utilizar su matriz de modelo para obtener las coordenadas en el espacio mundial (asegurarse de que son coordenadas homogéneas primera; acaba de establecer w = 1, si no lo son):

V' = V * M 

Puesto que usted está manteniendo estas transformaciones en paralelo, no se necesita realmente para mantener la matriz modelview OpenGL más. Puede pasar su matriz modelo como uniforme a sus sombreadores. Puede mantener su propia vista y matrices de proyección de manera similar. Esto es requerido en versiones recientes de OpenGL; todas las funciones de manejo de matriz están en desuso.

+1

¿Cómo mantengo mi propia matriz de modelos? –

+0

@Shazad, agregó información de fondo y una explicación más detallada. Espero que ayude. –

+0

@Jay: Primero dijiste 'C '= P * V * M * C', sin embargo, cerca del final dices que' V' = M * V'. Estoy un poco confundido, ya que una vez es 'V * M' y una vez' M * V'. La multiplicación de la matriz no es conmutativa, entonces 'A * B! = B * A'. ¿Podría ser que cualquier orden es incorrecta en tu respuesta? Tal vez también es mi matemática equivocada, sin embargo, en ese caso no dude en corregirme. – Mecki

4

Usted puede utilizar el producto de la inversa de la matriz de vista de la cámara virtual (V -1) veces el modelview Matrix (V * H) del objeto de obtener coordenadas mundo.

Se obtiene V justo después de la función gluLookAt() usando:

glGetFloatv (GL_MODELVIEW_MATRIX, camViewMatrix)

luego invertir la matriz y almacenarla, (utilizados para multiplicar más adelante en el código.)

usted consigue V * M en el punto en que está a punto para dibujar el objeto, justo después de todo el glTranslatef(), glRotatef() y glScale() comandos usando la misma función GL:

glGetFloatv (GL_MODELVIEW_MATRIX, objectsModelVie wMatrix);

V-1 * (V * M) == M

Entonces múltiple las dos matrices, lo que resulta matriz contiene la posición, M12 = x, m13 = y y m14 = z

más detalles con el código C en: https://sourceforge.net/p/openantz/wiki/Local_to_World_Coordinates/

Cuestiones relacionadas