Image non trouvée ! Boing Ball

 

Un peu d'histoire...

La boing ball (de RJ Mical) était une petite démonstration de la société Amiga Inc. dont le système intéressait à la fois la société Atari et Commodore Business Machines (CBM). Amiga sera par la suite rachetée par la société Commodore Business Machines et la boing ball deviendra l'emblème des machines Amiga de Commodore, comme la pomme est l'emblème d'Apple !

On notera que cette même démonstration sera ensuite faite sur les machines ST d'Atari en 1985. Certainement, histoire de montrer que les machines Atari pouvaient faire la même chose qu'un Amiga...

Le secret pour faire cela de manière rapide sur un Atari était assez simple (je suppose que c'était similaire sur un Amiga):

A l'époque, les machines ne pouvaient pas gérer un nombre important de couleurs affichables simultanément à l'écran qu'aujourd'hui. On se contentait de 16 ou 32 couleurs au mieux mais sur une palette quand même plus large (512 voire 4096 couleurs).

La définition des 16 ou 32 couleurs passait alors par un registre de couleur qui contenait les composantes RVB de notre couleur. Les pixels de l'écran indiquaient simplement le registre de couleur à utiliser. Gros avantage, la taille mémoire de l'écran était bien inférieure à celles d'aujourd'hui. Les microprocesseurs de cette époque avaient donc moins de travail à faire.

Il s'agissait d'avoir une image de balle en 3 dimensions. un carré blanc et un rouge étaient en fait composés de n lignes verticales chacunes de ces lignes étant associées à un seul registre de couleur. Ce qui était alors équivalent à faire ceci:

  Carré blanc composé de 8 lignes Carré rouge de 8 autres lignes
Registre 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Dans l'exemple ci-dessus, les registres de 1 à 8 auront la couleur blanche. Les registres de 9 à 16 auront la couleur rouge. Il faut recopier cette séquence dans tous les couples de carrés blanc et rouge. Il suffira ensuite de déplacer par une sorte de rotation vers la droite la couleur de chacuns des registres vers leurs registres immédiatement suivants (registre n+1 = couleur registre n), la couleur du registre 16 passant dans le registre 1, et vous obtenez une impression de rotation de l'image. Pas de calcul particulier à faire, développement hyper simple et c'est ultra rapide ! Pour donner l'impression d'une balle qui rebondi, il restera à gérer un sprite contenant cette image que l'on déplace en x et y.

De nos jours, cette méthode serait plus difficile à mettre en oeuvre, car la notion de registre n'est plus vraiement utilisée (sauf pour les vieilles résolutions). En effet, chaque pixel à l'écran peut avoir sa propre couleur. Il y aurait alors beaucoup trop de registres de couleur !

Cela implique de faire une vraie balle en 3D, et là OpenGL devient intéressant ...

 

Prétexte

La boing ball n'est qu'un prétexte pour pouvoir étudier différentes petites choses:

Nous allons faire une balle qui va rebondir sur un mur de cube. Ce mur de cube devra se positionner sur la trajectoire de la balle et ceci par rotation autour de l'axe z. Un autre mur de cube sera placé dans le fond.

Pour y parvenir, nous aurons besoins:

- D'objets 3d que nous allons nous définir dans une nouvelle classe d'objets:Une classe objet3D avec un minimum de méthodes, puis des dérivations de cette classe en classe sphère et en classe cube pour l'instant. Normalement, le découpage devrait permettre de compléter si on le souhaite plus tard avec d'autres formes...

Ces objets nous permettront de revenir aussi sur les normales...

- Nous aurons aussi besoin d'une fenêtre Windows avec une gestion 3D via OpenGL. Suivant les cartes graphiques et les performances générales du PC, il faut que l'animation soit toujours à la même vitesse (hors cas des machine vraiment trop lente ...)

 

Etudes

- Les objets 3D.

  • Introduction
  • Equation d'une ellipsoïde
  • Equation d'une sphère
  • Les vecteurs normaux dans une sphère
  • Les vecteurs normaux dans une ellipsoïde
  • Rendre unitaire les vecteurs normaux
  • Préparer nos objets
  • Clonage d'un objet sous OpenGL
  • Retour à la Boing Ball
  • Les codes pour les quadriques
  • Le cube
  • Les codes pour les polyèdres


- La Boing Ball

  • Le déplacement de la balle: Elle se fera à partir d'une équation du second degré (Voir cours de physique sur la chute d'un corps avec une vitesse initiale).
  • La collision entre le mur et la balle est fixée suivant des valeurs atteintes par la balle. Rien n'empêchera cependant de rajouter une méthode "collision" dans nos objets 3D.
  • Pour ne pas avoir un effet trop moche, la caméra sera placée initialement suffisamment loin pour ne pas afficher notre pauvre décor. Elle se rapprochera ensuite vers notre décor tout en décélérant au fur et à mesure de son approche vers son but (Utilisation de la fonction exponentielle qui s'y prêtera très bien ici !) avec en plus une petite rotation autour de l'axe X (Calcul des valeurs correspondantes sur l'axe Y et Z suivant l'équation d'un cercle).
  • Nous utiliserons la fonction glutIdleFunc(void (*func)(void)) qui permet de lancer un traitement lorsque le système s'embête (Plus d'affichage, de clavier ou d'information sur la souris à traiter pour notre fenêtre). Ce traitement nous servira à calculer l'animation.
  • Le traitement permettant de calculer l'animation sera lui même temporisé via la fonction setitimer qui déclenchera un signal SIGALRM lorsque le temps sera écoulé. Ce signal déclenchera une procédure qui se contentera de positionner un booléen. L'état de ce booléen étant lu lors du traitement de l'animation pour savoir s'il faut recalculer une nouvelle animation ou non. A noter que l'on ne peut pas positionner l'animation directement dans la procédure lancée suite au SIGALRM, car nous ne serions pas si la fenêtre existe toujours ou non dans cette procédure.

D'où les codes suivant:

Pour la sphère (rappel):

Les .CPP:

Image non trouvée !

Les .H correspondants:

Image non trouvée !

Pour le cube (rappel):

Les .CPP:

Image non trouvée !

Les .H:

Image non trouvée !

Pour animer le tout:

Image non trouvée !

Et voici pour les linuxiens le fichier makefile pour compiler le tout : Image non trouvée !

Image non trouvée !Si lors de la compilation vous obtenez: Référence au symbole non défini _ZTVN10__cxxabiv117__class_type_infoE@@CXXABI-1.3

c'est qu'il faut ajouter -lsupc++ lors de la construction de boing.

De même, si vous obtenez Référence au symbole non défini expf@@GLIBC_2.2.5

c'est qu'il manque la librairie libm. il suffit donc d'ajouter -lm lors de la construction de boing.

Soit:

boing : boing.o objet3d.o quadrique.o spheroide.o sphere.o polyedre.o hexaedre.o parallelepipede.o cube.o
gcc boing.o objet3d.o quadrique.o spheroide.o sphere.o polyedre.o hexaedre.o parallelepipede.o cube.o -o boing -lGL -lGLU -lglut -lsupc++ -lm