Quel est le but du volume de vue canonique?

15

J'apprends actuellement OpenGL et je n'ai pas pu trouver de réponse à cette question.

Une fois la matrice de projection appliquée à l'espace de vue, l'espace de vue est "normalisé" de sorte que tous les points se trouvent dans la plage [-1, 1]. Ceci est généralement appelé «volume de vue canonique» ou «coordonnées normalisées de l'appareil».

Bien que j'aie trouvé beaucoup de ressources me disant comment cela se produit, je n'ai rien vu sur la raison pour laquelle cela se produit.

Quel est le but de cette étape?

pain de jésus
la source

Réponses:

7

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? :)
Notabene
la source
Je ne vois aucune partie où il demande ce que fait la matrice de projection. Il semble simplement se demander à quoi servent les coordonnées normalisées de l'appareil.
Chris dit Réintégrer Monica
La matrice de projection définit le tronc de la caméra. Mais cela n'explique pas la raison d'avoir [-1,1] comme volume de visualisation canonique. Pourquoi ne pas avoir [-100,100] à la place?
bobobobo
1
parce que 1 est "un nombre plus commun" que 100: D (0 est encore plus commun, mais le cube 0x0x0 n'est pas très intéressant ...)
Ivan Kuckir
5

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

Brian
la source
Bien qu'intéressant, il semble que vos points soient partiellement vrais. Vous n'utilisez pas une matrice homogène, c'est juste que dans l'espace clip, les points sont définis dans l'espace homogène. 2) vrai, dans l'espace clip, les ponts ne sont pas encore projetés sur l'écran. Cela se produit après la division de la perspective, mais notez que cela se produit nécessairement lorsque vous revenez de l'espace de clip à l'espace cartésien. 3) oui et non. La conversion des coordonnées des points en espace NDC est encore en quelque sorte nécessaire. Ce qui n'est pas nécessaire, c'est l'espace de clip, qui est spécifique au GPU. ...
user18490
... C'est la scène de l'espace clip qui n'est pas nécessaire, pas le remappage au cube unitaire. Votre dernière hypothèse n'est pas correcte non plus. Vous remappez à -1 en 1 car il est plus facile de passer ensuite de l'espace NDC à l'espace raster (la transformation de la fenêtre). C'est en fait encore plus facile si vous l'espace NDC est dans la plage [0,1] ce qui est le cas pour certaines implémentations. À la fin, tout est mathématique, alors assurez-vous que d'autres conventions peuvent être utilisées. voir le bon site scratchapixel pour plus de détails.
user18490
1

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.

Chewy Gumball
la source
Vous n'êtes pas correct lorsque vous parlez des détails du matériel. Il n'y en a pas. De plus, si vous écrivez, vous possédez rastarizator sur cpu (pourquoi le faire? Pour apprendre comment ça marche :)) vous utilisez les mêmes matrices que sur gpu. Vous avez de la chance que je n'ai toujours pas le privilège de voter :)
Notabene
N'a-t-il pas besoin de connaître les proportions? D'après ce que je comprends, il stocke les facteurs d'échelle pour X et Y afin que l'image ait le rapport d'aspect correct plus tard.
breadjesus
3
Corrigez-moi si je me trompe, mais il parle après avoir projeté des points, et donc nous parlons 2D. Si c'est le cas, OpenGL ne sait pas où sur l'écran vous placez cette image, ni comment elle va être affichée. Il crée une image qui est ensuite facile à mettre à l'échelle et à placer correctement, mais il ne le fait pas pour vous. Je suis d'accord que les détails du matériel étaient une mauvaise réputation, je voulais simplement dire ce qui précède. En outre, vous pouvez spécifier une matrice de projection avec un rapport d'aspect, mais ce rapport ne doit pas nécessairement être le même que celui de votre moniteur.
Chewy Gumball
3
Je dois dire que j'apprécie vraiment cette conversation. Vous êtes sur le point d'avoir raison. Allons plus loin. Il n'y a pas d'image après les sommets de multiplacation par projMat. Le résultat est juste un ensemble de points 2D avec profondeur. La rastarisation commence et crée des images. (si sur cpu il dessinerait des lignes entre les triangles verts et le remplirait (et le nuancerait n'importe quoi) ... sur gpu il est exécuté juste avant le pixel / fragment shader). Et le rapport d'aspect place les points qui doivent être "mis à l'échelle" à des valeurs supérieures à 1 ou inférieures à -1 et ils ne seront pas affichés.
Notabene
2
AHHH! Je vois le problème ici. Il a dit: "Ceci est généralement appelé" volume de vue canonique "ou" coordonnées normalisées de l'appareil "". Je répondais comme s'il posait des questions sur les coordonnées normalisées des appareils, mais il ne les posait pas du tout. Ce sont, en fait, deux choses complètement différentes et c'est pourquoi nous sommes en désaccord ici. Peut-être que cela devrait être clarifié pour que les gens ne commettent pas la même erreur que moi.
Chewy Gumball
1

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.

JasonD
la source
Certes, j'ai peu modifié ma réponse pour être plus clair à ce sujet.
2010
Au fait, un cube unitaire est un cube de la face 1. Le nom est donc inapproprié. Il devrait plutôt être appelé volume de visualisation canonique.
user18490
1

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 > 1ou x < -1alors ce triangle peut être éliminé).

bobobobo
la source
0

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.

user18490
la source