Vou usar isso como uma referência genérica, mas quanto mais documentos e livros on-line do navegador, menos eu entendo sobre isso.
const float vertexPositions[] = {
0.75f, 0.75f, 0.0f, 1.0f,
0.75f, -0.75f, 0.0f, 1.0f,
-0.75f, -0.75f, 0.0f, 1.0f,
};
Neste livro on - line, há um exemplo de como desenhar o primeiro e clássico hello world para o OpenGL sobre como fazer um triângulo.
A estrutura de vértice para o triângulo é declarada como indicado no código acima.
O livro, como todas as outras fontes sobre isso, enfatiza o fato de que o Clip Space é uma estrutura 4D usada para decidir basicamente o que será rasterizado e renderizado na tela.
Aqui tenho minhas perguntas:
- não consigo imaginar algo em 4D, não acho que um humano possa fazer isso, o que é um 4D para esse espaço de clipe?
- o documento mais legível que li que fala sobre uma câmera, que é apenas uma abstração sobre o conceito de recorte, e entendi que, o problema é: por que não usar o conceito de câmera em primeiro lugar? estrutura 3D familiar? O único problema com o conceito de câmera é que você precisa definir o potencial de outra maneira e, portanto, basicamente precisa adicionar outra declaração sobre o tipo de câmera que deseja ter.
- Como eu devo ler isso
0.75f, 0.75f, 0.0f, 1.0f
? Tudo o que recebo é que todos são valores flutuantes e entendo o significado dos 3 primeiros valores, o que significa o último?
Respostas:
O termo mágico é "Coordenadas homogêneas", que são usadas em sistemas em que a perspectiva é um fator. Verifique o wiki para uma visão geral, mas é um longo curso de estudo para realmente entendê-lo (o que eu não entendo).
fonte
Leia a introdução de livros que você lê, você ficará surpreso;)
http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html em Visão geral da rasterização
O valor "w" (onde os três primeiros valores são x, ye z) basicamente diz quais são as dimensões do espaço do clipe. Como esse é um valor escalar, todas as três dimensões do espaço do clipe são iguais (e é por isso que o espaço do clipe é um cubo). Todo vértice possui seu próprio espaço de clipe no qual existe (e basicamente precisa "encaixar", caso contrário, CLIPS: D), não existe um "mundo" que seja o espaço de clipe (embora todos os espaços de clipe estejam no mesmo " mundo "Eu acho que até estou tendo problemas com isso; P).
Portanto, se o seu vértice tiver, por exemplo, a coordenada [1,1,1], se o espaço do clipe for 1, o vértice estará no canto superior direito, próximo ao canto da tela (quando tudo estiver padrão, não sei se as direções pode ser alterado). Mas se o vértice tiver um espaço de clipe 2, então a coordenada [1,1,1] estará em algum lugar, digamos, 3 quartos na tela à direita, 3 quartos na tela até o topo e a terceira dimensão que você pode adivinhar a si mesmo.
Penso que, digamos que um espaço de clipe de 5 significaria que os locais dentro desse espaço de clipe variam de -5 a 5 em todas as dimensões, em vez de o cubo ser 5x5x5. Mas isso é provavelmente porque, de maneira simples, todas as coordenadas xy e z são divididas pela dimensão do espaço do clipe, então basicamente seus vértices passam por isso:
x = x / w
y = a / p
z = z / w
E é isso que torna tudo possível. Eu acho que a razão disso existir é para comparações fáceis. Se as coordenadas foram divididas pela dimensão do espaço do clipe, a coordenada que possui 1 ou mais componentes com um valor maior que 1, existe fora do espaço do clipe. Portanto, se o espaço do seu clipe é digamos 1024, mas a coordenada é [2000,3, -100], o componente x (2000) fica fora do espaço do clipe (que varia apenas de -1024 a 1024).
computacionalmente, é fácil saber se algo está dentro do espaço de clipes se tudo o que você precisa fazer é (muito ofc): (x / w) <1 && (x / w)> - 1 e depois renderiza. Além disso, suponho que todos os espaços de recorte de todos os vértices tenham o mesmo tamanho (portanto, todo cubo de espaço de recorte variando de -1 a 1 em todas as dimensões) facilita o que ocorrer após o processo de normalização, visto que a partir desse momento todas as coordenadas são flutua de 0 a 1 (desconsiderando o que foi cortado).
fonte
TL; DR não é espaço 4D, é 3D mais um número de escala que é praticamente sempre 1. Se for 1, você pode ignorá-lo e os três primeiros números são x, y, z. Caso contrário, fica mais complicado.
Aqui está uma explicação simples. Os vértices em 3D devem ter apenas três componentes
⌈x⌉ v = |y| ⌊z⌋
Se queremos manipulá-los (por exemplo, rotação, escala etc.), usamos uma matriz. O exemplo mais comum, é claro, é a matriz MVP (Model-View-Projection) que transforma as coordenadas do mundo em espaço de clipe. Como isso:
⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋
No entanto, isso tem uma grande falha: você não pode fazer a tradução. Se
[x,y,z]
for zero, não importa qualm
seja o resultado, sempre será zero; portanto, não podemos ter um MVP que inclua tradução. Obviamente, gostaríamos disso. A solução é adicionar 1 ao final de nossos vetores e expandir a matriz para 4x4:⌈cx⌉ ⌈m11 m12 m13 tx⌉ ⌈x⌉ |cy| = |m21 m22 m23 ty| * |y| |cz| |m31 m32 m33 tz| |z| ⌊ 1⌋ ⌊ 0 0 0 1⌋ ⌊1⌋
(Se você olhar para qualquer matriz MVP ortogonal - por exemplo, de
glOrtho()
-, encontrará a quarta linha0 0 0 1
. Às vezes até fica implícita.) Se você trabalhar com a matemática, verá que é o mesmo que⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋
O quarto componente é chamado
w
e, embora não precise ser 1, quase sempre é ( antes mesmo de uma transformação; depois é geralmente re-homogeneizado, dividindo o vetor inteiro porw
1). É uma espécie de truque para permitir que as matrizes de transformação incluam tradução.Editar
Acredito que a motivação original era para projeções em perspectiva , que são impossíveis com as coordenadas 3D. Existem outras transformações que você só pode fazer com vetores 4D, mas a tradução é a mais fácil de entender.
fonte
Há também mais um motivo que eu vejo e que não foi mencionado nas respostas anteriores.
As matrizes de tradução são 4x4, para que você também possa traduzir o objeto em "o mundo". Como com uma matriz 3x3, é possível girar e dimensionar uma coordenada 3d, mas você pode traduzir uma coordenada 3d apenas com uma matriz 4x4, daqui a necessidade de expressar as coordenadas 3d em um vetor 4d.
fonte