Le plus important est qu'il convertit vos points (sommets) de l'espace monde 3D en espace écran 2D.
Cela signifie qu'après la multiplication du sommet avec cette matrice, les coordonnées X et Y sont positionnées à l'écran (entre [-1, 1]) et Z est la profondeur. Z est utilisé comme tampon de profondeur et identifie la distance entre le sommet (ou le fragment) de vos caméras et le plan.
La projection signifie que les sommets qui sont plus proches du plan proche sont plus loin du milieu de l'écran -> le triangle plus proche de la caméra semble être plus grand que celui qui est loin. Et cela est basé sur votre champ de vision - vous le saisissez dans une fonction createProjectionMatrix ou createFrustum. Cela fonctionne qu'il cisaille et met à l'échelle le tronc de votre appareil photo et les sommets en un cube. Les valeurs supérieures à 1 et inférieures à -1 ne sont pas affichées.
Conserve également le rapport hauteur / largeur des pixels, de sorte que le pixel peut être carré. C’est simple. Il cisaille juste le tronc de la caméra comme ceci: écran plus large -> cisaillement plus vertical et vice versa.
Réponse simple:
il définit le tronc de votre appareil photo et est bon pour:
- faites en sorte que les objets proches de vous paraissent plus grands que les objets éloignés de vous.
- conserver le rapport hauteur / largeur des pixels - Tout le monde aime les pixels carrés, n'est-ce pas? :)
Cette réponse est longue après le fait, mais depuis que je l'ai trouvée sur Google, cela aidera peut-être toujours quelqu'un. Je veux juste clarifier ce que JasonD et Notabene disaient: il est beaucoup plus facile de faire des calculs d'écrêtage (comprendre ce que vous devriez voir et ce que vous ne devriez pas voir en raison de la façon dont vous regardez, de la distance, ect .). Au lieu de vérifier si les choses coupent les plans sur les bords de votre vue, vous comparez simplement les x, y, z de tout à xMax, xMin, yMax, ect. , puisque vous avez simplement un cube. C'est un peu plus compliqué si vous ne voulez avoir qu'une partie de quelque chose à montrer, mais le calcul est encore meilleur avec un cube unitaire qu'avec un tronc.
Quelques choses que j'ai trouvées trompeuses dans d'autres réponses:
- Vous ne coupez pas les côtés du tronc de vue, vous le déformez en un cube en utilisant des transformations matricielles homogènes.
-Nous ne convertissons pas en écran 2D avec cette étape. Cette étape n'est pas nécessaire pour ce faire. Théoriquement, nous pourrions faire tout notre travail sans convertir d'abord le tronc en cube, ce qui serait plus intuitif mais plus difficile en mathématiques - mais les graphiques consistent à faire des calculs très rapidement car il y a BEAUCOUP de calculs par seconde pour le jeu moyen / peu importe.
Plus de détails: ce n'est pas nécessairement un cube unitaire dans lequel nous nous convertissons, il doit juste être une boîte rectangulaire pour que nos calculs max-min fonctionnent. En fait, en classe, nous avons utilisé une boîte où la caméra fait face à l'axe z, z va de 0 à 1, x va de -1 à 1, et y va de -1 à 1. En général en mathématiques 1, 0, et -1 sont de bons nombres pour faciliter les calculs, je suppose que c'est pourquoi nous ne passons pas de -100 à 100 ou quelque chose.
TLDR: Cela facilite l'écrêtage.
Edit: bobobobo a l'essentiel. Tout est triangles, généralement: D.
Source: Suivre un cours universitaire de graphisme
la source
Je pense que c'est parce qu'OpenGL ne peut pas faire d'hypothèses sur la façon dont l'image doit être affichée (rapport d'aspect ou résolution, détails du matériel, etc.). Il rend et l'image dans une forme intermédiaire que le système d'exploitation ou le pilote ou quoi que ce soit à la résolution / taille correcte.
la source
Je note qu'une réponse a déjà été acceptée, mais il est généralement utile pour le découpage de transformer le tronc de vue en un cube unitaire.
la source
Je me posais également la question. Il y a deux ou trois choses à considérer.
Tout d'abord, oui, tout dans le monde est transformé en ce cube unitaire [-1,1] centré autour de l'origine. Si quelque chose n'est pas dans ce cube d'unité, il ne sera pas affiché.
La bonne chose à ce sujet est maintenant, vous pouvez supprimer les triangles assez facilement. (Si les 3 sommets d'un triangle ont
x > 1
oux < -1
alors ce triangle peut être éliminé).la source
Je recommanderais de vérifier la leçon sur la matrice de projection en perspective sur Scratchapixel
http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix
Il explique clairement que le pourquoi est de déformer l'espace de tronc de vue vers un cube unitaire. Pourquoi? Essentiellement parce que le processus de projection de points 3D sur le canevas impliquait de les convertir en espace NDC qui est un espace dans lequel les points sur l'écran sont remappés dans la plage [-1,1] (en supposant que l'écran est carré). Maintenant, nous remappons également la coordonnée Z du point à la plage [0,1] (ou parfois [-1,1]) donc à la fin vous vous retrouvez avec un cube. Le fait est que lorsque des points sont contenus dans un cube, il est plus facile de les traiter que lorsqu'ils sont définis dans la vue frustrum (qui est un espace étrange, une pyramide tronquée). Une autre raison est qu'il apporte en quelque sorte toutes les transformations projectives que vous pouvez imaginer en CG dans le même espace (le cube d'unité). Donc, que vous utilisiez une perspective ou une projection orthographique par exemple,
Mais peut-être que vous vous concentrez trop sur le pourquoi. Le cube unitaire n'est vraiment que le résultat du processus de mathématiques impliqué ou utilisé pour projeter des sommets sur un écran, puis remapper leurs coordonnées en espace raster.
la source