Ce projet a été réalisé d'octobre 1999 à juin 2000.

Ayant déjà des connaissances en programmation mais très peu en 3d, nous avons décidé au début de l'année d'utiliser DirectX 7 en mode retenu. Ce mode contient un moteur 3d peu performant et le modeleur s'averait être inutilisable. De plus nous avions également opté pour DelphiX, une librairie simple d'utilisation mais relativement limitée lorsque l'on souhaite controler les points clés de DirectX. Pour les jeux, cette librairie bien aboutie peut néamoins s'avérer très interessante (Voir la page liens pour le site officiel de DelphiX).

Le mode immédiat de DirectX offrant infiniement plus de possibilité et de puissance, nous sommes passé dans ce mode. Les initialisations étant loin d'être évidentes nous avons du faire beaucoup d'essais avant même d'avoir une face à l'écran :). Les algorithmes des objets ont du être refaits et l'architecture objet du projet repensée lors de ce changement.

Vous trouverez en téléchargement dans la section Download des exemples très simple utilisant DirectX 7 sous Delphi 4 et 5. Certains sont en mode retenu d'autres en mode immédiat.

Voici les points qui nous ont posé le plus de problèmes et comment nous les avons résolu :

Le ray-picking :

C'est la méthode par laquelle lorsqu'on clique sur un objet, il est automatiquement sélectionné. Le problème est de lancer une droite dans la scène grâce aux coordonnées x et y de la souris sur l'écran. Il a fallu tenir compte de la vue considérée (de la caméra) puis regarder quels objets interceptaient la droite et enfin sélectionner le plus proche de la caméra.

 

Rotation des lumières et des objets :

Les rotations ont du être refaites au moins deux fois à cause d'une gestion des rotation des objets par angles et non par vecteurs. Nous avions choisi ce moyen au début de l'année car il semblait assez standard (utilisé par P.O.V. par exemple). C'est à dire que chaque objet possèdait une rotation sur x, sur y et sur z en radians. Le problème vient du fait qu'il est quasiment impossible de repasser de matrices en angles. C'est pourquoi, nous avons tout changé pour une gestion par vecteur. Un objet ou une lumière est donc orienté dans l'espace grâce à un vecteur direction. De plus il est nécéssaire de spécifier une rotation autour du vecteur direction pour les objets. Ceci est réalisé grâce à un vecteur haut. En effet il existe une unique position de l'espace pour laquelle l'axe z initial d'un objet donné est dirigé selon le vecteur direction et pour laquelle l'axe y initial du même objet est dérigé selon le vecteur haut. Le vecteur haut n'est pas nécéssaire pour les lumières car elles sont équivalentes à un cône qui est symétrique par rapport au vecteur direction de la lumière.

 

Les opérations booléennes entre objets :

Nous avons sous estimé la difficulté de ce point et nous l'avions donc inscrit dans le cahier des charges. Il s'est avéré que pour obtenir un résultat parfait (par exemple les mêmes que sous P.O.V.), il fallait passer par lancés de rayons successifs (ray-tracing). Or cette méthode est très lente et ne pouvait nous convenir. Nous avons donc envisagé de procéder par triangles. Autrement dit, lors d'une soustraction A - B, de garder tous les triangles non visibles de l'objet B inclus dans l'objet A, de les inverser (pour qu'ils deviennent visible). On garde alors tous les triangles visibles de l'objet A non inclus dans B. Puis avec ces deux ensembles de triangles on recrée un nouvel objet résultat de la soustraction.

Les résultats n'étant pas satisfaisant, nous avons décidé d'utiliser la méthode du stencil buffer. Des pages traitant du Stencil Buffer pour effectuer des opérations booléennes sont disponibles dans les Liens.