Por quê ?
Porque, uma câmera representa uma visão de projeção.
Mas no caso da câmera 3D (câmera virtual), a câmera se move ao invés do mundo. Fiz uma explicação detalhada depois desta resposta.
Compreendendo matematicamente
A vista de projeção se move pelo espaço e muda sua orientação. A primeira coisa a notar é que a projeção desejada na tela não muda com a direção da vista.
Por esse motivo, transformamos outras coisas para obter a projeção desejada.
Compreendendo http://opengl.org
Para dar a aparência de mover a câmera, seu aplicativo OpenGL deve mover a cena com o inverso da transformação da câmera. No que diz respeito ao OpenGL, não há câmera. Mais especificamente, a câmera está sempre localizada na coordenada do espaço ocular (0, 0, 0)
Compreendendo http://open.gl
Também deseja compartilhar as seguintes linhas da parte da matriz View de http://open.gl/transformations
Para simular uma transformação de câmera, você realmente precisa transformar o mundo com o inverso dessa transformação. Exemplo: se você quiser mover a câmera para cima, precisará mover o mundo para baixo.
Compreensão por perspectiva
No mundo real, vemos as coisas de uma maneira que é chamada de "perspectiva".
Perspectiva refere-se ao conceito de que objetos mais distantes parecem menores do que aqueles que estão mais próximos de você. Perspectiva também significa que se você estiver sentado no meio de uma estrada reta, na verdade verá as bordas da estrada como duas linhas convergentes.
Essa é a perspectiva. A perspectiva é crítica em projetos 3D. Sem perspectiva, o mundo 3D não parece real.
Embora isso possa parecer natural e óbvio, é importante considerar que, ao criar uma renderização 3D em um computador, você está tentando simular um mundo 3D na tela do computador, que é uma superfície 2D.
Imagine que atrás da tela do computador existe uma espécie de cena 3D real, e você a está assistindo através do "vidro" da tela do computador. Usando a perspectiva, seu objetivo é criar código que renderize o que é "projetado" nesse "vidro" da tela como se houvesse esse mundo 3D real atrás da tela. A única ressalva é que este mundo 3D não é real ... é apenas uma simulação matemática de um mundo 3D.
Portanto, ao usar a renderização 3D para simular uma cena em 3D e projetar a cena 3D na superfície 2D da tela, o processo é chamado de projeção em perspectiva.
Comece imaginando intuitivamente o que você deseja alcançar. Se um objeto estiver mais próximo do visualizador, ele deverá parecer maior. Se o objeto estiver mais distante, ele deverá parecer menor. Além disso, se um objeto estiver se afastando do visualizador, em linha reta, você deseja que ele converja para o centro da tela, à medida que se afasta um pouco mais.
Traduzindo perspectiva em matemática
Como você vê a ilustração na figura a seguir, imagine que um objeto está posicionado em sua cena 3D. No mundo 3D, a posição do objeto pode ser descrita como xW, yW, zW, referindo-se a um sistema de coordenadas 3D com a origem no ponto de vista. É aí que o objeto está realmente posicionado, na cena 3D além da tela.
À medida que o visualizador observa esse objeto na tela, o objeto 3D é "projetado" para uma posição 2D descrita como xP e yP, que faz referência ao sistema de coordenadas 2D da tela (plano de projeção).
Para colocar esses valores em uma fórmula matemática, usarei um sistema de coordenadas 3D para coordenadas mundiais, em que o eixo x aponta para a direita, y aponta para cima e pontos z positivos na tela. A origem 3D refere-se à localização do olho do espectador. Então, o vidro da tela está em um plano ortogonal (em ângulo reto) ao eixo z, em algum z que eu chamarei de zProj.
Você pode calcular as posições projetadas xP e yP, dividindo as posições mundiais xW e yW, por zW, da seguinte maneira:
xP = K1 * xW / zW
yP = K2 * yW / zW
K1 e K2 são constantes derivadas de fatores geométricos, como a proporção do seu plano de projeção (sua janela de visualização) e o "campo de visão" do seu olho, que leva em consideração o grau de visão de grande angular.
Você pode ver como essa transformação simula a perspectiva. Os pontos próximos aos lados da tela são empurrados em direção ao centro à medida que a distância do olho (zW) aumenta. Ao mesmo tempo, os pontos mais próximos do centro (0,0) são muito menos afetados pela distância do olho e permanecem próximos do centro.
Essa divisão por z é a famosa "divisão da perspectiva".
Agora, considere que um objeto na cena 3D é definido como uma série de vértices. Portanto, aplicando esse tipo de transformação a todos os vértices da geometria, você efetivamente garante que o objeto encolherá quando estiver mais distante do ponto do olho.
Outros casos importantes
- No caso da câmera 3D (câmera virtual), a câmera se move ao invés do mundo.
Para entender melhor as câmeras 3D, imagine que você está gravando um filme. Você precisa configurar uma cena que deseja gravar e precisa de uma câmera. Para obter as imagens, você percorrerá a cena com sua câmera, fotografando os objetos na cena de diferentes ângulos e pontos de vista.
O mesmo processo de filmagem ocorre com uma câmera 3D. Você precisa de uma câmera "virtual", que possa percorrer a cena "virtual" que você criou.
Dois estilos populares de fotografia envolvem observar o mundo através dos olhos de um personagem (também conhecido como câmera de primeira pessoa) ou apontar a câmera para um personagem e mantê-los à vista (conhecidos como câmera de terceira pessoa).
Essa é a premissa básica de uma câmera 3D: uma câmera virtual que você pode usar para percorrer uma cena 3D e renderizar as imagens de um ponto de vista específico.
Compreendendo o espaço mundial e visualizando o espaço
Para codificar esse tipo de comportamento, você renderiza o conteúdo do mundo 3D do ponto de vista da câmera, não apenas do ponto de vista do sistema de coordenadas do mundo ou de algum outro ponto de vista fixo.
De um modo geral, uma cena 3D contém um conjunto de modelos 3D. Os modelos são definidos como um conjunto de vértices e triângulos, referenciados ao seu próprio sistema de coordenadas. O espaço no qual os modelos são definidos é chamado de espaço do modelo (ou local).
Após colocar os objetos do modelo em uma cena 3D, você transformará os vértices desses modelos usando uma matriz "transformação do mundo". Cada objeto tem sua própria matriz mundial que define onde o objeto está no mundo e como ele é orientado.
Esse novo sistema de referência é chamado de "espaço mundial" (ou espaço global). Uma maneira simples de gerenciá-lo é associando uma matriz de transformação do mundo a cada objeto.
Para implementar o comportamento de uma câmera 3D, você precisará executar etapas adicionais. Você fará referência ao mundo - não à origem do mundo - mas ao sistema de referência da própria câmera 3D.
Uma boa estratégia envolve tratar a câmera como um objeto 3D real no mundo 3D. Como qualquer outro objeto 3D, você usa uma matriz de "transformação do mundo" para colocar a câmera na posição e orientação desejadas no mundo 3D. A matriz de transformação do mundo da câmera transforma o objeto da câmera do original, olhando a rotação para a frente (ao longo do eixo z), para a posição real do mundo (xc, yc, zc) e a rotação do mundo.
A figura a seguir mostra as relações entre o sistema de coordenadas do mundo (x, y, z) e o sistema de coordenadas do modo de exibição (câmera) (x ', y', z ').