L'espace objet est également appelé ESPACE DES COORDONNÉES LOCALES.
Afin de pouvoir travailler plus efficacement et de réutiliser les objets 3D définis, chaque objet est généralement défini dans son propre système de coordonnées. Les objets simples ou procéduraux peuvent être définis directement à partir du code, mais la plupart des objets utilisés dans les applications 3D sont spécifiés dans un programme de modélisation tel que 3D Studio Max , Maya , Blender , etc. En définissant indépendamment chaque objet 3D, nous pouvons appliquer une série de transformations rotationnelles, scalaires et de translation pour rendre l'objet dans la scène 3D. Un objet chargé peut être affiché plusieurs fois à l'aide de matrices de modélisation , une pour chaque instance de l'objet initial, qui conservent les transformations 3D appliquées à ces instances.
En général, chaque objet 3D est défini avec le centre (ou le centre de la base, comme dans l’illustration ci-dessous) à l’origine de son propre système de coordonnées, ce qui permet d’appliquer plus facilement les transformations de modélisation. Ainsi, la rotation et la mise à l'échelle au centre lui-même sont toujours effectuées par rapport à l'origine.
L'espace mondial ou l'espace GLOBAL COORDINATES est représenté par la matrice de modélisation , la même que celle mentionnée ci-dessus. La matrice est obtenue par une série de rotations , d' échelles et de translations . En multipliant chaque sommet d'un objet (maillage 3D) avec cette matrice, l'objet sera déplacé de l'espace local vers l'espace mondial, c'est-à-dire le passage des coordonnées locales aux coordonnées globales.
En utilisant différentes matrices de modélisation, nous pouvons placer un objet sur la scène à plusieurs reprises, à différents endroits, avec une rotation et une mise à l'échelle différentes si nécessaire. Un exemple est présenté dans la scène ci-dessous.
L'espace du visualisation ou l'espace de caméra est représenté par la matrice de vue .
La matrice de modélisation positionne les objets dans la scène, dans l'espace mondial. Mais une scène peut être vue de plusieurs points de vue. Pour cela, il y a la transformation de visualisation. Si nous avons plusieurs objets dans une scène, chaque objet a une matrice de modélisation différente (qui le déplace de l'espace objet vers l'espace monde), mais tous les objets ont la même matrice de visualisation. La transformation de visualisation est définie pour toute la scène.
Dans l'espace mondial, la caméra peut être considérée comme un objet ayant les 3 axes locaux OX, OY, OZ (voir la photo). La matrice de visualisation peut être calculée à l'aide de la fonction glm::lookAt.
glm::mat4 View = glm::lookAt(glm::vec3 posCameraLume, glm::vec3 directieVizualizare, glm::vec3 cameraUP);
Ox, Oy, Oz sont les axes du système de coordonnées du monde (espace de scène 3D). Le point O n'est pas marqué dans l'image. O'x ', O'y', O'z 'sont les axes du système de coordonnées de l'observateur (l'espace d'observation). Le point O 'n'est pas marqué dans l'image (il se trouve à l'intérieur de la machine).
Le vecteur forward est la direction dans laquelle l'observateur regarde et est également normal pour le plan de visualisation (le plan étant la base du volume de visualisation, qui ressemble à une pyramide et est marqué d'un contour orange). Le vecteur right est la bonne direction du point de vue de l'observateur. Le vecteur up est la direction ascendante du point de vue de l'observateur.
Dans l'image, l'observateur est légèrement incliné, intentionnellement vers le bas, vers son propre système d'axes. Lorsque l'observateur est parfaitement aligné sur les axes, la droite coïncide avec + x ', la haut coïncide avec + y' et l'avant coïncide avec -z '. Dans l'image, on peut voir que up ne coïncide pas avec + y ', et que forward ne coïncide pas avec -z'.
Le vecteur “up” est projeté dans le plan de visualisation, la direction de projection étant parallèle à la normalisation par rapport au plan de visualisation. Sa projection donne la direction de l'axe vertical du plan de visualisation.
Dans l'espace du monde, la caméra peut être considérée comme un simple objet 3D sur lequel nous appliquons les transformations de rotation et de translation. Si dans l’espace mondial, la caméra peut être positionnée n’importe où et dans n’importe quelle orientation. Dans l’espace de visualisation (la zone d’observation), la caméra est toujours positionnée dans (0,0,0) et regarde dans la direction OZ négative.
La matrice de visualisation contient les transformations de rotation et de translation, de même que la matrice de modélisation. Par conséquent, si nous maintenons la scène en place et déplaçons la caméra, ou si nous tenons la caméra en place et faisons pivoter / traduire la scène, nous obtenons le même effet:
Cependant, les deux matrices ont des objectifs différents. L'un sert à positionner des objets dans la scène et l'autre à visualiser la scène entière du point de vue de la caméra.
glm::lookAt(glm::vec3(3, 5, 7), glm::vec3(1, 0, 0), glm::vec3(0, 1, 0));
Après avoir appliqué la transformation de visualisation, dans l’espace de visualisation, la caméra est à l’origine et regarde vers - OZ . Pour pouvoir visualiser ces informations à l'écran, il est nécessaire de projeter l'espace visualisé par la caméra dans un espace 2D. L'espace visible de la pièce pouvant être de différentes sortes, le plus souvent le tronc pyramidal ( projection en perspective ) ou le parallélipipède ( projection orthographique ), il est nécessaire de passer à OpenGL vers un espace final appelé espace de projection qui représente un cube centré à l'origine avec dimension 2, donc les coordonnées X, Y, Z sont comprises entre -1 et +1.
À partir de l'espace de projection, il est très facile d'obtenir mathématiquement la projection 2D finale dans la fenêtre, il suffit de mapper les informations du cube [-1,1] à l'échelle correspondante dans la fenêtre définie par l'application.
Le passage de l'espace de visualisation à l'espace de projection s'effectue également à l'aide d'une matrice, appelée matrice de projection , calculée selon le type de projection défini. La bibliothèque GLM offre des fonctions de calcul pour les deux méthodes de projection les plus utilisées dans les applications 3D, à savoir: la projection en perspective et la projection orthographique
Les données (sommets dans l'espace de visualisation) sont multipliées par la matrice de projection pour obtenir les positions correspondantes dans l'espace de projection.
Dans la projection orthographique, l'observateur est placé à l'infini. La distance à la géométrie n'influence pas la projection et ne peut donc pas être déterminée de manière visible à partir de la projection. La projection orthographique préserve le parallélisme des lignes de la scène.
La projection orthographique est définie par la largeur et la hauteur de la fenêtre de visualisation, ainsi que par la distance de visualisation entre le plan proche et le plan distant . À part ce volume, les objets ne seront plus visibles à l'écran.
La matrice de projection peut être calculée à l'aide de la fonction glm::ortho où les points gauche, droit, bas et haut sont relatifs au centre de la fenêtre (0, 0) et définissent la hauteur et la largeur de la fenêtre de projection.
glm::mat4 Projection = glm::ortho(float left, float right, float bottom, float top, float zNear, float zFar);
La projection perspective est représentée par un tronc de pyramide (tronc) défini par les 2 plans, le plus proche et le plus éloigné , ainsi que par l'ouverture des angles de vision sur les 2 axes, OX et OY. Dans la projection en perspective, la distance jusqu’à un point du volume de visualisation influence la projection.
Dans ce cas, la matrice de projection peut être calculée à l'aide de la fonction glm::perspectivequi reçoit comme paramètres l'ouverture du champ de vision ( FoV ), le rapport entre la largeur et la hauteur de la fenêtre de visualisation ( rapport d'aspect ), ainsi que la distance jusqu'à 2. Plans zFar et zNear.
Dans le cas de la projection en perspective, après avoir adouci les coordonnées dans l'espace de vision, la composante de chaque sommet est différente, ce qui signifie que l'espace de projection n'est pas le même pour chaque sommet. Pour amener tous les vecteurs dans le même espace, divisez chaque composante du vecteur résultant par la composante w . Cette opération est effectuée automatiquement par le processeur graphique, dans une application ne nécessitant que la multiplication par la matrice de projection.
Volume de la vue en perspective (à gauche ) et résultat obtenu (à droite ) suite à l'application de la transformation de projection à la géométrie de la scène
Après application des transformations Modélisation , Visualisation et Projection , puis en divisant les vecteurs par W , nous obtenons l’espace de coordonnées normalisé ( NDC ) représenté par un CUB centré à l’origine (0, 0, 0) avec la face 2. Les informations contenues dans ce cube peuvent être: projetez facilement sur toute surface de dessin 2D définie par l'utilisateur.
Exemple de résultat de la projection en coordonnées d'appareil normalisées ( NDC ). Projection orthographique (à gauche), perspective (à droite)
Exemple de vue de l' espace NDC à partir de la direction de la caméra (à gauche ) et de la projection correspondante pour une fenêtre particulière (à droite )
Les transformations de modélisation, de visualisation et de projection s’appliquent en multipliant chaque sommet de la géométrie de la scène par les 3 matrices calculées.
pos_vertex = Projection * View * Model * pos_vertex
L'implémentation d'une caméra dans une application 3D dépend des exigences de l'application. Dans la pratique, les types d’implantation de salles les plus utilisés sont les suivants: première personne et troisième personne .
La caméra à la première personne suppose que la scène 3D est vue à partir des yeux d'un observateur souvent humain. Les contraintes d'implémentation sont les suivantes:
posCamera = posCamera + glm::normalize(direction) * distance;
forward = RotateWorldOY(angle) * forward; right = RotateWorldOY(angle) * right; up = glm::cross(right, forward);
forward = RotateLocalOX(angle) * forward; up = glm::cross(right, forward);
glm::rotate
glm::mat4 = glm::rotate(glm::mat4 model, float angle, glm::vec3 rotationAxis);
glm::vec3 forward = ... glm::vec4 newVec = glm::vec4(forward, 1.0);
// get the rotate vec4 vector glm::vec4 newVector = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0, 1, 0)) * glm::vec4(forward, 1); // extract the vec3 vector and then normalize it forward = glm::normalize(glm::vec3(newVector));
glm::vec3 vector = ... glm::vec3 rezultat = glm::normalize(vector);
Dans le cas d'une caméra de type 3ème personne, l' observateur se déplace autour d'un objet d'intérêt, qui représente toujours le centre de l'attention. Donc, les rotations se font de manière différente
La position de la caméra dépend de la position du point d'intérêt. Ainsi, le mouvement du point d’intérêt déterminera également la traduction de la caméra en conséquence.
glm::translate()
, glm::rotate()
et glm::scale()
pour construire une matrice pour chaque modélisation de l'objet