Perché lo spazio della clip in OpenGL ha 4 dimensioni?


13

Userò questo come riferimento generico, ma più navigo su documenti e libri online, meno capisco su questo.

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,
};

in questo libro online c'è un esempio su come disegnare il primo e classico mondo ciao per OpenGL sulla creazione di un triangolo.

La struttura del vertice per il triangolo è dichiarata come indicato nel codice sopra.

Il libro, come tutte le altre fonti su questo, sottolinea il fatto che Clip Space è una struttura 4D che viene utilizzata sostanzialmente per decidere cosa verrà rasterizzato e renderizzato sullo schermo.

Qui ho le mie domande:

  • non riesco a immaginare qualcosa in 4D, non penso che un essere umano possa farlo, cos'è un 4D per questo spazio Clip?
  • il documento più leggibile dall'uomo che ho letto parla di una fotocamera, che è solo un'astrazione sul concetto di ritaglio, e capisco che, il problema è, perché non usare il concetto di fotocamera in primo luogo che è un altro struttura 3D familiare? L'unico problema con il concetto di fotocamera è che è necessario definire la prospettiva in altro modo e quindi in pratica è necessario aggiungere un'altra affermazione sul tipo di fotocamera che si desidera avere.
  • Come dovrei leggere questo 0.75f, 0.75f, 0.0f, 1.0f? Tutto quello che ottengo è che sono tutti valori float e ottengo il significato dei primi 3 valori, cosa significa l'ultimo?

4
Il capitolo 4 spiega esattamente cosa fa il quarto componente. In realtà, grattalo; Il capitolo 1 spiega la trasformazione da clip a NDC nella sezione di rasterizzazione a metà .
Nicol Bolas,

2
@NicolBolas l'autore dà la sua spiegazione nel primo capitolo e non fa alcun riferimento per i capitoli successivi, inoltre finge di spiegare cosa succede dopo commentando un codice c ++ e il problema è che se non spiega completamente tutto in il capitolo 1 non ha molto senso mettere ciò che dovrei sapere in primo luogo nel capitolo numero 4, specialmente se ho bisogno di questi concetti per decodificare ciò che è all'interno del capitolo 1. Lo sto leggendo ora, e non solo 1 volta, ora so che dovrei cercare ulteriormente la risposta, esaminerò i vari capitoli.
user827992,

1
Non è necessario decodificare nulla; dice nel capitolo 1: Il componente W è diviso negli altri 3 componenti, come indicato anche nell'introduzione. Ciò che è rimandato al capitolo 4 è il motivo per cui OpenGL lo fa. Ciò è sospeso fino a tardi perché è irrilevante per il compito da svolgere.
Nicol Bolas,

3
Si tratterebbe comunque di informazioni irrilevanti per il problema in questione (ovvero: rendering di un triangolo). Ne sei curioso , ma non hai bisogno di capire perché è così che capisce che funziona così. Nell'apprendimento di qualsiasi cosa, il primo passo è capire di cosa si tratta. Una volta capito cosa sta succedendo, allora può svolgersi una discussione sul perché sia così.
Nicol Bolas,

1
Questa risposta può essere d'aiuto.
iammilind,

Risposte:


9

Il termine magico è "coordinate omogenee" che vengono utilizzate nei sistemi in cui la prospettiva è un fattore. Controlla il wiki per una panoramica, ma è un lungo corso di studio per capirlo davvero (cosa che non capisco).


10

Leggi l'introduzione dei libri che leggi, rimarrai sorpreso;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html in Panoramica sulla rasterizzazione

Il valore "w" (dove i primi 3 valori sono x, y e z) dice sostanzialmente quali sono le dimensioni dello spazio della clip. Poiché si tratta di 1 valore scalare, tutte e 3 le dimensioni dello spazio della clip sono uguali (ed è per questo che lo spazio della clip è un cubo). Ogni vertice ha il proprio spazio di clip in cui esiste (e sostanzialmente deve "adattarsi", altrimenti CLIPS: D), non esiste 1 "mondo" che è lo spazio di clip (sebbene tutti gli spazi di clip siano nello stesso " mondo "Penso, anche se sto avendo problemi con questo; P).

Quindi se il tuo vertice ha ad esempio la coordinata [1,1,1], se lo spazio della clip è 1, allora il vertice si trova nell'angolo in alto a destra vicino allo schermo (quando tutto è predefinito, non so se le direzioni può essere modificato). Ma se il vertice ha uno spazio di clip di 2, allora la coordinata [1,1,1] sarà da qualche parte, diciamo, 3 quarti attraverso lo schermo a destra, 3 quarti attraverso lo schermo verso l'alto e la terza dimensione che puoi indovinare te stesso.

Penso che avere uno spazio di clip di 5 significhi che le posizioni all'interno di quello spazio di clip vanno da -5 a 5 su ogni dimensione, invece che il cubo sia 5x5x5. Ma probabilmente è perché semplicemente: tutte le coordinate xy e z sono divise per la dimensione dello spazio della clip, quindi sostanzialmente i tuoi vertici subiscono questo:

x = x / w

y = y / w

z = z / w

Ed è ciò che rende tutto possibile. Penso che il motivo per cui esista sia per facili confronti. Se le coordinate sono state divise per la dimensione dello spazio della clip, allora la coordinata che ha 1 o più componenti con un valore maggiore di 1, esiste al di fuori dello spazio della clip. Quindi, se lo spazio della clip è 1024, ma la coordinata è [2000,3, -100], il componente x (2000) è esterno allo spazio della clip (che varia solo da -1024 a 1024).

in termini di calcolo è facile dire se qualcosa è nello spazio clip se tutto ciò che devi fare è (molto rozzamente messo ofc): (x / w) <1 && (x / w)> - 1 quindi render. Inoltre, suppongo che avere tutti gli spazi di clip di tutti i vertici della stessa dimensione (quindi ogni cubo di spazio di clip che va da -1 a 1 in ogni dimensione) renda più facile tutto ciò che viene dopo il processo di normalizzazione, visto che da quel momento su tutte le coordinate sono galleggia da 0 a 1 (trascurando ciò che è stato tagliato).


La domanda era perché lo spazio clip è così com'è, non cosa significhi spazio clip. Cioè, qual è il punto di divisione per W.
Nicol Bolas,

2
Risponde alla terza domanda dei 3 punti
elenco

8

TL; DR non è spazio 4D, è 3D più un numero di ridimensionamento che è praticamente sempre 1. Se è 1, puoi ignorarlo e i primi tre numeri sono x, y, z. Altrimenti diventa più complicato.

Ecco una semplice spiegazione. I vertici in 3D dovrebbero avere solo tre componenti

⌈x⌉ v = |y| ⌊z⌋

Se vogliamo manipolarli (ad es. Rotazione, ridimensionamento ecc.) Utilizziamo una matrice. L'esempio più comune ovviamente è la matrice Model-View-Projection (MVP) che trasforma le coordinate del mondo in spazio clip. Come questo:

⌈m11 m12 m13⌉ ⌈x⌉ c = |m21 m22 m23| * |y| ⌊m31 m32 m33⌋ ⌊z⌋

Tuttavia, questo ha un grosso difetto: non puoi fare traduzione. Se [x,y,z]è zero, qualunque msia il risultato sarà sempre zero, quindi non possiamo avere un MVP che includa la traduzione. Ovviamente ci piacerebbe. La soluzione è aggiungere un 1 alla fine dei nostri vettori ed espandere la matrice su 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 osservi una matrice MVP ortogonale - ad es. Da glOrtho()- troverai la 4a fila 0 0 0 1. A volte è persino lasciata implicita.) Se lavori attraverso la matematica vedrai che è la stessa di

⌈cx⌉ ⌈m11 m12 m13⌉ ⌈x⌉ ⌈tx⌉ |cy| = |m21 m22 m23| * |y| + |ty| ⌊cz⌋ ⌊m31 m32 m33⌋ ⌊z⌋ ⌊tz⌋

Il 4 ° componente viene chiamato w, e mentre non deve essere 1, è quasi sempre ( prima trasformazione comunque; successivamente solito è ri-omogeneizzata dividendo il tutto da vettore wquindi è di nuovo 1). È una specie di hack per consentire alle matrici di trasformazione di includere la traduzione.

modificare

Credo che la motivazione originale fosse per le proiezioni prospettiche , impossibili con le coordinate 3D. Ci sono altre trasformazioni che puoi fare solo con i vettori 4D, ma la traduzione è la più facile da capire.


2
Spiega i tuoi voti negativi.
Timmmm,

+1, supponendo che le informazioni siano corrette, questa è stata una buona spiegazione e mi è stata utile. grazie
Luca

1

C'è anche un'altra ragione che vedo e che non è stata menzionata nelle risposte precedenti.

Le matrici di traduzione sono 4x4 in modo da poter tradurre anche l'oggetto in "il mondo". Perché con una matrice 3x3 è possibile ruotare e ridimensionare una coordinata 3d, ma è possibile tradurre una coordinata 3d solo con una matrice 4x4, da qui la necessità di esprimere le coordinate 3d in un vettore 4d.


hai solo "bisogno" di un vettore 4d sotto tali definizioni. una matrice 4x4 non è solo per il semplice scopo di aggiungere come a tutti piace assumere e rivendicare gli altri. se tutto ciò che volevi era aggiungere la traduzione dopo la rotazione (in un punto 3d) avresti semplicemente definito una matrice 4x3. è molto più efficiente se questo è tutto ciò che cerchi. non devi limitarti alle regole che sono state create per un intero gruppo di altri motivi, solo perché sembra più ordinato. lol
Pozza
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.