17/17
10. Camera
Les scènes 3D sont souvent décrites comme contenant des objets géométriques, lumières, et observées par rapport à une caméra dans l’espace. Techniquement, l’objet caméra (tout comme la lumière) n’existe pas en OpenGL. La scène est toujours visualisée depuis les coordonnées normalisées dans le cube de dimension [-1,1]. Obtenir un effet de caméra revient à implémenter une transformation de cet espace. En pratique, déplacer une caméra dans une scène 3D fixe est similaire à déplacer l’ensemble des objets de la scène par rapport à une caméra fixe. C’est ce concept qui est utilisé en rendu projectif. Une caméra se déplaçant dans l’espace est ainsi modélisée par l’application de la transformation inverse (exprimée par une matrice \(4 \times 4\)) à tous les objets de la scène.
On rencontre trois types de transformations appliquées au sommets. Celles-ci sont appliquées dans l’ordre suivant
-
Model : Transformation appliquée à une forme spécifique. Permet de modéliser la transformation d’une forme par rapport à sa position initiale (ex. lors de l’animation d’un objet). Chaque objet est associé à une matrice de transformation model qui lui est propre. Cette matrice permet de passer de coordonnées locales à l’objet en coordonnées du monde (worldspace coordinates).
-
View : Transformation correspondante à l’inverse du repère propre de la caméra dans l’espace du monde. Cette transformation modélise l’effet de la caméra. La même matrice View est typiquement appliquée à l’ensemble des objets de la scène. Cette matrice permet de passer des coordonnées du monde en coordonnées 3D dans le repère de la caméra.
-
Perspective : Transformation projective modélisant l’effet de perspective. Cette matrice est appliquée en dernier et permet de convertir les coordonnées du repère de la caméra en coordonnées de l’espace image (ou plus précisément en clip coordinates).
Interaction avec le modèle de caméra
Le code suivant implémente un modèle de caméra contrôlé à la souris
[ source ]

Notez les ajouts suivants dans le code
-
Fichier vec_mat (hpp, cpp) contiennent des structures en fonctions d’aider pour gérer les vecteurs 3D et matrices \(3 \times 3\) afin de simplifier l’écriture des différentes transformations géométriques.
-
Fichier camera_scene (hpp, cpp) contient l’implémentation des opérations liées à la caméra (changement d’orientation, zoom, pan (translation), etc).
-
Fichier camera_control_helper (hpp, cpp) gère la conversion entre le mouvement de la souris reçu par GLFW (en pixel dans la fenêtre) et la transformation géométrique à appliquer à la caméra.
Les shaders ont été mis à jour afin de prendre en compte la transformation de la caméra (view) ainsi que sa position pour le calcul de l’illumination dans le fragment shader. Le ratio largeur/hauteur de la fenêtre, ainsi que la perspective est également mise à jour lors du redimensionnement de la fenêtre.