Pourquoi l'espace clip dans OpenGL a 4 dimensions?

13

Je vais l'utiliser comme référence générique, mais plus je navigue sur des documents et des livres en ligne, moins je comprends cela.

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

dans ce livre en ligne il y a un exemple sur la façon de dessiner le premier et le bonjour du monde classique pour OpenGL sur la création d'un triangle.

La structure des sommets du triangle est déclarée comme indiqué dans le code ci-dessus.

Le livre, comme toutes les autres sources à ce sujet, souligne que le Clip Space est une structure 4D qui est utilisée pour décider essentiellement ce qui sera pixellisé et rendu à l'écran.

Ici, j'ai mes questions:

  • je ne peux pas imaginer quelque chose dans 4D, je ne pense pas qu'un humain puisse faire ça, qu'est-ce qu'un 4D pour cet espace Clip?
  • le document le plus lisible par l'homme que j'ai lu parle d'un appareil photo, qui n'est qu'une abstraction du concept d'écrêtage, et je comprends que, le problème est, pourquoi ne pas utiliser le concept d'un appareil photo en premier lieu, qui est un plus structure 3D familière? Le seul problème avec le concept d'un appareil photo est que vous devez définir le prospectif d'une autre manière et donc vous devez essentiellement ajouter une autre déclaration sur le type d'appareil photo que vous souhaitez avoir.
  • Comment je suis censé lire ça 0.75f, 0.75f, 0.0f, 1.0f? Tout ce que j'obtiens, c'est qu'elles sont toutes des valeurs flottantes et que j'ai la signification des 3 premières valeurs, qu'est-ce que cela signifie la dernière?
user827992
la source
4
Le chapitre 4 explique exactement ce que fait le quatrième composant. En fait, grattez ça; Le chapitre 1 explique la transformation clip-à-NDC dans la section de rastérisation à mi-chemin .
Nicol Bolas
2
@NicolBolas l'auteur donne son explication dans le premier chapitre et ne met aucune référence pour les chapitres suivants, il prétend également expliquer ce qui se passe ensuite en commentant du code c ++ et le problème est que s'il n'explique pas tout en entier le chapitre 1 n'a pas beaucoup de sens pour mettre ce que je suis censé savoir en premier lieu dans le chapitre numéro 4, surtout si j'ai besoin de ces concepts pour décoder ce qui est à l'intérieur du chapitre 1. Je lis ceci maintenant, et pas seulement 1 fois, maintenant je sais que je suis censé chercher plus loin la réponse, je vais parcourir les différents chapitres.
user827992
1
Vous n'avez rien à décoder; il est dit dans le chapitre 1: Le composant W est divisé en 3 autres composants. Cela a également été indiqué dans l'introduction. Ce qui est reporté jusqu'au chapitre 4, c'est pourquoi OpenGL fait cela. Cela est retardé jusqu'à plus tard, car il n'est pas pertinent pour la tâche à accomplir.
Nicol Bolas
3
Il s'agirait toujours d'informations non pertinentes pour le problème en question (c'est-à-dire le rendu d'un triangle). Vous êtes curieux à ce sujet, mais vous n'avez pas besoin de comprendre pourquoi c'est ainsi que de comprendre que c'est ainsi que cela fonctionne. Pour apprendre quoi que ce soit, la première étape consiste à comprendre ce que c'est. Une fois que vous comprenez ce qui se passe, une discussion peut alors avoir lieu pour savoir pourquoi il en est ainsi.
Nicol Bolas
1
Cette réponse peut vous aider.
iammilind

Réponses:

9

Le terme magique est "coordonnées homogènes" qui sont utilisées dans les systèmes où la perspecive est un facteur. Consultez le wiki pour un aperçu, mais c'est un long cours d'étude pour vraiment le comprendre (ce que je ne sais pas).

ddyer
la source
10

Lisez l'introduction des livres que vous lisez, vous serez surpris;)

http://arcsynthesis.org/gltut/Basics/Intro%20Graphics%20and%20Rendering.html sous Rasterization Overview

La valeur "w" (où les 3 premières valeurs sont x, y et z) indique essentiellement les dimensions de l'espace de clip. Comme il s'agit d'une valeur scalaire, les 3 dimensions de l'espace de clip sont égales (et c'est pourquoi l'espace de clip est un cube). Chaque sommet a son propre espace de clip dans lequel il existe (et doit fondamentalement "s'adapter", sinon il CLIPS: D), il n'y a pas 1 "monde" qui est l'espace de clip (bien que tous les espaces de clip soient dans le même " monde "Je pense que même j'ai des problèmes avec ça; P).

Donc si votre sommet a par exemple la coordonnée [1,1,1], si l'espace du clip est 1 alors le sommet est en haut à droite près du coin de l'écran (quand tout est par défaut, je ne sais pas si les directions peut être modifié). Mais si le sommet a un espace de clip de 2, alors la coordonnée [1,1,1] sera quelque part disons, 3 quarts à travers l'écran vers la droite, 3 quarts à travers l'écran vers le haut, et la troisième dimension que vous peut vous deviner.

Je pense qu'avoir disons un espace de clip de 5 signifierait que les emplacements dans cet espace de clip vont de -5 à 5 sur chaque dimension, au lieu que le cube soit 5x5x5. Mais c'est probablement parce que simplement: toutes les coordonnées xy et z sont divisées par la dimension de l'espace du clip, donc fondamentalement vos sommets subissent ceci:

x = x / w

y = y / w

z = z / w

Et c'est ce qui rend tout cela possible. Je pense que la raison pour laquelle cela existe est pour des comparaisons faciles. Si les coordonnées ont été divisées par la dimension de l'espace de clip, alors la coordonnée qui a 1 ou plusieurs composants avec une valeur supérieure à 1, existe en dehors de l'espace de clip. Donc, si votre espace de clip est disons 1024, mais que la coordonnée est [2000,3, -100], alors le composant x (2000) est en dehors de l'espace de clip (qui ne s'étend que de -1024 à 1024).

sur le plan informatique, il est facile de dire si quelque chose se trouve dans l'espace clip si tout ce que vous avez à faire est (très grossièrement mis ofc): (x / w) <1 && (x / w)> - 1 puis restituez. De plus, je suppose que tous les espaces de clip de tous les sommets ont la même taille (donc chaque cube d'espace de clip allant de -1 à 1 dans chaque dimension) facilite tout ce qui vient après le processus de normalisation, car à partir de ce moment, toutes les coordonnées sont flotteurs allant de 0 à 1 (sans tenir compte de ce qui a été coupé).

dammkewl
la source
La question était de savoir pourquoi l' espace clip est tel qu'il est, et non ce que signifie l'espace clip. Autrement dit, quel est le point de la division par W.
Nicol Bolas
2
Il répond cependant à la 3ème question des 3
puces
8

TL; DR ce n'est pas de l'espace 4D, c'est de la 3D plus un nombre d'échelle qui est pratiquement toujours 1. Si c'est 1, vous pouvez l'ignorer et les trois premiers nombres sont x, y, z. Sinon, cela devient plus compliqué.

Voici une explication simple. Les sommets en 3D ne devraient avoir que trois composants

⌈x⌉ v = |y| ⌊z⌋

Si nous voulons les manipuler (par exemple rotation, mise à l'échelle, etc.), nous utilisons une matrice. L'exemple le plus courant est bien sûr la matrice Model-View-Projection (MVP) qui transforme les coordonnées du monde en espace de clip. Comme ça:

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

Cependant, cela a un gros défaut: vous ne pouvez pas faire de traduction. Si [x,y,z]est nul, peu importe mle résultat, le résultat sera toujours nul, donc nous ne pouvons pas avoir de MVP qui inclut la traduction. De toute évidence, nous aimerions cela. La solution consiste à ajouter un 1 à la fin de nos vecteurs et à étendre la matrice à 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⌋

(Si vous regardez n'importe quelle matrice MVP orthogonale - par exemple de glOrtho()- vous trouverez que la 4ème ligne est 0 0 0 1. Parfois, elle est même laissée implicite.) Si vous travaillez à travers les mathématiques, vous verrez que c'est la même chose que

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

Le 4ème composant est appelé w, et bien qu'il ne doive pas nécessairement être 1, il l'est presque toujours ( avant une transformation de toute façon; ensuite il est généralement ré-homogénéisé en divisant le vecteur entier par wdonc il est à nouveau 1). C'est une sorte de hack pour permettre aux matrices de transformation d'inclure la traduction.

Éditer

Je crois que la motivation originale était pour les projections en perspective , qui sont impossibles avec des coordonnées 3D. Il existe d'autres transformations que vous ne pouvez effectuer qu'avec des vecteurs 4D, mais la traduction est la plus facile à comprendre.

Timmmm
la source
2
Expliquez vos votes négatifs.
Timmmm du
+1, en supposant que les informations sont correctes, cela a été une bonne explication et m'a été utile. merci
Luke
1

Il y a aussi une autre raison que je vois et qui n'a pas été mentionnée dans les réponses précédentes.

Les matrices de traduction sont 4x4 afin que vous puissiez également traduire l'objet autour du "monde". Parce qu'avec une matrice 3x3, vous pouvez faire pivoter et mettre à l'échelle une coordonnée 3D, mais vous ne pouvez traduire une coordonnée 3D qu'avec une matrice 4x4, d'où la nécessité d'exprimer les coordonnées 3D dans un vecteur 4d.

Marco
la source
vous "avez seulement besoin" d'un vecteur 4d sous de telles définitions. une matrice 4x4 n'est pas seulement destinée à être ajoutée comme tout le monde aime assumer et revendiquer les autres. si tout ce que vous vouliez était d'ajouter une translation après rotation (à un point 3D), vous définiriez simplement une matrice 4x3. c'est beaucoup plus efficace si c'est tout ce que vous recherchez. vous n'avez pas à vous limiter aux règles qui ont été établies pour toute une série d'autres raisons simplement parce que cela semble plus net. lol
Puddle