Por que o espaço do clipe no OpenGL tem 4 dimensões?

13

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?
user827992
fonte
4
O capítulo 4 explica exatamente o que o quarto componente faz. Na verdade, arranhe isso; O Capítulo 1 explica a transformação de clipe para NDC na seção de rasterização até a metade .
Nicol Bolas
2
@NicolBolas, o autor dá sua explicação no primeiro capítulo e não coloca nenhuma referência para os próximos capítulos, ele também finge explicar o que acontece depois ao comentar algum código c ++ e o problema é que, se ele não explicar tudo o capítulo 1 não faz muito sentido colocar o que eu devo saber em primeiro lugar no capítulo número 4, especialmente se eu precisar desses conceitos para decodificar o que está dentro do capítulo 1. Estou lendo isso agora, e não apenas uma vez, agora eu sei que devo procurar mais a resposta, analisarei os vários capítulos.
User827992
1
Você não precisa decodificar nada; diz no capítulo 1: O componente W é dividido nos outros 3 componentes. Isso também foi afirmado na introdução. O que é adiado até o capítulo 4 é por que o OpenGL faz isso. Isso é adiado até mais tarde, porque é irrelevante para a tarefa em questão.
Nicol Bolas
3
Ainda seria uma informação irrelevante para o problema em questão (ou seja: renderizar um triângulo). Você está curioso sobre isso, mas não precisa entender por que é assim que é para entender que é assim que funciona. Ao aprender qualquer coisa, o primeiro passo é entender o que é. Depois que você entender o que está acontecendo, poderá ocorrer uma discussão sobre o motivo .
Nicol Bolas
1
Esta resposta pode ajudar.
Izmilind #

Respostas:

9

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).

ddyer
fonte
10

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).

dammkewl
fonte
A questão era por que o espaço do clipe é como é, não o que significa o espaço do clipe. Ou seja, qual é o objetivo da divisão por W.
Nicol Bolas
2
Ele responde a 3ª pergunta dos 3 pontos de bala embora =)
dammkewl
8

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 qual mseja 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 linha 0 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 we, embora não precise ser 1, quase sempre é ( antes mesmo de uma transformação; depois é geralmente re-homogeneizado, dividindo o vetor inteiro por w1). É 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.

Timmmm
fonte
2
Explique seus votos negativos.
Timmmm
+1, supondo que as informações estejam corretas, essa foi uma boa explicação e foi útil para mim. obrigado
Luke
1

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.

Marco
fonte
você só "precisa" de um vetor 4d sob essas definições. uma matriz 4x4 não é apenas para o simples propósito de adicionar como todo mundo gosta de assumir e reivindicar para os outros. se tudo o que você queria era adicionar a tradução após a rotação (para um ponto 3d), basta definir uma matriz 4x3. é muito mais eficiente se é tudo o que você procura. você não precisa se restringir a regras que foram feitas por vários outros motivos, apenas porque parece mais limpo. lol
Puddle