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?
Réponses:
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).
la source
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é).
la source
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 importem
le 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 est0 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 parw
donc 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.
la source
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.
la source