Qual é o objetivo do volume de visualização canônica?

15

Atualmente, estou aprendendo OpenGL e não consegui encontrar uma resposta para esta pergunta.

Depois que a matriz de projeção é aplicada ao espaço da vista, o espaço da vista é "normalizado" para que todos os pontos fiquem dentro do intervalo [-1, 1]. Isso geralmente é chamado de "volume de visualização canônico" ou "coordenadas normalizadas do dispositivo".

Embora tenha encontrado muitos recursos falando sobre como isso acontece, não vi nada sobre o motivo .

Qual é o objetivo desta etapa?

breadjesus
fonte

Respostas:

7

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? :)
Notabene
fonte
Não vejo nenhuma parte em que ele pergunte o que a matriz de projeção faz. Ele apenas parece se perguntar para que servem as coordenadas normalizadas do dispositivo.
Chris diz Reinstate Monica
A matriz de projeção define o frustum da câmera. Mas isso não explica o motivo de ter [-1,1] como o volume de visualização canônico. Por que não ter [-100.100]?
bobobobo
11
porque 1 é "número mais comum" do que 100: D (0 é ainda mais comum, mas cubo 0x0x0 não é muito interessante ...)
Ivan Kuckir
5

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

Brian
fonte
Embora interessante, parece que seus pontos são parcialmente verdadeiros. Você não está usando uma matriz homogênea; apenas no espaço do clipe, os pontos são definidos no espaço homogêneo. 2) verdade, nas partes frontais do espaço do clipe ainda não estão projetadas na tela. Isso acontece após a divisão da perspectiva, embora observe que isso necessariamente acontece quando você volta do espaço do clipe para o espaço cartesiano. 3) sim e não. A conversão de coordenadas de pontos no espaço NDC ainda é necessária. O que não é necessário é o espaço do clipe, específico da GPU. ...
user18490
... É o estágio de espaço do clipe que não é necessário, não o remapeamento no cubo da unidade. Sua última suposição também não está correta. Você remapeia para -1 para 1, porque é mais fácil ir do espaço NDC para o espaço raster (a transformação da viewport). Na verdade, é ainda mais fácil se o espaço NDC estiver no intervalo [0,1], o que é o caso de alguma implementação. No final, é tudo matemática, portanto, com certeza outras convenções podem ser usadas. consulte o bom site scratchapixel para obter mais detalhes.
precisa saber é o seguinte
1

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.

Chewy Gumball
fonte
Você não está correto quando está falando sobre detalhes de hardware. Existem não. Além disso, se você está escrevendo seu próprio rastarizator na CPU (por que fazê-lo? Para saber como isso funciona :)), você está usando as mesmas matrizes que na GPU. Você tem sorte que eu ainda não tenho privileques para votar para baixo :)
Notabene
Não precisa saber a proporção? Pelo que entendi, ele armazena os fatores de escala para X e Y, para que a imagem tenha a proporção correta mais tarde.
breadjesus
3
Corrija-me se eu estiver errado, mas ele está falando depois que você projeta pontos e, portanto, estamos falando em 2D. Se for esse o caso, o OpenGL não sabe onde você está colocando esta imagem na tela, nem sobre como ela será exibida. Ele cria uma imagem que é fácil de dimensionar e colocar corretamente, mas não faz isso por você. Eu concordo que os detalhes de hardware eram um nome ruim para isso, eu simplesmente quis dizer o que foi dito acima. Além disso, você pode especificar uma matriz de projeção com uma proporção, mas essa proporção não precisa ser a mesma do monitor.
Chewy Gumball
3
Eu tenho que dizer que eu realmente gosto dessa conversa. Você está quase certo. Vamos aprofundar. Não há imagem após vértices de multiplacação por projMat. O resultado é apenas um conjunto de ponto 2D com profundidade. A rastarização começa e cria imagens. (se na CPU ele desenha linhas entre triângulos verts e a preenche (e sombreia o que for) ... na gpu é realizada logo antes do pixel / fragmento shader). E a proporção coloca os pontos que devem ser "redimensionados" para valores maiores que 1 ou menores que -1 e eles não serão exibidos.
Notabene
2
AHHH! Eu vejo o problema aqui. Ele disse que "isso geralmente é chamado de" volume canônico de visualização "ou" coordenadas normalizadas do dispositivo "." Eu estava respondendo como se ele estivesse perguntando sobre as coordenadas normalizadas do dispositivo, mas ele não estava perguntando sobre elas. Eles são, de fato, duas coisas completamente diferentes e é por isso que estamos em desacordo aqui. Talvez isso deva ser esclarecido para que as pessoas não cometam o mesmo erro que eu.
Chewy Gumball
1

Observo que uma resposta já foi aceita, mas geralmente é útil recortar para que o view frustum seja transformado em um cubo de unidade.

JasonD
fonte
É verdade que pouco editei minha resposta para ser mais claro sobre isso.
Notabene
A propósito, um cubo unitário é um cubo do lado 1. Portanto, o nome é inadequado. Em vez disso, deve ser chamado de volume de visualização canônico.
precisa saber é o seguinte
1

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 > 1ou x < -1então esse triângulo puder ser descartado).

bobobobo
fonte
0

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.

user18490
fonte