Entendendo a matriz de projeção em perspectiva no OpenGL

7

A configuração da matriz de projeção em perspectiva no Open GL (incluindo o OpenGL ES 2.0) tem o seguinte formato geral:

glm::mat4 perspective(float fovy, float aspect, float zNear, float zFar);

Observe os dois últimos parâmetros ; Primeiro, especifique o plano zNear , que é o plano mais próximo da câmera. O segundo especifica o plano zFar que está longe da câmera.

É do conhecimento geral que, no OpenGL, coisas que estão além, em outras palavras "mais fundo na tela", têm eixo Z negativo . Por que, então, todos os exemplos do OpenGL, que configuram a matriz de projeção em perspectiva (extraídos de fontes confiáveis ​​como OpenGL SuperBible e similares), se parecem com os dois parâmetros mencionados acima (zNear, zFar) da função de projeção em perspectiva?

Este exemplo foi retirado do webiste do GLM (OpenGL Math) :

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.f); 

Você pode ver que o parâmetro zNear está mais distante da câmera do que o parâmetro zFar, que é 100 pontos mais próximo da câmera / visualizador.

Você pode fornecer uma explicação fácil de entender , por favor? I não é apenas um, mas todos os exemplos, que passam zFar como valor positivo mais alto que zNear. Obrigado.


Meu exemplo:

No meu código, quando defino:

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 1000.0f, -500.0f); 

Suponho que meu frustum tenha 1000 pontos na direção z-positiva e 500 pontos na z-negativa direção .

Quando defino coisas assim, posso ver pelo menos algum objeto, embora as coisas não sejam perfeitas: por algumas razões, vejo apenas objetos posicionados em coordenadas z negativas.

Isso pode estar relacionado ao meu entendimento incorreto da função de projeção em perspectiva.

Bunkai.Satori
fonte
11
porque zNear e zFar especificam as distâncias que os aviões estão da câmera, não a posição delas ... ou estou entendendo errado sua pergunta?
jeffythedragonslayer
@da code monkey: +1, não, você não está entendendo nada. Então, você diz que os dois parâmetros acima mencionados não contêm coordenadas do plano físico, mas representam valores de deslocamento da câmera. Se a câmera for movida, o frustum a seguirá. Isso deveria ter sido enfatizado nos livros do OpenGL.
Bunkai.Satori
É explicitamente explicitado na maioria desses livros; você tem exemplos específicos de passagens que indicam que os valores são absolutos?
Também não faça isso simplesmente por convenção de que as coisas "mais profundas" têm uma profundidade "mais negativa". Você pode organizá-lo como quiser.
@da código monkey: Se você quiser, digite novamente sua resposta como resposta regular neste tópico. Então, poderei marcá-lo como Resposta Aceita . Obrigado por ajudar, tive muita dor de cabeça com isso.
Bunkai.Satori

Respostas:

5

O método em questão ( glm::perspective) e seu tipo são essencialmente invólucros ou reimplementações do gluPerspective . Como você pode ver na documentação dessa função, os valores próximos / distantes são distâncias do plano de visualização e são sempre positivos.

michael.bartnett
fonte
+1 para uma resposta útil. Olá Josh, e obrigado pelo esclarecimento. Foi a minha interpretação errada do texto. A propósito, esse conhecimento foi fundamental para resolver o comportamento imprevisível dos meus gráficos OpenGL. Como não há mais nada a acrescentar, deixe-me marcar como Resposta Aceita .
Bunkai.Satori