Pendant que j'apprends OpenGL, je tombe souvent sur des soi-disant coordonnées de l'espace oculaire.
Si j'ai raison, vous avez généralement trois matrices. Matrice de modèle, matrice de vue et matrice de projection. Bien que je ne sois pas tout à fait sûr de la façon dont les mathématiques derrière cela fonctionnent, je sais que les coordonnées de conversion en espace mondial, espace de vue et espace d'écran.
Mais où est l'espace oculaire et de quelles matrices ai-je besoin pour convertir quelque chose en espace oculaire?
Peut-être que l'illustration suivante montrant la relation entre les différents espaces aidera:
Selon que vous utilisez le pipeline à fonction fixe (vous l'êtes si vous appelez glMatrixMode()
, par exemple), ou à l'aide de shaders, les opérations sont identiques - il suffit de les coder directement dans un shader, ou le pipeline OpenGL vous aide dans votre travail.
Bien qu'il soit dégoûtant de discuter de choses en termes de pipeline de fonctions fixes, cela rend la conversation plus simple, alors je vais commencer par là.
Dans OpenGL hérité (c'est-à-dire, les versions antérieures à OpenGL 3.1, ou utilisant des profils de compatibilité), deux piles matricielles sont définies: model-view, et projection, et quand une application démarre la matrice en haut de chaque pile est une matrice d'identité (1.0 sur la diagonale, 0.0 pour tous les autres éléments). Si vous dessinez des coordonnées dans cet espace, vous effectuez un rendu en coordonnées de périphérique normalisées (NDCs), qui coupe tous les sommets en dehors de la plage [-1,1] dans les deux X, Y , et Z. La transformation de fenêtre (telle que définie en appelant glViewport()
) est ce qui mappe les NDC en coordonnées de fenêtre (enfin, les coordonnées de fenêtre, vraiment, mais le plus souvent la fenêtre et la fenêtre a la même taille et le même emplacement), et la valeur de profondeur à plage de profondeur (qui est [0,1] par défaut).
Maintenant, dans la plupart des applications, la première transformation spécifiée est la transformation transform, qui se décline en deux variétés: les projections orthographiques et les perspectives. Une projection orthographique préserve les angles et est généralement utilisée dans les applications scientifiques et d'ingénierie, car elle ne déforme pas les longueurs relatives des segments de ligne. Dans OpenGL hérité, les projections orthographiques sont spécifiées par glOrtho
ou gluOrtho2D
. Les plus couramment utilisés sont transformations en perspective, qui imitent le fonctionnement de l'œil (c.-à-d., Les objets éloignés de l'œil sont plus petits que ceux proches), et sont spécifiés par glFrustum
ou gluPerspective
. Pour les projections en perspective, ils ont défini un visualisation du tronc, qui est une pyramide tronquée ancrée à l'emplacement de l'œil, qui est spécifiée dans coordonnées de l'œil. En coordonnées oculaires, l '"œil" est situé à l'origine et regarde l'axe -Z. Vos près et plans de délimitation éloignés sont spécifiés comme distances le long de l'axe -Z. Si vous effectuez le rendu en coordonnées oculaires, toute géométrie spécifiée entre les plans de détourage proche et lointain et à l'intérieur du tronc de visualisation ne sera pas supprimée et sera transformée pour apparaître dans la fenêtre. Voici un schéma d'une projection en perspective et sa relation avec le plan de l'image .
L'œil est situé au sommet du tronc de visualisation.
La dernière transformation à discuter est la model-view transform, qui est responsable du déplacement des systèmes de coordonnées (et non des objets; plus sur cela dans un instant) de sorte qu'ils soient bien positionnés par rapport à l'œil et le tronc de visionnement. Les transformations de modélisation courantes sont traductions, échelles, rotations et cisailles (sur qui n’a pas de support natif dans OpenGL).
De manière générale, les modèles 3D sont modélisés autour d'un système de coordonnées local (par exemple, en spécifiant les coordonnées d'une sphère avec l'origine au centre). Les transformations de modélisation sont utilisées pour déplacer le système de coordonnées "actuel" vers un nouvel emplacement afin que lorsque vous effectuez le rendu de votre objet modélisé localement, il soit positionné au bon endroit.
Il n'y a aucune différence mathématique entre une transformation de modélisation et une transformation de visualisation. C'est juste généralement, les transformations de modélisation sont utilisées pour des modèles spécifiques et sont contrôlées par les opérations glPushMatrix()
et glPopMatrix()
, qui une transformation d'affichage est généralement spécifiée en premier, et affecte toutes les opérations de modélisation suivantes.
Maintenant, si vous faites cet OpenGL moderne (versions de profil de base 3.1 et suivantes), vous devez effectuer toutes ces opérations vous-même logiquement (vous ne pouvez spécifier qu'une seule transformation en repliant à la fois les transformations de la vue du modèle et de la projection en une seule matrice multipliée) . Les matrices sont généralement spécifiées comme shader uniforms
. Il n'y a pas de piles de matrice, de séparation des transformations de vue de modèle et de projection, et vous devez obtenir vos calculs corrects pour émuler le pipeline. (BTW, la division en perspective et les étapes de transformation de la fenêtre sont effectuées par OpenGL après l'achèvement de votre vertex shader - vous n'avez pas besoin de faire le calcul [vous pouvez, cela ne fait rien de mal sauf si vous ne parvenez pas à définir w sur 1.0 dans votre sortie gl_Position
vertex shader).
Espace oculaire, espace de vue et espace de caméra sont tous synonymes de la même chose: le monde par rapport à la caméra.