★ CODING ★ LISTINGS ★ BASIC - VOLUMES ★ |
Basic - Volumes (Science et Vie Micro) | Coding Listings |
Les lecteurs de SVM semblent passionnés par la représentation d'objets en trois dimensions. Vous avez été nombreux à manifester votre satisfaction, après la publication du programme Tri-Di Animator, de Guillaume Dargaud (SVM n ° 27). Notre gagnant du mois, Hervé Masson, va plus loin, en introduisant les notions de faces cachées et d'éclairage de l'objet. Son programme Volumes, destiné à l'Amstrad CPC 464, permet en outre une saisie directe de l'objet à traiter sans recours à de fastidieuses listes de données numériques. LA REPRÉSENTATION - FIL DE FER - d'un objet dans l'espace a un avanftage : la relative simplicité et donc rapidité des calculs, mais éqalement un défaut fondamental : le manque de réalisme certain du résultat obtenu. Tout simplement parce qu'un objet n'est pas toujours transparent, et que le relief lui est donné par la lumière qu'il reçoit. L'intérêt du programme Volumes est donc double. D'une part en ne donnant à voir de l'objet que les faces effectivement visibles, d'autre part en le décomposant en facettes de différentes valeurs de trame, rendant ainsi compte de l'éclairage auquel il est soumis. Pour ceci, le dessin n'est pas vectorisé sous forme de noeuds et de droites, comme dans Tri-Di Animator, mais sous forme de facettes planes à quatre côtés. Ce procédé est gourmand en mémoire, mais relativement simple à mettre en œuvre. Chaque facette est ainsi mémorisée sous la forme de quatre variables indicées : par exemple, la facette n, délimitée par les points i,j, k et /, est mémorisée sous la forme P (n,0) = i,P (n,1) =j, P (n,2) = k,P (n,3) = l. De même, chaque point / est déterminé par ses coordonnées cartésiennes X(i), Y(i), Z(i). A ce stade, il est désormais simple d'effectuer sur l'objet les transformations dans l'espace habituelles. Le programme Volumes propose seulement les rotations autour des trois axes, l'œil de l'observateur restant fixe, mais rien n'interdit le rajout d'autres transformations, comme dans Tri-Di Animator. Pour l'affichage du dessin ainsi traité, de nouvelles notions doivent intervenir. Et tout d'abord la suppression des faces cachées. Il n'y a pas, dans le programme, d'algorithme spécifique à proprement parler mais une astuce beaucoup plus simple à exploiter : le volume étant constitué de facettes remplies, il suffit de les afficher successivement, en commençant par les plus éloignées. Par superposition, les plus proches recouvrent donc, les plus lointaines, et cachent ainsi les faces indésirables de l'objet. Pratiquement, il faut donc trier les facettes selon un nouveau paramètre, la distance facette-observateur (il s'agit de la variable d(n) dans le programme). Reste maintenant à rendre compte de l'éclairage auquel est soumis l'objet. Là encore, le calcul s'effectue facette par facette, et le résultat obtenu, c'est-à-dire une teinte plus ou moins sombre pour la facette considérée, dépend de l'angle formé par le vecteur qui va de la source de lumière au centre de la facette, avec le vecteur perpendiculaire au plan de la facette. Plus cet angle est important (proche de 90°), moins la facette considérée recevra de lumière. Il suffit donc de créer une échelle de teintes plus ou moins denses (ou plutôt de trames de gris dans le cas présent), qui à chaque valeur d'angle pourra attribuer une valeur de trame.
Création des trames L'Amstrad CPC n'étant doté d'aucune fonction de création de trame, ni dans le cas du 464 d'une fonction de remplissage de zone, Volumes intègre un sous-programme en langage machine qui palliera ce manque. Il s'agit d'une routine qui détourne le système d'exploitation de la machine lors du tracé d'une droite, et n'affiche que certains points en fonction de la trame choisie. La sélection d'une trame T se fait par CALL &A940 , T. La première partie de la routine, implantée en &A900, est chargée précisément de la modification de la fonction DRAW au sein du système. La seconde, implantée en &A940, exploite les trames définies dans des matrices 8 x 8 bits par la troisième partie, implantée en &AA00. Tout se passe dès lors comme si la fonction DRAW, au lieu d'allumer tous les points qui séparent un point d'un autre, n'allumait que certains points, à intervalles plus ou moins rapprochés, selon la densité de trame choisie. Mode d'emploi Par souci de simplicité et également d'efficacité, le programme ne prend en compte qu'un seul type de volumes : les objets de révolution, c'est-à-dire symétriques par rapport à un axe. Exemples : un écrou, un verre, une pièce de jeu d'échecs, etc. Rien n'empêche évidemment l'adaptation à d'autres types de volumes, le noyau du programme ne s'y opposant pas. Mais l'exploration des formes d'objets de révolution est particulièrement bien adaptée à ce genre de programme, les résultats obtenus étant toujours spectaculaires, avec un minimum d'effort. Ainsi, après démarrage du programme par RUN, un écran de saisie de la ligne de définition s'affiche (photo 1). Cette ligne représente l'arête de l'objet, qui, reproduite X fois en rotation autour de l'axe central, dessinera le volume. Pour tracer cette ligne, il suffit de se déplacer sur l'écran au moyen des touches de curseur (l'appui simultané sur SHIFT accélère le déplacement), et de valider Chaque extrémité de droite avec la barre d'espace. La ligne terminée, il suffit d'appuyer sur RETURN. Vous pouvez dès lors choisir les trois angles de rotation de l'objet dans l'espace, c'est-à-dire les mouvements de l'objet sur lui-même, qui permettront de l'observer sous n'importe quelle face. Par défaut, des valeurs arbitraires sont attribuées aux trois angles. Le programme demande ensuite l'angle de la rotation que doit effectuer la ligne de définition (360 ° pour un tour complet, 270 ° pour 3/4 de tour, etc., toute valeur intermédiaire entre 0 et 360 étant possible), et enfin le nombre de méridiens, c'est-à-dire le nombre de fois que la ligne de définition sera reproduite dans l'angle de rotation considéré. Après un temps de calcul plus ou moins long selon la complexité de l'objet traité, il reste à fournir l'échelle (par exemple 1 pour un dessin tel, 0,5 pour un dessin réduit de moitié), l'intensité de la lumière ambiante (de 0 à 16), l'intensité de la source ponctuelle (de 2 à 16), et les coordonnées de la source dans le repère cartésien. Le volume s'affiche dès lors facette par facette (photos 2 et 3). Vous avez ensuite le choix entre définir un nouveau tracé à partir des mêmes données mais en modifiant échelle, intensité et coordonnées de la lumière, sauvegarder le dessin réalisé, ou quitter le programme. Le programme en détails
Nous vous fournissons à la suite du programme proprement dit, un petit programme de réaffichage des dessins stockés, à exploiter indépendamment. La petite routine en langage machine incorporée est simplement destinée à afficher d'un seul coup le dessin. Toutes les données d'écran sont d'abord chargées à partir de l'adresse &4000, puis copiées d'un bloc à partir de l'adresse &C000, début de la mémoire-écran. Le programme boucle de manière à afficher successivement tous les dessins stockés. Tel qu'il est écrit ici, le programme ne tournera que sur Amstrad CPC. A cause de la routine en langage machine bien sûr, et à cause de nombreuses spécificités du Basic Amstrad. Les algorithmes de calcul, en revanche, resteront valables pour n'importe quelle machine. C'est donc dans le domaine de l'affichage que les transformations seront les plus importantes.
|