O mais importante é que ele converta seus pontos (vértices) do espaço do mundo 3D para o espaço da tela 2D.
Isso significa que, depois que o vértice é multiplicado com essa matriz, as cordas X e Y ficam na tela (entre [-1, 1]) e Z é a profundidade. Z é usado para buffer de profundidade e identifica a que distância está o vértice (ou fragmento) de suas câmeras próximas ao plano.
Projeção significa que os vértices que estão mais próximos do plano próximo estão mais distantes do meio da tela -> o triângulo mais próximo da câmera parece ser maior do que aquele que está distante. E isso é baseado no seu campo de visão - você está inserindo-o em alguma função createProjectionMatrix ou createFrustum. Funciona que ele corta e dimensiona o frustum e os vértices da câmera em um cubo unitário. Valores maiores que 1 e menores que -1 não são exibidos.
Também mantém a proporção de pixel, para que o pixel possa ser quadrado. Isso é simples. Ele apenas corta o frustum da câmera assim: tela mais ampla -> mais corte vertical e vice-versa.
Resposta simples:
define o seu perfil de câmera e é bom para:
- faça com que os objetos que estão perto de você pareçam maiores do que os objetos que estão longe de você.
- manter a proporção de pixel - Todo mundo gosta de pixel quadrado, certo? :)
Esta resposta está muito tempo depois do fato, mas desde que eu achei isso no google, talvez isso ainda ajude alguém. Eu só quero esclarecer o que JasonD e Notabene estavam dizendo: É muito mais fácil fazer cálculos de recorte (descubra o que você deve ver e o que não deve ver por causa da maneira como está olhando, a que distância está, etc.). .). Em vez de verificar se as coisas cruzam os planos nas bordas do seu ponto de vista de visualização, basta comparar o x, y, z de tudo com xMax, xMin, yMax, ect. , já que você simplesmente tem um cubo. É um pouco mais complicado se você deseja exibir apenas parte de algo, mas a matemática ainda é melhor com um cubo de unidade do que com um frustum.
Algumas coisas que eu achei enganosas em outras respostas:
-Você não está cortando os lados do frustum da vista, você está deformando-o em um cubo usando transformações de matriz homogêneas.
-Não estamos convertendo para uma tela 2D com esta etapa. Esta etapa não é necessária. Teoricamente, poderíamos fazer todo o nosso trabalho sem converter primeiro o frustum em um cubo, o que seria mais intuitivo, mas mais difícil de matemática - mas os gráficos são sobre cálculos muito rápidos, pois existem muitos cálculos por segundo para o jogo médio / o que quer que seja.
Mais detalhes: não é necessariamente um cubo de unidades para o qual estamos convertendo, apenas uma caixa retangular para que nossos cálculos de max-min funcionem. De fato, na aula, usamos uma caixa em que a câmera fica voltada para o eixo z, z passa de 0 a 1, x passa de -1 a 1 e y passa de -1 a 1. Em geral, em matemática 1, 0, e -1 são bons números para facilitar os cálculos, presumo que é por isso que não passamos de -100 a 100 ou algo assim.
TLDR: Facilita o recorte.
Edit: bobobobo tem a essência disso. Tudo é triângulos, geralmente: D.
Fonte: Tendo uma aula de gráficos da universidade
fonte
Acredito que isso ocorre porque o OpenGL não pode fazer suposições sobre como a imagem deve ser exibida (proporção ou resolução, detalhes de hardware, etc.). Ele renderiza e cria uma imagem em uma forma intermediária que o sistema operacional ou driver ou o que quer que seja dimensionado para a resolução / tamanho correto.
fonte
Observo que uma resposta já foi aceita, mas geralmente é útil recortar para que o view frustum seja transformado em um cubo de unidade.
fonte
Eu também estive pensando nisso. Há algumas coisas a considerar.
Primeiro, sim, tudo no mundo é transformado naquele cubo unitário [-1,1] centrado em torno da origem. Se algo não estiver nesse cubo de unidade, ele não será exibido.
O bom disso agora é que você pode selecionar triângulos facilmente. (Se todos os três vértices de um triângulo tiverem
x > 1
oux < -1
então esse triângulo puder ser descartado).fonte
Eu recomendaria verificar a lição sobre matriz de projeção em perspectiva no Scratchapixel
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix
Isso explica claramente que o porquê é deformar o espaço de vista para um cubo de unidade. Por quê? Essencialmente, porque o processo de projetar pontos 3D na tela envolvia a conversão do espaço NDC, que é um espaço no qual os pontos na tela são remapeados no intervalo [-1,1] (assumindo que a tela é quadrada). Agora também remapeamos a coordenada Z do ponto no intervalo [0,1] (ou às vezes [-1,1]), portanto, no final, você acaba com um cubo. O fato é que, quando os pontos estão contidos em um cubo, é mais fácil processá-los do que quando eles são definidos no frustrum de exibição (que é um espaço estranho, uma pirâmide truncada). Outra razão é que ela traz todo tipo de transformação projetiva que você pode imaginar no CG para o mesmo espaço (o cubo unitário). Portanto, independentemente de você usar uma perspectiva ou projeção ortográfica, por exemplo,
Embora talvez você se concentre demais no porquê. O cubo de unidade é realmente apenas o resultado do processo da matemática envolvida ou usada para projetar vértices em uma tela e, em seguida, remapear suas coordenadas para o espaço raster.
fonte