O que glLoadIdentity () faz no OpenGL?


132

Eu sou novo no OpenGL e estou um pouco sobrecarregado com todas as funções aleatórias que tenho no meu código. Eles funcionam e eu sei quando usá-los, mas não sei por que preciso deles ou o que eles realmente fazem.

Eu sei que glLoadIdentity()substitui a matriz atual pela matriz de identidade, mas o que exatamente isso faz? Se todo programa exige, por que a matriz de identidade não é por padrão, a menos que especificado de outra forma? Não gosto de ter funções no meu código, a menos que saiba o que elas fazem. Devo observar que estou usando o OpenGL exclusivamente para clientes 2D ricos, então desculpe minha ignorância se isso é algo muito óbvio para o 3D.

Também um pouco confuso sobre glMatrixMode(GL_PROJECTION)VS glMatrixMode(GL_MODELVIEW).

Respostas:


139

A matriz de identidade, em termos das matrizes de projeção e modelview, redefine essencialmente a matriz de volta ao seu estado padrão.

Como você provavelmente sabe, glTranslatee glRotatesempre são relativos ao estado atual da matriz. Por exemplo, se você ligar glTranslate, estará traduzindo da posição atual da matriz, não da origem. Mas se você deseja começar de novo na origem, é quando você chama glLoadIdentity()e pode glTranslatepartir da matriz que agora está localizada na origem ou glRotateda matriz que agora está orientada na direção padrão.

Eu acho que a resposta de Boon, que é o equivalente a 1, não está exatamente correta. A matriz fica assim:

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

Essa é a matriz de identidade. Boon está correto, matematicamente, que qualquer matriz multiplicada por essa matriz (ou uma matriz que se parece com isso; diagonais, todos os outros 0s) resultará na matriz original, mas não acredito que ele tenha explicado por que isso é importante.

A razão pela qual isso é importante é porque o OpenGL multiplica todas as posições e rotações por cada matriz; portanto, quando, por exemplo, você desenha um polígono ( glBegin(GL_FACE), alguns pontos glEnd()), ele o converte em "espaço do mundo", multiplicando-o com o MODELVIEW, e depois converte-o de 3D para 2D, multiplicando-o pela matriz PROJECT, e isso fornece os pontos 2D na tela, juntamente com a profundidade (na tela 'câmera'), que ela usa para desenhar pixels. Mas quando uma dessas matrizes é a matriz de identidade, os pontos são multiplicados pela matriz de identidade e, portanto, não são alterados; portanto, a matriz não tem efeito; não traduz os pontos, não os gira, os deixa como estão.

Espero que isso esclareça um pouco mais!


1
Isso significa que o OpenGL mantém uma matriz 'Mestre' ou 'Global' e, cada matriz subsequente é aplicada em relação a essa matriz 'Mestre' ou 'Global'. Estou certo?
user366312

41

Matriz de identidade é o equivalente a 1 para número. Como você sabe que qualquer número que multiplica por 1 é ele próprio (e.g. A x 1 = A),

O mesmo vale para a matriz ( MatrixA x IdentityMatrix = MatrixA).

Portanto, carregar uma matriz de identidade é uma maneira de inicializar sua matriz no estado correto antes de multiplicar mais matrizes na pilha de matrizes.

glMatrixMode(GL_PROJECTION) : lida com as matrizes usadas por transformação de perspectiva ou transformação ortogonal.

glMatrixMode(GL_MODELVIEW): lida com matrizes usadas pela transformação de visualização de modelo. Ou seja, para transformar seu objeto (também conhecido como modelo) no espaço de coordenadas da vista (ou no espaço da câmera).


6

A matriz de projeção é usada para criar seu volume de visualização. Imagine uma cena no mundo real. Você realmente não vê tudo ao seu redor, apenas o que seus olhos permitem que você veja. Se você é um peixe, por exemplo, vê as coisas um pouco mais amplas. Então, quando dizemos que montamos a matriz de projeção, queremos dizer que montamos o que queremos ver da cena que criamos. Quero dizer, você pode desenhar objetos em qualquer lugar do seu mundo. Se eles não estiverem dentro do volume da visualização, você não verá nada. Ao criar o volume da visualização, imagine que você criou 6 planos de recorte que definem seu campo de visão.

Quanto à matriz modelview, ela é usada para fazer várias transformações nos modelos (objetos) em seu mundo. Assim, você só precisa definir seu objeto uma vez e depois convertê-lo ou girá-lo ou dimensioná-lo.

Você usaria a matriz de projeção antes de desenhar os objetos em sua cena para definir o volume da vista. Em seguida, você desenha seu objeto e altera a matriz modelview de acordo. É claro que você pode alterar sua matriz no meio do desenho de seus modelos se, por exemplo, desejar desenhar uma cena e depois desenhar algum texto (que, com alguns métodos, você pode trabalhar mais facilmente na projeção ortográfica), volte para a matriz modelview.

Quanto ao nome modelview, ele tem a ver com a dualidade de modelar e visualizar transformações. Se você puxar a câmera 5 unidades para trás ou mover o objeto 5 unidades para frente, é essencialmente o mesmo.

Espero ter derramado alguma luz


2

A matriz de identidade é usada para "inicializar" uma matriz para um padrão sadio.

Uma coisa importante a perceber é que as multiplicações de matrizes são, de certo modo, aditivas. Por exemplo, se você pegar uma matriz que começa com a matriz de identidade, multiplica-a por uma matriz de rotação e multiplica-a por uma matriz de escala, você termina com uma matriz que gira e escala as matrizes nas quais é multiplicada.


0

Apenas para recapitular o que outros disseram, a matriz de identidade é uma matriz que, quando você multiplica um vetor / matriz com ela, o resultado é esse mesmo vetor / matriz. É o equivalente ao número 1 com multiplicação ou ao número 0 com adição.

glLoadIdentity () é uma função obsoleta e você é incentivado a gerenciar suas próprias matrizes.


-1

glLoadIdentity() A função garante que cada vez que entrarmos no modo de projeção, a matriz será redefinida para matriz de identidade, para que os novos parâmetros de visualização não sejam combinados com o anterior.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.