A Matriz View e o Espaço de Câmera
Objetivos de Aprendizagem
- Explicar por que uma cena definida inteiramente no espaço de mundo ainda não pode ser renderizada sem também definir uma câmera.
- Construir a própria matriz de transformação de uma câmera (a sua posição e orientação) usando exatamente a mesma maquinaria de rotação-e-translação que
3d-transformations-and-composing-the-model-matrixjá compôs. - Explicar por que a matriz view é a inversa da própria transformação de espaço de mundo da câmera, e aplicar essa inversa a um ponto concreto de espaço de mundo.
- Enunciar precisamente o que "espaço de câmera" significa como um sistema de coordenadas, e por que todo vértice precisa ser reexpresso nele antes da projeção.
Contexto e Motivação
3d-transformations-and-composing-the-model-matrix colocou um objeto num espaço de mundo compartilhado usando uma matriz model construída a partir de escala, rotação e translação. Uma cena completa tem muitos desses objetos, todos agora vivendo no mesmo sistema de coordenadas de espaço de mundo, mas o pipeline ainda não consegue desenhar nenhum deles sem responder mais uma pergunta: desenhá-los como vistos de onde. Uma câmera não é um tipo especial de objeto; ela é um objeto como qualquer outro, com uma posição e uma orientação no espaço de mundo, construída com as matrizes de translação-e-rotação idênticas que o conceito anterior acabou de compor. Este conceito cobre a única ideia genuinamente nova que uma câmera introduz: para renderizar a cena do ponto de vista da câmera, todo vértice precisa ser reexpresso em relação à câmera, o que significa desfazer a própria transformação da câmera, não aplicá-la.
Teoria Central
A câmera como um objeto, e o espaço de câmera
Uma câmera tem uma posição (um ponto no espaço de mundo) e uma orientação (para que lado ela está voltada, e qual lado é "para cima" do seu próprio ponto de vista). Exatamente como qualquer objeto modelado, isto pode ser capturado como uma matriz 4x4, chame-a de C, construída a partir de uma rotação (a orientação da câmera) e uma translação (a posição da câmera), usando a mesma composição T * R que 3d-transformations-and-composing-the-model-matrix estabeleceu. C, aplicada a um ponto no próprio espaço local da câmera (0,0,0, a própria origem da câmera, olhando por seu próprio eixo -Z local por convenção), coloca esse ponto corretamente no espaço de mundo, exatamente da forma que uma matriz model coloca os vértices de espaço local de um objeto no mundo.
O espaço de câmera (também chamado de espaço de olho ou espaço de visão) é o sistema de coordenadas onde a própria câmera fica na origem, olhando por um eixo fixo. Um vértice expresso no espaço de câmera diz, diretamente, "este ponto está tão longe à direita da câmera, tão longe para cima e tão longe à frente", que é exatamente a informação de que o próximo estágio, a projeção, precisa.
A matriz view é a inversa da matriz da câmera
Se C move um ponto do espaço de câmera para o espaço de mundo, então renderizar a cena do ponto de vista da câmera exige a operação oposta em todo vértice de cena: mover um ponto de espaço de mundo para o espaço de câmera, que é exatamente C inversa. Esta inversa, chamada de matriz view (V = C^-1), é o que de fato é aplicado a todo vértice na cena, depois da matriz model, na cadeia de transformação do pipeline: um vértice vai do espaço de objeto para o espaço de mundo via a matriz model, depois do espaço de mundo para o espaço de câmera via a matriz view.
Para uma câmera construída puramente a partir de uma matriz de rotação ortonormal R e uma translação t (posição), a inversa tem uma forma fechada conveniente que evita uma inversão de matriz geral: a parte de rotação inverte para a sua transposta (R^-1 = R^T, verdadeiro para qualquer matriz de rotação ortonormal), e a parte de translação se torna -R^T * t; V = [R^T | -R^T * t]. Esta é a construção "look-at" padrão que todo curso de gráficos, incluindo o CS4620 de Cornell, constrói a partir de uma posição de câmera, um ponto-alvo para olhar e um vetor up.
Por que "desfazer a transformação da câmera" é o enquadramento correto
Uma câmera movendo-se e um objeto movendo-se produzem o efeito visual idêntico de lados opostos da mesma matriz: se a câmera se move para frente por 1 unidade, todo objeto à vista deveria parecer mover-se para trás por 1 unidade em relação à câmera; aplicar C^-1 (a matriz view) a todo vértice alcança exatamente isto, já que desfazer uma translação para frente é equivalente a transladar todo o resto para trás pela mesma quantidade. É por isso que uma "câmera movendo-se" e um "mundo movendo-se" são matematicamente a mesma operação, computada a partir de dois pontos de partida diferentes e igualmente válidos.
Exemplos Resolvidos
Exemplo 1: uma câmera em (0, 0, 5) olhando para a origem, nenhuma rotação necessária para um caso simples
Posição da câmera (0, 0, 5), olhando em direção à origem (0, 0, 0), vetor up (0, 1, 0). Já que a câmera olha reto por seu próprio eixo -Z em direção à origem sem inclinação, a sua orientação corresponde aos eixos do mundo exatamente (R = identidade aqui), então C é uma translação pura por (0, 0, 5), e a sua inversa V é uma translação pura por (0, 0, -5):
textC: V = C^-1: | 1 0 0 0 | | 1 0 0 0 | | 0 1 0 0 | | 0 1 0 0 | | 0 0 1 5 | | 0 0 1 -5 | | 0 0 0 1 | | 0 0 0 1 |
Exemplo 2: transformando um ponto de espaço de mundo para o espaço de câmera
Ponto de espaço de mundo p = (1, 1, 0, 1) (um objeto sentado perto da origem). Aplique V do Exemplo 1:
text| 1 0 0 0 | | 1 | | 1 | | 0 1 0 0 | * | 1 | = | 1 | | 0 0 1 -5 | | 0 | | -5 | | 0 0 0 1 | | 1 | | 1 |
Posição de espaço de câmera: (1, 1, -5). Isto diz exatamente o que é necessário para o próximo estágio: o ponto está 1 unidade à direita, 1 unidade acima, e 5 unidades à frente da câmera (Z negativo, pela convenção padrão de que a câmera olha por -Z), uma descrição direta e usável do ponto em relação ao observador.
Exemplo 3: mover a câmera versus mover o mundo, o mesmo resultado
Suponha que a câmera em vez disso se move de (0, 0, 5) para (0, 0, 6), uma unidade mais para trás. A nova matriz view translada por (0, 0, -6), e o mesmo ponto de mundo p = (1, 1, 0, 1) agora transforma para (1, 1, -6): o ponto aparece uma unidade mais distante, exatamente como se a câmera tivesse ficado parada e todo objeto no mundo tivesse em vez disso se movido uma unidade mais longe da câmera ao longo de Z. Ambos os enquadramentos, "a câmera se moveu" e "o mundo se moveu no sentido oposto", produzem a coordenada de espaço de câmera idêntica, confirmando que a matriz view computa exatamente o relacionamento relativo que importa para a renderização.
Equívocos Comuns e Armadilhas
- "A matriz view é construída da mesma forma que uma matriz model, então ela pode ser aplicada diretamente, sem inverter." O Exemplo 1 mostra que a matriz view é a própria matriz de posicionamento da câmera invertida; aplicar a matriz de posicionamento da câmera C diretamente aos vértices de cena (em vez da sua inversa) moveria todo objeto mais longe da câmera à medida que a câmera se move para frente, o oposto do efeito visual correto e esperado.
- "Espaço de câmera e espaço de mundo são a mesma coisa com rótulos diferentes." O resultado do Exemplo 2, (1, 1, -5), é uma descrição em relação à própria posição e orientação da câmera, não uma reafirmação das coordenadas de espaço de mundo (1, 1, 0); os dois números são genuinamente diferentes porque respondem perguntas diferentes (onde este ponto está no mundo compartilhado, versus onde este ponto está em relação a mim).
- "Uma câmera precisa de um tipo fundamentalmente diferente de matriz do que um objeto modelado." Ela não precisa: a própria transformação de uma câmera é construída com a composição de rotação-e-translação idêntica que
3d-transformations-and-composing-the-model-matrixjá estabeleceu; a única ideia nova que este conceito introduz é que a matriz da câmera é invertida antes do uso, em vez de aplicada diretamente.
Resumo
Uma câmera é um objeto comum com uma posição e orientação, construída a partir das mesmas matrizes de rotação-e-translação usadas para qualquer objeto modelado, mas renderizar a partir do seu ponto de vista exige a operação oposta: a matriz view é a própria matriz de posicionamento da câmera invertida, movendo todo vértice de cena do espaço de mundo para o espaço de câmera, o sistema de coordenadas onde a câmera fica na origem olhando por um eixo fixo. Para uma câmera construída a partir de uma rotação ortonormal e uma translação, esta inversa tem uma forma fechada conveniente (R transposta, e uma translação correspondentemente ajustada), a construção look-at padrão. Este é o segundo elo na cadeia model-view-projection, e the-projection-matrix-perspective-and-clipping constrói o terceiro e final em seguida, transformando um ponto de espaço de câmera nas coordenadas padronizadas de que a rasterização precisa.