Table of Contents

Laboratoire 05

Espace/Repère objet

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.

Espace/Repère du monde

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.

 World Space

Espace/Repère du visualisation

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.

 World Space and View Space

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);

 World Space and View Space

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:

„The engines don’t move the ship at all. The ship stays where it is and the engines move the universe around it.”
- Futurama

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.

Exemple: Si nous voulons regarder l’axe OX (monde) en position (3, 5, 7), le code correspondant à la fonction glm :: lookAt est:

glm::lookAt(glm::vec3(3, 5, 7), glm::vec3(1, 0, 0), glm::vec3(0, 1, 0));

Espace de projection

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.

Matrice de projection

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.

Projection orthographique

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.

 Ortographic Projection

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.

 Ortographic Matrix

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);

Projection perspective

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.

 Perspective View

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.

 Perspective Matrix

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.

 Normalized Device Coordinate Space

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

Espace de coordonnées de périphérique normalisé (NDC)

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.

 Normalized Device Coordinate Space

Exemple de résultat de la projection en coordonnées d'appareil normalisées ( NDC ). Projection orthographique (à gauche), perspective (à droite)

 Normalized Device Coordinate Space

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 )

Application des transformations de modélisation, de visualisation et de projection

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

En laboratoire, il suffit de calculer ces matrices et de les envoyer en tant que paramètre à la fonction de rendu RenderMesh. Les multiples respectifs sont exécutés sur le processeur graphique dans le programme vertex shader qui sera introduit à partir du prochain laboratoire.

Transformations de la caméra

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 .

First-person Camera

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:

Translation de caméra à la première personne

posCamera = posCamera + glm::normalize(direction) * distance;

Rotation de la caméra à la première personne

forward = RotateWorldOY(angle) * forward;
right = RotateWorldOY(angle) * right;
up = glm::cross(right, forward);
forward = RotateLocalOX(angle) * forward;
up = glm::cross(right, forward);

Les matrices de rotation requises peuvent être calculées à l'aide de la fonction glm::rotate

glm::mat4 = glm::rotate(glm::mat4 model, float angle, glm::vec3 rotationAxis);
  • le premier paramètre représente une matrice de modélisation sur laquelle nous appliquons la transformation spécifiée. Quand on n'a pas de transformation précédente, on part de la matrice identité glm::mat4(1.0f)
  • rotationAxis est l'axe vers lequel nous tournons. Dans notre cas, rotation avec OX est le bon vecteur , rotation avec OZ est le vecteur direct ou glm::vec3(0, 1, 0)rotation avec OY global.
  • Étant donné que les vecteurs utilisés correspondent glm::vec3à la multiplication, nous devrons construire un vecteur à 4 composantes pour pouvoir le multiplier par la matrice 4 × 4. Vous pouvez construire le vecteur comme suit:
glm::vec3 forward = ...
glm::vec4 newVec = glm::vec4(forward, 1.0);
  • Si nous voulons faire pivoter le vecteur “en avant” autour de l' axe OY global, nous le faisons:
// 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));

Après avoir effectué les calculs de rotation, assurez-vous de garder les vecteurs normalisés.

glm::vec3 vector = ...
glm::vec3 rezultat = glm::normalize(vector);

Third-person Camera

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

Rotation à la troisième personne

Dans le laboratoire, vous avez la variable distanceToTarget qui maintient la distance jusqu'au point où nous faisons pivoter

La translation du caméra Third-person

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.

Exercices

  1. Implémenter la caméra à la première personne (fichier LabCamera.h )
  2. Implémenter la caméra à la troisième personne (fichier LabCamera.h )
  3. Compléter les fonctions de translation de la caméra de Laborator5::OnInputUpdate()
  4. Compléter les fonctions de rotation de la caméra à partir de Laborator5::OnMouseMove()
  5. Dessinez 2 autres objets dans la scène 3D avec une rotation / mise à l'échelle / translation différente
    • assurez-vous de définir la matrice de modélisation à chaque fois avant de dessiner
    • utiliser glm::translate(), glm::rotate() et glm::scale() pour construire une matrice pour chaque modélisation de l'objet
  6. Changer de perspective / projection orthographique
    • la touche O permet de passer à la projection orthographique
    • la touche P permet de passer à la projection en perspective
  7. Changer le FoV de la caméra dans le cas de la perspective de projection
    • Utilisez 2 touches pour changer le FoV positif et négatif
    • sera utilisé OnInputUpdate()
  8. Changer la largeur et / ou la hauteur de la fenêtre de projection dans le cas de la projection orthographique
    • sera utilisé OnInputUpdate()