Déboguer les matrices d’affichage OpenGL

Tout le monde qui s’est amusé à faire du OpenGL a dû souffert dès le départ à réussir à faire afficher quelque chose à l’écran. On a beau définir des coordonnées d’objets, cela ne veut pas dire qu’ils feront coucou dans l’écran pour la très simple raison que la « caméra » ne regarde pas la bonne chose.

Savoir où pointe la « caméra » n’est jamais simple puisqu’elle n’existe tout simplement pas; tout ce qui existe, ce sont des matrices. Pourquoi des matrices? Parce que le principe est que nous désirons passer d’une base vectorielle de notre monde virtuel à une base vectorielle d’affichage. Pour passer d’une base à une autre, une matrice permet de contenir le résultat final des transformations (rotation, translation, échelle, etc.) et de simplement la multiplier à des vecteurs de la base à transformer. Cela est très rapide et assez simple pour un ordinateur.

Ceci étant dit, quand nous désirons déboguer, nous avons beau regarder le résultat final de la matrice, si nous ne savons pas c’est quoi la base finale, il est impossible de savoir où notre point devrait être versus où il est.

Après tout ce blabla théorique, voici la réponse: tout ce qu’OpenGL affiche, c’est ce qui est entre -1 et 1. C’est donc un carré 2×2 qui va de (-1, -1) à (1, 1). Alors si nous désirons afficher tous les points qui sont entre (0,0) et (1024, 780) alors il faut une matrice qui transforme (0,0) en (-1, -1) et (1024, 780) en (1, 1). Les points intermédiaires sont proportionnels, par exemple (512, 390) est le milieu dans la base virtuelle et devient (0, 0) pour rester le milieu dans la base d’OpenGL.

Là j’ai parlé des points en deux dimensions, mais c’est le même principe en 3D. Dans ce cas, la matrice va projeter tous les points 3D donnés en coordonnées 2D avec une troisième coordonnée qui sera la profondeur. Tant que cette profondeur est entre -1 et 1, le point sera affiché. C’est au final tout ce qui est dans le cube (-1, -1, -1) à (1, 1, 1) qui est affiché à l’écran.

Bons calculs!