¿Qué hace glLoadIdentity () en OpenGL?


132

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 qué hacen realmente.

Sé que glLoadIdentity()reemplaza la matriz actual con la matriz de identidad, pero ¿qué hace exactamente eso? Si todos los programas lo requieren, ¿por qué no está 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 2D ricos, 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).

Respuestas:


139

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

Como es de esperar, glTranslatey glRotatesiempre son relativos al estado actual de la matriz. Entonces, por ejemplo, si llama glTranslate, está traduciendo desde la 'posición' actual de la matriz, no desde el origen. Pero si desea comenzar de nuevo en el origen, es cuando llama glLoadIdentity(), y luego puede hacerlo glTranslatedesde la matriz que ahora se encuentra en el origen, o glRotatedesde 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 en realidad 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 ceros) dará como resultado la matriz original, pero no creo que haya explicado por qué esto es importante.

La razón por la cual esto es importante es porque OpenGL multiplica todas las posiciones y rotaciones a través de cada matriz; entonces, por ejemplo, cuando dibuja un polígono ( glBegin(GL_FACE), algunos puntos, glEnd()), lo traduce al "espacio mundial" multiplicándolo con MODELVIEW, y luego lo traduce de 3D a 2D multiplicándolo con la matriz PROYECTO, y eso le da los puntos 2D en la pantalla, junto con la profundidad (de la 'cámara' de la pantalla), 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 cambian, por lo que la matriz no tiene efecto; no traduce los puntos, no los gira, los deja como están.

¡Espero que esto se aclare un poco más!


1
Eso significa que OpenGL mantiene una matriz 'Maestra' o 'Global' y cada matriz subsiguiente se aplica en relación con esa matriz 'Maestra' o 'Global'. Estoy en lo cierto?
user366312

41

La matriz de identidad es el equivalente de 1 para el número. Como sabes, 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 más matrices en la pila de matrices.

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

glMatrixMode(GL_MODELVIEW): trata con matrices utilizadas por la transformación de vista de modelo. Es decir, transformar su objeto (también conocido como modelo) en el espacio de coordenadas de la vista (o espacio de la cámara).


6

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 amplias. Entonces, cuando decimos que configuramos la matriz de proyección, queremos decir que configuramos lo que queremos ver de 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á nada. Cuando cree el volumen de la vista, imagine que crea 6 planos de recorte que definen su campo de visión.

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

Usaría la matriz de proyección antes de dibujar los objetos en su escena para establecer el volumen de la vista. Luego dibuja su objeto y cambia la matriz de vista de modelo en consecuencia. Por supuesto, puede cambiar su matriz a mitad del dibujo de 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 la proyección ortográfica) y luego volver a la matriz de vista de modelo.

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

Espero haber arrojado algo de luz


2

La matriz de identidad se usa para "inicializar" una matriz a un valor predeterminado sensato.

Una cosa importante a tener en cuenta es que las multiplicaciones matriciales son, en cierto sentido, aditivas. Por ejemplo, si toma una matriz que comienza con la matriz de identidad, multiplíquela por una matriz de rotación, luego multiplíquela por una matriz de escala, terminará con una matriz que gira y escala las matrices contra las que se multiplica.


0

Solo para recapitular lo que otros han dicho, la matriz de identidad es una matriz que es tal que cuando multiplicas un vector / matriz con ella, el resultado es ese mismo vector / matriz. Es el equivalente del número 1 con multiplicación o el número 0 con suma.

glLoadIdentity () es una función obsoleta, y se le recomienda que administre sus propias matrices.


-1

glLoadIdentity() La función garantiza que cada vez que ingresemos al modo de proyección, la matriz se restablecerá a la matriz de identidad, de modo que los nuevos parámetros de visualización no se combinen con el anterior.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.