Infographie 3D - TP 3 OpenGL

Simulation et réalisme

L'objectif est de simuler le tir d'un obus sur une cible suivant une trajectoire balistique.La cible pourra être simplement modélisée par un parallélépipède. Tout autre choix de forme doit être associé à sa "boîte englobante" afin de simplifier les calculs de collision (voir ci-dessous). Les projectiles que tire le canon peuvent être modélisés par des sphères.

Le canon et la cible doivent être sur des berges opposées. La position de la cible doit se faire de façon aléatoire, tout en restant à l'intérieur de la berge la contenant. Il en va de même pour la position initiale du canon qui doit être déterminée au départ aléatoirement. La cible est a priori immobile. Par contre, le canon est mobile mais ses mouvements sont limités dans une aire correspondant à 1/3 de la longueur de la berge le contenant (donc à 1/6 de part et d'autre de sa position initiale) et de la totalité de sa largeur.

Une fois la position et l'orientation du canon choisies, une simple pression sur une touche déclenche le tir. La trajectoire du projectile est la suivante (dans le plan vertical contenant la courbe de la trajectoire) :

\begin{equation*} d = d_0 + V_h.t \end{equation*}
\begin{equation*} h = h_0 + V_v.t - 1/2\ g.t^2 \end{equation*}

\(V_h\) et \(V_v\) désigne respectivement la vitesse horizontale et verticale du projectile. Le paramètre \(d\) désigne la distance au canon (\(d_0\) est a priori égal à 0) et le paramètre \(h\) la hauteur du projectile en fonction du temps \(t\) (\(h_0\) est la hauteur de la bouche du canon). Ces deux paramètres suffisent, puisque le projectile suit une trajectoire qui débute suivant la position et l'orientation du canon (dit autrement, il doit être affecté par la matrice "modelview" du canon).

La principale difficulté est de détecter la collision entre le projectile et la cible. Etant donné que l'on utilise des transformations modélisées par des matrices, dont OpenGL conserve l'exemplaire courant en sommet de la pile "modelview matrix", on utilisera avec profit la fonction glGetFloatv avec le paramètre GL_MODELVIEW_MATRIX afin de calculer la position absolue du projectile et de la cible et de les comparer. En effet, la matrice courante contient, entre autre, la translation qui détermine la position du ou des objets qui suivent (dans sa dernière colonne, indices 12, 13 et 14).