Sobre a transformação de coordenadas de modelos 3D
substância
Em primeiro lugar
Muitas vezes você pode ver imagens 3D em telas de TV e exibições em jogos, mas como você exibe objetos que existem no espaço 3D, como personagens e edifícios que se movem na tela, em uma tela 2D?
Em jogos 2D, existem apenas elementos bidimensionais de "X e Y" como valores de coordenadas, e a exibição também é 2D, portanto, se você desenhar um objeto especificando a posição coordenada de X e Y, entenderá intuitivamente como ele será desenhado em qual posição.
No entanto, em 3D, não é tão fácil. Como o nome sugere, 3D é "3 dimensão" e tem três informações de coordenadas: "X, Y e Z". Como as coordenadas são diferentes da exibição que é 2D, não é possível desenhar o objeto como ele é.
Então, o que fazer é "converter informações tridimensionais em informações bidimensionais". Isso é comumente chamado de "transformação de coordenadas". Lembre-se de que essa transformação de coordenadas é essencial para a programação 3D.
Existem vários tipos de transformações de coordenadas para converter 3D em 2D, mas existem três tipos principais de transformações de coordenadas que os programadores manipulam: "transformação do mundo", "transformação de visualização" e "transformação de projeção". Aqui, explicaremos tudo relacionado à transformação de coordenadas.
Sistemas de coordenadas para canhotos e destros
Em 3D, existem dois sistemas de coordenadas, o "sistema de coordenadas canhoto" e o "sistema de coordenadas à direita", que têm orientações diferentes para cada coordenada, conforme mostrado na figura abaixo.
O Direct3D usou principalmente um sistema de coordenadas para canhotos, mas também há funções para calcular sistemas de coordenadas para destros. No entanto, o XNA fornece apenas métodos de cálculo para sistemas de coordenadas destros. Isso parece estar de acordo com o fato de que outros aplicativos costumam usar sistemas de coordenadas destros.
Todas as dicas do XNA neste site usam o sistema de coordenadas para destros.
Sistema de coordenadas local (sistema de coordenadas do modelo)
Cada modelo tem um sistema de coordenadas centralizado na origem. Ao criar um modelo com um software de modelagem, acho que é mais fácil de entender se você imaginar criá-lo com a origem como centro.
Sistema de Coordenadas do Mundo
O sistema de coordenadas universais permite que você coloque o modelo em qualquer lugar. Se você não fizer nada nesta transformação do mundo, o modelo será colocado na origem da mesma forma que as coordenadas locais. O posicionamento não é apenas para se mover da origem, mas também para girar e escalar.
Visualizar sistema de coordenadas
Depois de colocar o modelo nas coordenadas do mundo, você precisa de informações sobre onde está olhando e para onde está olhando no espaço 3D. Isso é o que chamamos de "transformações de visão". As transformações de exibição geralmente são representadas como câmeras.
Os parâmetros necessários para essa conversão são "posição da câmera", "ponto de interesse da câmera" e "direção da câmera para cima". A orientação da câmera é determinada por esses três parâmetros. A figura abaixo mostra a câmera de uma perspectiva de terceiros.
A figura abaixo é realmente vista do ponto de vista da câmera com o arranjo mostrado na figura acima (neste ponto, ainda não convertemos as coordenadas para a tela, então é apenas uma imagem).
Na explicação anterior, parece que a câmera está posicionada e as coordenadas são transformadas, mas no cálculo real, as coordenadas mundiais são convertidas de acordo com a posição e orientação da câmera. Portanto, a origem é a posição da câmera, conforme mostrado na figura abaixo.
Sistema de coordenadas projetivas
Depois de decidir de qual posição visualizar o espaço 3D, o próximo passo é processar a exibição de "pequenos objetos que estão longe" e "coisas grandes que estão próximas". Isso é chamado de transformação projetiva. Existem dois métodos de transformação de projeção, "projeção em perspectiva" e "projeção ortográfica", mas a imagem de "projeção em perspectiva" comumente usada é a seguinte.
A projeção em perspectiva usa os seguintes parâmetros: Ângulo de visão, Proporção, Posição do clipe para frente e Posição do clipe traseiro. A área rotulada como "tronco" na figura acima finalmente aparecerá na tela.
"Ângulo de visão" especifica o alcance de visualização visível da câmera. Diminuir o ângulo aumenta o zoom, aumenta o zoom. O ângulo de visão será o valor vertical do tronco.
A proporção é usada para determinar o ângulo de visão horizontal, enquanto o ângulo de visão é um ângulo vertical. O ângulo horizontal geralmente é determinado pelo "ângulo de visão × proporção", e a proporção é basicamente o valor da "largura ÷ altura" da tela que você está tentando exibir. Se você alterar esse valor, o objeto 3D exibido parecerá esticado horizontal ou verticalmente.
A Posição do recorte frontal e a Posição do recorte traseiro são especificadas para determinar se o objeto é exibido na faixa frontal ou traseira. Devido à natureza do computador, não é possível exibir até o infinito, portanto, definiremos um limite. Esse valor também afeta a precisão do buffer Z, portanto, não é recomendável incluí-lo na área de desenho além do intervalo que não precisa ser exibido.
O objeto transformado em perspectiva é convertido em um espaço como o abaixo. Os objetos que estavam próximos da câmera são ampliados e os objetos que estavam distantes são reduzidos.
Isso é ilustrado em um diagrama fácil de entender abaixo.
Se você realmente olhar do ponto de vista da câmera, parece abaixo.
Outro método de transformação projetiva é a projeção ortográfica, que projeta uma área visível como a abaixo. Como a largura e a altura são constantes, independentemente da profundidade, o tamanho do objeto não muda com a profundidade.
Sistema de coordenadas da tela
Após a transformação da projeção, ela é convertida para as coordenadas da tela real. Mesmo sendo uma tela, a posição e o alcance da exibição mudam dependendo das configurações da janela de visualização definidas no dispositivo. No entanto, no caso de jogos, as coordenadas do cliente da janela geralmente são a janela de visualização como está, então não acho que você precise se preocupar muito.
As coordenadas da tela (0, 0) são convertidas das coordenadas de projeção (-1, 1, z). Da mesma forma, as coordenadas da tela (largura, altura) são convertidas das coordenadas de projeção (1, -1, z).