Cette page se propose de donner des explications sur la fonction essentielle d'abak . Elle reprend le corps principal de l'article de Jean Michel Soler dans le Diskmag LE REPORTER n° 6 . Un choix de fonte courier new, plus appropriée, rendra les graphismes (il y en a) en alphanumériques plus lisibles. Abak est un programme libre. Sa copie et sa distribution sont autorisées aux risques exclusifs de l'utilisateur.Pour télécharger Abak5. Les sources en pascal sont dsiponibles soit dans LE REPORTER 6 soit sur demande chez l'auteur. Notez que la version 3.0 de POVRAY offre des fonctionnalités équivalentes

. Animation et Raytracing

Soyons un peu direct: ce texte a pour objectif de vous donner une série d'idées sur la manière de faire de petites animations avec Persistance Of Vision. N'en attendez pas des miracles, Abak5 peut cependant rendre de petits services. 1/ Si vous ne savez pas ce qu'est POVRAY. a/ introduction. b/ rendu d'image. b/ raytracing. c/ ses avantages d/ ses inconvénients 2/ Les possibilités actuelles de Pov en matière d'animation. a/ Qu'est-ce que l'animation? b/ Ce que peut faire pov... c/ Les fichiers batchs (1) d/ Quelques outils indispensables: Dta, Aaplay. e/ Clock. f/ Trameur ou Frameur?...,ou doit-on dire d'"abaqueur"? g/ Ce qui prouve que la lecture de TOUS les numéros du REPORTER... h/ Les fichiers batchs (2), améliorations. i/ DEF: ultime solution quand on a pas les moyens de s'offrir un studio d'animation 3D PERSISTANCE DE LA VISION, traduction littérale que j'ai longtemps confondue avec "Persistance de la Mémoire" de Salvator Dali (faut-il être bête?). J'ai envie de voir de la culture là ou il n'y en a pas. Déformation professionnelle, je suppose. Mais excusable dans la mesure où ce logiciel, finalement, permet de rendre visible nos rêves les plus originaux, à la manière de l'imagerie surréaliste et dadaïste. La connexion avec la persistance rétinienne ne s'est jamais vraiment faite, tant, pour moi, cette expression est liée aux effets stroboscopiques, au cinéma, à la vidéo et au dessin animé. Malgrès tous ses avantages, POV n'a jamais été à la hauteur pour le dessin animé. Mais ce n'est pas sa fonction première, POV fait du

--RENDU d'IMAGE--

Qu'est-ce donc que le rendu d'image? Rien de compliqué: à partir d'une description, un script, pour utiliser la dénommination officielle (rgblumen script, pour avoir un exemple détaillé), l'image est construite par le logiciel sous la forme d'un fichier bitmap. Le résultat est toujours une image unique!! (loin du dessin animé : 25/30 images secondes). La particularité de POV c'est de faire du rendu d'image en "raytracing", en bon français nous dirions "suivi de rayon". Exemple: Ray-tracing ? Lancer de rayon Pour résumer, le rendu d'image au travers du suivi de rayon permet d'avoir des effets très proches de la réalité photographique Images de synthèse et "raytracing", ou "suivi de rayon". Voilà un domaine où on aurait une certaine tendance à amalgamer: la 3d, le raycasting, et autres constructions en fils de fer, et toutes ces sortes de choses qui sont sensées donner l'illusion d'un volume, mieux: d'une profondeur. Le raytracing est une solution pour éliminer les faces cachées qui s'est révélée beaucoup plus riche que ne l'avait imaginée ses concepteurs. Il semble être le prolongement naturel de l'algorithme de Warnock(*). Rappel: Pour donner un effet de perspective il faut un point de vue (ou caméra), un écran, un objet à voir, et, un élément indispensable: LA LUMIERE!!! FIAT LUX (donc) ! Dans l'espace et l'optique naturels une partie de la lumière produite par la source lumineuse est réfléchie par l'objet et vient s'écraser sur la rétine de l'observateur (le reste est absorbé, la couleur d'un objet n'est rien d'autre que ce qu'il a bien voulu laisser s'échapper: la lumière blanche étant constituée de composantes Rouge vert et bleu, si le vert et le rouge sont absorbés l'objet paraîtra bleu). exemple:
Dans le raytracing on suit le rayon lumineux de l'oeil de l'observateur jusqu'à l'extrême limite de "l'univers" que l'on a construit(**). (Croquis en alphanum‚riques de l'article original) +----------------------------------------------------------------------------+ | | | écran|\ objet4 | | | \ x------>rayon | | | \ | | | | \ | | | | |\ | | | | | \ objet2 | | | | | \ x----------x objet3 | | |\ | \ \ | | | \ | \ \ | | point de vue | \ | \ \ | | X _______________|______\Y __________|________\x objet1 | | | | | | | | | | \ | | | | | | \ | | | | | | \ | | | | | |_______________________\| __________|_________| | | \ | | | \ | | | \ | | | \ | | | \ | | | \| | +----------------------------------------------------------------------------+ (croq') Pour chaque pixel de l'image (***) on suit au moins un rayon passant par ce pixel et venant de l'oeil-caméra. On teste si le rayon coupe un objet qui se trouve dans cet univers. Si c'est le cas on calcule la reflexion du rayon et on cherche quels autres objets ont pu être touchés. La liste de ces contacts se nomme l'arbre d'intersections. Il peut y avoir de nombreux embranchements car chaque réflexion peut être accompagnée d'une transmission si l'objet est décrit comme transparent. La construction de l'arbre s'achève lorque tous les objets de la scène ont été passés en revue ou lorsque la limite de réflexion paramètrée a été dépassée. On remonte ensuite l'arbre d'intersection en calculant la valeur d'intensité de la lumière à chaque noeud. En dernier lieu on affiche le pixel avec le résultat, ou on sauvegarde la valeur dans un fichier ce qui bien plus économique en temps. Dans le calcul de la valeur finale peuvent intervenir tous les paramètres de l'optiques : réfraction, réflexion, transmission, absorbtion, que l'on peut modifier à volonté avec des passages fins de l'un à l'autre et des jongleries sur la valeur de l'indispensable "normale". +--------------------------------------------------------------------+ | | | normale | | /|\ | | | | | | | | | | | rayon incident | | | \ | _ rayon réfléchi | | _\| | /| | | \ | / | | \ | / | | \ | / | | \ | / | | surface _______________________\|/ _______________________ | | du solide \ | | \ | | \ | | \ | | \ | | _\| rayon transmis | | | | | +--------------------------------------------------------------------+ Mais on peut très bien construire des images très complexes sans rien savoir de tout cela. POV est fourni avec une bibliothèque de textures et de couleurs où tout est déjà décrit. On risque cependant de rencontrer les termes de NORMAL et REFLECTION (à la manière anglaise), plus TRANSMIT qui a été remplacé par la valeur FILTER dans la description de couleur. Ses avantages, ses inconvénients. Le principal avantage de POV c'est son prix! Il est GRATUIT. Ce qui n'est pas le cas de la plupart des autres tracers . Son second avantage: sa simplicité. il n'y a rien de compliqué dans ses déclarations : camera est une caméra, light_source est une source de lumière, object{} definit un objet, sphere est une forme sphérique cone est un cône, box, une boite , etc. Au pire faut-il savoir déchiffrer un bon dictionnaire anglais-français. Il faut cependant reconnaître qu'il n'est pas toujours très évident de lancer ses premiers calculs d'image tant la ligne de commande de povray peut être encombrée par des paramètres. Troisième avantage: malgré les deux premiers il offre des possibilités considérables, qui évoluent et s'enrichissent de version en version. Enfin tout, ou presque tout, est paramètrable, ce qui laisse une liberté totale à l'utilisateur. Et on le trouve sur toute les plate-formes informatiques (sun,linux,mac...). Mon seul reproche: les textures ne sont pas gérées en profondeur. Ce qui paraît plutôt contradictoire, car lorsqu'on fait une coupe en utilisant les fonctions de CSG ( Constructive Solid Geometry) la forme résultante laisse aparaître les dites textures, cependant lorqu'il s'agit d'un volume transparent l'effet est limité à la surface .

Animation et Raytracing

2/ Les possibilités actuelles de Pov en matière d'animation. a/ Qu'est-ce que l'animation? b/ Ce que peut faire pov... c/ Les fichiers batchs (1) d/ Quelques outils indispensables: Dta, Aaplay. e/ Clock. f/ Trameur ou Frameur?...,ou doit-on dire d'"abaqueur"? g/ Ce qui prouve que la lecture de TOUS les numéros du REPORTER... h/ Les fichiers batchs (2), améliorations. i/ DEF: ultime solution quand on a pas les moyens de s'offrir un studio d'animation 3D a/ Qu'est-ce que l'animation ? Retour>> On a fait de l'animation bien avant de faire du cinéma, je ne vous assommerais pas avec les tribulations des zootropes, phénakitiscopes et autres théâtres de lumières. Le principe est simple: des images fixes apparaissent successivement devant le spectateur assez rapidement pour se mélanger sur sa rétine et lui donner l'impression d'un mouvement continu. On rappelera que les images doivent être produites sous la forme d'éclairs et qu'il est question d'effet stroboscopique. Que la durée de l'image sur la rétine porte le nom de persistance rétinienne. En prise de vue directe le mouvement est "haché" mécaniquement et transformé en photographie (durée d'exposition: environ 1/50ième de seconde, à noter que l'on a fait de la "chronophotographie" aussi,bien avant le cinéma, voir à ce sujet les cahiers de Science&Vie consacrés à la vitesse de la lumière où il est question du financement du laboratoire de physiologie de Maray par Jules Ferry dans les années 1880). Pour obtenir la restitution du mouvement il faut projeter ces photographies en respectant le rythme de prise de vue (chaque vue est visible 1/50 de seconde et séparée de la suivante par une pause d'obscurité). En dessin animé le mouvement est créé de toute pièce (****) mais n'est visible, perceptible que si la transformation d'une image à la suivante est cohérente: les différences sont suffisamment proches et vont dans le même sens (qu'il soit rectiligne ou courbe). Exemple :


Il est important de gérer un délais entre le moment de l'affichage et celui où on efface l'image. Un essai avec des paramètres plus réduits permettra de se rendre compte que l'oeil a besoin de cette pause. Tout simplement parce que le déplacement de l'objet est trop important par rapport à sa taille. Une technique de contrôle fin du mouvement passe par les fonctions circulaires. (essai) b/ Ce que peut faire pov... Retour>> (ce que je peux imaginer que l'on peut faire avec pov) En matière de transformations qu' elles sont les possibilités de POV? 3 transformations : SCALE, ROTATE, TRANSLATE 4 opérations arithmétiques : +,-,*,/... et ... c'est tout! On peut faire grossir une sphère : sphere{<0,0,0>,1 scale<1,1,2>} la faire avancer, sphere{<0,0,0>,1 translate<0,0,2>} la faire tourner sur elle-même: sphere{<0,0,0>,1 rotate<0,0,90>} ou en combinant les transformations la faire tourner comme si elle était attachée à un pivot : sphere{<0,0,0>,1 translate<1,0,0> rotate<0,0,90>} Et au moins faut-il être précis et clair sur le fait que ces transformations ne sont possibles que sur des objets déclarés, dans le fichier courant et l'image courante. Hors, ce qui nous intéresse c'est de "voir" l'évolution de ces transformations - d'avoir un suivi des métamorphoses ; et obtenir en fin de compte, un certain nombre d'images pour construire un fichier d'animation. Jusqu'à présent il n'était possible que d'écrire un ensemble(!!) de fichiers pov dans lesquels on introduisait les transformations à la main. On lançait la totalité dans un fichier de traitement par lot. c/ Fichier batch (1) Retour>> Dans la suite d'exemples les noms de fichiers précèdent leurs contenu. exemple (donc) : commum.inc // Les deux slashs permettent de faire des remarques. // Fichier de déclarations communes à toutes les images, // qu'il suffit de déclarer en 'include' au début du fichier // principal. #include colors.inc #include textures.inc //En fait cette partie de l'objet est constante inutile de la //répéter. declare obj= sphere{<0,0,0>,1 translate<4,0,0> pigment{White}} camera{location<0,0,-2> look_at<0,0,0>} light_sourc{<0,10,0> color White} // fin du fichier commun.inc sphere01.pov // premier fichier principal #include commum.inc object{ obj rotate<0,0,0>} //fin du fichier sphere01.pov sphere02.pov // second... #include commum.inc object{ obj rotate<0,4.5,0>} //fin du fichier sphere02.pov sphere03.pov // etc. #include commum.inc object{ obj rotate<0,4.5*2,0>} //fin du fichier sphere03.pov ... sphere80.pov // dernier fichier!! #include commum.inc object{ obj rotate<0,4.5*79,0>} //fin du fichier sphere80.pov pov.bat povray -i%1.pov -o%1.tga -d -A -w480 -h360 +X -Linclude anim.bat call pov sphere01 call pov sphere02 call pov sphere03 call pov sphere04 ... call pov sphere80 ( Rappels des paramètres utilisés dans le fichier pov.bat: -i pour fichier de données, POV -o fichier de sortie,TGA -d pas de sortie écran (gagnons du temps), -A pas anti-crénelage (pour faire une animation ce n'est pas absolument necessaire), +x pour pouvoir arrêter les frais si on perd patience, -L pour déterminer le repertoire de fichiers "include", inutile si les fichiers sont dans le repertoire courant, mais bien pratique si on garder un peu d'ordre sur son disque. ) d/ Quelques outils indispensables! Retour>> On obtient donc 80 fichiers pour pov qui fourniront 80 images au format tga. Mais ce ne sont encore que des images fixes. Il faut construire un fichier FLI (standard de l'animation que l'on doit à Autodesk) pour cela on lance DTA de David K. Mason. Exemple de commande largement suffisante : DTA sphere* qui vous donnera un fichier anim.fli (dta rend toujours un fichier anim.fli, quoi qu'il arrive, donc n'oubliez pas de changer le nom avant de recommencer une compilation d'images) que vous pourrez voir en utilisant AAplay.exe. Méthode très lourde, il ne faut pas se faire d'illusion même avec un ordinateur le travail d'animation est long et fastidieux! Dans ces conditions faire de l'animation est réservé à quelques moines capucins... e/ Clock. Retour>> Dans un sens on peut dire que les dernières versions de POV offrent une amélioration au travers de la variable CLOCK qui permet de simplifier un peu les choses: au mieux on évite d'écrire tous les fichiers POV superflus. Le fonctionnement de CLOCK: POV réserve une variable qui est documentée par la ligne de commande. Ce qui suit le paramètre +K sert à effectuer les calculs. Dans ces conditions le fichier de description peut se limiter à ceci: sphere.pov #include colors.inc #include textures.inc declare obj= sphere{<0,0,0>,1 translate<4,0,0> pigment{White}} camera{location<0,0,-2> look_at<0,0,0>} light_sourc{<0,10,0> color White} // et... object{ obj rotate<0, CLOCK ,0>} anim.bat povray -i%1.pov -o%101.tga -d -A -w480 -h360 +X -Linclude +c +K1 povray -i%1.pov -o%102.tga -d -A -w480 -h360 +X -Linclude +c +K2 povray -i%1.pov -o%103.tga -d -A -w480 -h360 +X -Linclude +c +K3 povray -i%1.pov -o%104.tga -d -A -w480 -h360 +X -Linclude +c +K4 ... povray -i%1.pov -o%80.tga -d -A -w480 -h360 +X -Linclude +c +K80 A la première ligne du fichier batch CLOCK vaut 1, puis 2 à la seconde et ainsi de suite, il suffit de modifier une partie du nom de fichier de sortie avec une extension à la suite du paramètre remplacable %1. Un appel : anim sphere créera les fichiers : sphere01.tga sphere02.tga etc. Clock, est-ce vraiment une solution... Imaginons un instant que dans un délire baroque un projet de mise en scène complexe oblige à gonfler un objet, posé à plat sur le sol, à le faire tourner sur lui-même, à le déplacer de la "hauteur" de sa rotation, vers le haut, tout en faisant changer sa texture, dans un mouvement cyclique le faisant passer d'un système de rayures régulières à un chaos proche du motif des veinures du marbre (!!), et le ramenant au sol plat comme à l'origine. Le tout sur 80 images. On pourrait donner à Clock la valeur du sinus d'1/80ième de PI et le faire augmenter à chaque calcul d'image. Mais pour la rotation il est nécessaire de fournir un entier qui multiplie 2.25. Au moins deux variables... En fait il nous faudrait au moins 4 variables telles quelles sont décrites dans Le fichier NUM.INC. Leurs valeurs changeraient en fonction de l'expression qui les suit. Exemple : Num.inc declare diviseur=80 // [diviseur+0] declare num=1 // [num+1] declare num2=0.0 //[sin(3.14159/diviseur*num)] declare num3=1.0 //[cos(3.14159/diviseur*num)] Le fichier de description du délire baroque ressemble assez à ce qui suit : Sphere.pov #include "colors.inc" #include "textures.inc" #include "num.inc" declare test= texture{ pigment{ gradient x frequency 4 color_map{ [0.0,0.25 color rgb<0,0,1> color Yellow] [0.25,0.5 color Yellow color rgbf<1,0.5,0.7,0.5> ] [0.5,1 color rgbf <1,0.5,0.7,0.5> color rgbf<1,0.2,1,1> ] } turbulence <0.2+ 0.82*(1- NUM3 ), 0.65*(1- NUM3 ), 0.65*(1- NUM3 )> } finish{ brilliance 1 phong 1} } light_source { <0, 12.0, 1> color White} light_source { <-2, 12.0, -2> color White} light_source { <12, 0, 0> color rgb<0.7,0.7,0.5>} camera { location <8.0,2, -17.5> look_at <0, 4,0> } object{ sphere{<0,0,0>,0.5 } texture { test } scale<12,11*(1- NUM3 )+1,12> rotate<2.25* NUM ,0,0> translate<0,6.5*(1- NUM3 )+1,0> } object{ difference{ plane{<0,1,0>,0 } sphere{<0,0,0>,12 scale<1,0.1,1> translate<0,0.5,0>} } pigment{White}} Ce qu'il nous manque c'est un logiciel qui évalue la valeur de ces variables et les remplace chaque fois qu'on refait appel à POV. f/ Qu'est-ce qu'un trameur ou Frameur?..., ou doit-on parler d'"abaqueur"? Retour>> C'est ABAK5.EXE qui traite le fichier 'Num.inc'. Son action permet de compenser l'absence de traitement de fonctions arithmétiques évoluées ou transcendantales (sin,cos,ln,exp...). Et la limitation de la variables modifiable en ligne de commande. 'Num.inc' doit être un fichier de variables, il peut porter un autre nom .Chaque déclaration de variable, est suivie de l'expression qui doit la transformer. Exemple 1: declare num=0.0 //[num+1] ... A chaque passage la valeur de num est augmentée d'un point. Exemple 2: declare num=1.0 //[num+1] declare num2=0.0 //[cos(pi/80*num)] ... On peut déclarer 499 variables différentes, et chacune d'elle peut être utilisée dans les expressions suivantes (un peu comme en pascal où une variable ne peut être traitée par le compilateur avant d'être déclarée). Notes : - L'expression est impérativement sur la même ligne que la variable. - Elle succède une paire de '/', séparateurs autorisé par pov2.2 - Elle doit se trouver entre crochets [] . - Ne doit pas dépasser 256 caractères (partie déclaration pov et caractères espaces compris), en fait: une seule et unique chaine. - Chaque nom de variable ne peut exéder 47 caractères, le surplus est tronqué. - Toutes les lignes qui ne commencent pas par 'declare' sont ignorées, mais recopiées tel qu'elles. h/ Ce qui prouve que la lecture de TOUS les numéros du REPORTER est absolument nécessaire! Retour>> L'évaluation des fonctions est assurée par les procédures du micro évaluateur d'expression décrit par Luc Rivière (alias Legolas) dans LE REPORTER n° 2, que je remercie au passage pour son aimable autorisation. Structure de l'unit micro_ev.pas, construite à partir de très légères modifications de micro.pas : unit micro_ev; interface uses crt; type tident=string[6]; const chiffre:set of char=['0'..'9']; lettre:set of char=['A'..'Z']; nbIdent=18; identificateur:array[1..nbIdent] of tident=( 'PI','AND','OR','MOD','DIV','ABS','ARCTAN','COS','EXP','FRAC', 'TRUNC','LOG','LN','ROUND','SIN','SQR','SQRT','TAN'); procedure evaluation(var ligne:string; var solution:real); implementation .... ici toutes les procédures et les variables qui ne sont pas mises en commun, ... plus, une procedure supplémentaire qui n'est rien d'autre que le programme principal de micro avec des variables externes: ... var resultat:numer; procedure evaluation(var ligne:string; var solution:real); begin chaine:=''; chaine:=chaine+ligne; InitLex; if not(erreur) then expression(resultat); if not(erreur) then begin with resultat do if typ='I' then solution:=xi else solution:=xr; if not(lexCode=termine) then casErreur('ATTENTION! Fin de chaine non évaluée'); end; end; i/ Fichier Batch...(2) Retour>> Hélas pour l'instant, au moment particulier où ces lignes sont écrites, au coeur de la nuit, alors que j'ai 48 heures retard pour la remise de ce texte, il reste un point très sensible à améliorer: la longueur du fichier batch qui doit être utiliser pour rendre toutes les images. Il faut encore au moins deux lignes pour chaque image calculée. Cependant, comme je suis obligé de temps en temps d'arrêter de faire du ray-tracing et le l'animation pour me consacrer à des taches plus ingrates et terre-à-terre (mais, au combien, plus lucratives) il m'a semblé judicieux d'ajouter la possibilité de reprendre le travail à partir de n'importe quel point de la suite des images (en vérifiant qu'il y ait bien dans le fichier de traitement de trame une variable qui initialise toutes les autres à partir de ce point ). En voici un fragment : pova.bat if not "%2"=="" goto %2 :1 if "%3"=="1" goto fin povray -i%1.pov -o%101.tga -d -r -A -w240 -h150 +X +c +v abak5 num.inc :2 if "%3"=="2" goto fin povray -i%1.pov -o%102.tga -d -r -A -w240 -h150 +X +c +v abak5 num.inc :3 if "%3"=="3" goto fin povray -i%1.pov -o%103.tga -d -r -A -w240 -h150 +X +c +v abak5 num.inc :4 if "%3"=="4" goto fin povray -i%1.pov -o%104.tga -d -r -A -w240 -h150 +X +c +v abak5 num.inc :5 if "%3"=="5" goto fin ... :fin rem fin du fichier pova.bat Les paramètres sont : %1 le nom du fichier POV %2 le numero de l'image de départ %3 le numéro de l'image d'arrivée. Exemple : POVA sphere 1 80 Traitera la totalité des images. POVA sphere 5 25 Ne traitera que 10 images. Laisse num.inc augmenté de 10, mais sans vérifier si il a bien commencé à traiter les expressions pour la valeur 5. j/ DEF. Retour>> Povray peut se servir de fichier 'def' dans lesquels on range tous les paramètres dont on aurait bourré la ligne de commande. Grâce à ce type de fichier il doit être possible de réduire ce fichier batch à sa plus simple expression. Une serie de commande s'enchainant jusqu'à ce qu'un fichier 'fin' par exemple soit trouver dans le repertoire courant : pova.bat :oncontinue if exist fin goto sortie povray a.def abak5 num.inc a.def goto oncontinue :sortie del fin rem fin du fichier pova.bat Il faudra modifier ABAK5 pour qu'il reconnaisse la présence d'un second paramètre et dans ce cas particulier: contrôler la présence de deux variables dans le fichier 'inc' qui lui indiqueront le numero de la première image et le numero de la dernière (nom au choix). A partir de ces indications il pourra ouvrir le fichier *.def, y lire le nom du fichier de sortie (derrière '-o')et lui ajouter la valeur de la variable 'num'(on tache de faire suivre la variable num de l'expression [num+1]). Lorsque num est égale à dernière image on crée sur le disque le fichier 'fin' qui arrête l'exécution du fichier batch. Ce sera tout pour cette fois.. Retour>> (ouf...)