Synthèse d'Image - TD3 : 3D Scenes: View & Matrix Transformation



Home Research Publications Teaching Personal

Introduction

Dans ce TD, nous allons apprendre à manipuler une scène 3D. Pour ce faire, un squelette de code vous est fourni.

Taches à réaliser

Tout d'abord, téléchargez et décompressez le squelette de code, Le code correspond à une extension du code du TD2.

Angle d'ouverture de la camèra

Nous nous interessons tout d'abord à l'angle d'ouverture de la caméra. Cette commande sera activer lors du clique du bouton du milieu de la souris. Changez la fonction mouse en conséquence. Nous voulons que la différence de déplacement en y s'ajoute à angle.

Translation

Maintenant, essayons de nous translater dans la fenêtre. Cette commande sera activer lors du clique droit de la souris. Changez la fonction mouse en conséquence. De même que précedemment, la différence de déplacement correspond au vecteur de translation. Utilisez glTranslated(x, y, z), avec z=0.
  • Remarque: Il faut avant transformation remettre la matrix identité. Sinon, votre transformation sera effectuée une infinité de fois. Pour celà, utilisez la commande glLoadIdentity();

    Rotation: Trackball

    Nous savons maintenant nous translater, et zoomer sur l'objet. Il ne nous reste que la rotation, qui sera activer lors d'un clique gauche. Changez la fonction mouse en conséquence. La rotation s'effectue par la commande glRotated(angle, axe.x, axe.y, axe.z).
    L'axe et l'angle de rotation sont définies par deux positions: celui du début de parcours de la souris, et celui courant.
  • Tout d'abord: Déterminez un vecteur unitaire 3D correspondant à ces deux positions.
  • L'axe de rotation correspond au produit vectoriel des 2 vecteurs.
  • Le produit scalaire définie quand à lui le cosinus de l'angle

  • Transformation à la chaine

    Vous avez surement remarqué que les différentes transformations repartent de la position initiale. Pour changez cela, vous allez sauvegarder la transformation courante: glGetFloatd(GL_MODELVIEW_MATRIX, matrix); après chaque déclique. Ensuite, pour repartir de la transformation courante: glMultMatrixd(matrix);