2009-03-10 9 views
116

Soy nuevo en OpenGL y estoy un poco abrumado con todas las funciones aleatorias que tengo en mi código. Funcionan y sé cuándo usarlos, pero no sé por qué los necesito o lo que realmente hacen.¿Qué hace glLoadIdentity() en OpenGL?

Sé que glLoadIdentity() reemplaza la matriz actual con la matriz de identidad, pero ¿qué hace exactamente eso? Si cada programa lo requiere, ¿por qué no es la matriz de identidad por defecto a menos que se especifique lo contrario? No me gusta tener funciones en mi código a menos que sepa lo que hacen. Debo señalar que estoy usando OpenGL exclusivamente para clientes ricos en 2D, así que disculpe mi ignorancia si esto es algo muy obvio para 3D.

También un poco confundido acerca de glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW).

Respuesta

125

La matriz de identidad, en términos de las matrices de proyección y vista modelo, restablece esencialmente la matriz a su estado predeterminado.

Como es de esperarse, glTranslate y glRotate son siempre relativos al estado actual de la matriz. Entonces, por ejemplo, si llama al glTranslate, está traduciendo desde la "posición" actual de la matriz, no desde el origen. Pero si desea volver a empezar en el origen, es cuando llama al glLoadIdentity(), y luego puede glTranslate desde la matriz que ahora se encuentra en el origen, o glRotate desde la matriz que ahora está orientada en la dirección predeterminada.

Creo que la respuesta de Boon, que es el equivalente a 1, no es exactamente correcta. La matriz se ve así:

1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

Esa es la matriz de identidad. Boon es correcto, matemáticamente, que cualquier matriz multiplicada con esa matriz (o una matriz que se parece a eso, diagonales, todos los demás 0) dará como resultado la matriz original, pero no creo que haya explicado por qué esto es importante.

La razón por la que esto es importante es porque OpenGL multiplica todas las posiciones y rotaciones a través de cada matriz; entonces cuando, por ejemplo, dibuja un polígono (glBegin(GL_FACE), algunos puntos, glEnd()), lo traduce como "espacio mundial" multiplicándolo por MODELVIEW, y luego lo traduce de 3D a 2D multiplicándolo con la matriz PROJECT, y eso le da los puntos 2D en la pantalla, junto con la profundidad (desde la pantalla 'cámara'), que utiliza para dibujar píxeles. Pero cuando una de estas matrices es la matriz de identidad, los puntos se multiplican con la matriz de identidad y, por lo tanto, no se modifican, por lo que la matriz no tiene efecto; no traduce los puntos, no los rota, los deja tal como están.

¡Espero que esto aclare un poco más!

+0

Ejemplo claro conmigo :) – hqt

+1

Eso significa, OpenGL mantiene un 'Maestro' o matriz 'global', y, cada matriz subsiguiente se aplica en relación a la 'Maestro' o Matriz 'Global'. ¿Estoy en lo cierto? – anonymous

38

La matriz de identidad es el equivalente a 1 para el número. Como usted sabe, cualquier número que se multiplique por 1 es en sí mismo (e.g. A x 1 = A),

Lo mismo ocurre con la matriz (MatrixA x IdentityMatrix = MatrixA).

Por lo tanto, cargar una matriz de identidad es una forma de inicializar su matriz al estado correcto antes de multiplicar otras matrices en la pila de la matriz.

glMatrixMode(GL_PROJECTION): trata de las matrices utilizadas por transformación de perspectiva o transformación ortogonal.

glMatrixMode(GL_MODELVIEW): se ocupa de las matrices utilizadas por la transformación de model-view. Es decir, para transformar su objeto (modelo aka) al espacio de coordenadas de la vista (o espacio de la cámara).

2

La matriz de identidad se utiliza para "inicializar" una matriz a un valor predeterminado de sana.

Una cosa importante es darse cuenta de que las multiplicaciones de matrices son, en cierto sentido, aditivas. Por ejemplo, si tomas una matriz que comienza con la matriz de identidad, la multiplicas por una matriz de rotación y luego la multiplicas por una matriz de escala, terminas con una matriz que rota y escala las matrices contra las que se multiplica.

5

La matriz de proyección se utiliza para crear su volumen de visualización. Imagina una escena en el mundo real. Realmente no ves todo a tu alrededor, solo lo que tus ojos te permiten ver. Si eres un pez, por ejemplo, ves las cosas un poco más. Entonces, cuando decimos que configuramos la matriz de proyección, queremos decir que configuramos lo que queremos ver en la escena que creamos. Quiero decir que puedes dibujar objetos en cualquier parte de tu mundo. Si no están dentro del volumen de la vista, no verás nada. Cuando crea el volumen de vista imagínese que crea 6 planos de recorte que definen su campo de visión.

En cuanto a la matriz modelview, se utiliza para hacer varias transformaciones a los modelos (objetos) en su mundo. De esta manera solo tienes que definir tu objeto una vez y luego traducirlo o rotarlo o escalarlo.

Utilizaría la matriz de proyección antes de dibujar los objetos en su escena para establecer el volumen de la vista. Luego dibuja tu objeto y cambia la matriz de la vista modelo en consecuencia. Por supuesto, puede cambiar su matriz a mitad de dibujar sus modelos si, por ejemplo, desea dibujar una escena y luego dibujar algo de texto (que con algunos métodos puede trabajar más fácilmente en proyección ortográfica) y luego volver a la matriz de vista modelo.

En cuanto al nombre modelview, tiene que ver con la dualidad de las transformaciones de modelado y visualización. Si dibujas la cámara 5 unidades hacia atrás, o mueves el objeto 5 unidades hacia adelante, es esencialmente la misma.

Esperanza He arrojado algo de luz