vers l'index général de l'aide
Obtenir des nombres aléatoires qui varient à chaque rendu !
Nous avons vu l'intérêt d'avoir des nombres aléatoires, qui sortent à chaque fois dans le même ordre.
run1 | 5,6,9,1,5,4,2,13... |
run2 | 5,6,9,1,5,4,2,13... |
Mais il peut être souhaitable de retourner à chaque calcul un
ordre différent et laisser le hasard faire les choses..
pour trouver la bonne graine ou pour le fun.
run1 | 5,6,9,1,5,4,2,13... |
run2 | 2,12,50,8,11,30,21,0... |
Pas de mystère, il nous faut récupérer un nombre qui va changer à chaque lancement de calcul.
Nous écrirons un nombre qui sera incrémenté à chaque lancé dans un fichier externe..
#if(file_exists("MetGraine.txt")) // vérifie si Graine.txt existe #fopen LireGraine "MetGraine.txt" read // ouverture du fichier MetGraine en mode lecture #read (LireGraine,Graine) // lecture du nombre aléatoire #fclose LireGraine // fermeture du fichier MetGraine en mode lecture #debug concat(str(Graine,2,3)) // voir dans la fenêtre message (console) pour contrôle #else #declare Graine=1; // S'il n'y a pas encore de fichier MetGraine.txt #end #declare Graine=Graine+1; #fopen MetGraine "MetGraine.txt" write // ouverture du fichier MetGraine en mode écriture #write (MetGraine,Graine) //on met la valeur de Graine dans le fichier MetGraine.txt #fclose MetGraine // Fermeture du fichier MetGraine en mode écriture #debug concat(str(Graine,2,3)) // voir dans la fenêtre message (console) pour contrôle #declare Random= seed(Graine); // met la graine dans seed
Vous voyez que ça sert vraiment à quelque chose, la petite graine !
Utilisation des fonctions date de Megapov04 ( D'après le fichier hasard.inc de Rodolphe Gelaude)
//------------------------------ #declare minute=date("%M") #declare seconde=date("%S") #declare heure=date("%H") #declare jour=date("%j") #declare chiffre1=asc(seconde); #declare chiffre2=asc(minute); #declare chiffre3=asc(heure); #declare chiffre4=asc(jour); #declare final=chiffre1+chiffre2+chiffre3+chiffre4; #declare Random=seed(final);
Encore plus simple utilisation de la fonction
tick_count (MegaPOV 0.5)
#declare Random = seed(tick_count);
tick_count renvoie la valeur du compteur de l'horloge interne
suivant la plate-forme. Le compteur est incrémenté de 60 pour
les Mac et de 200 pour Atari et Intel
Nous allons récupérer l'heure système à l'aide d'un
utilitaire (DoSeed.exe par
Martial ou MkSeed de Jean Michel Soler)
Un nombre sera créé (d'après l'heure système donc jamais
le même) dans un
fichier txt nommé:
PutSeed.txt pour DoSeed ou Vraigrai.txt pour MkSeed
(vers les fichiers Dossed.exe et MkSeed.exe)
Nous lancerons le calcul par un fichier ini (Seed.ini)
placé dans le même répertoire que le fichier exemple
random.pov
;---fichier Seed.ini----- avec Doseed Pre_Frame_Command=Doseed.exe ; Place la commande après chaque page (lancé avec un clock) ; ou l'on créer un nombre aléatoire (Pre_Scene_Command si sans clock) input_File_Name=random.pov ; pour lancer la scène exemple -f ; l'enregistrement de l'image à off Initial_Frame=0 ; pour la scene exemple en animation Final_Frame=5 Initial_Clock=0 Final_Clock=1 ;---------Fin Seed.ini-----
Puis lirons le nombre dans un fichier pov.
//--------------Fichier Pov--------- #fopen LireGraine "Putseed.txt" read // ouverture du fichier Putseed en mode lecture #read (LireGraine,Graine) // lecture du nombre aléatoire #fclose LireGraine // Fermeture du fichier Putseed en mode lecture #debug concat(str(Graine,2,3)) // voir dans la fenêtre message (console) pour contrôle #declare Random= seed(Graine); // met la graine dans seed //-----fin fichier pov------
Remplacer Doseed.exe par MkSeed.exe si c'est votre choix et PutSeed.txt par Vraigrai.txt
//---------Ramdom.pov fichier exemple-------- //------- insérer ici votre façon de faire des aléatoires de nombres aléatoire // Pur POV-Ray 3.1 // MegaPov04 // Bricolage Externe pour POV-Ray 3.1 //----------fin insertion----------------------- #declare Z=50; camera { orthographic location < 0.0 , 0.0 ,-20.0 > right < Z*(160/120), 0, 0 > up < 0,Z,0 > direction < 0,0,1 > look_at < 0.0 , -0.0 , 0.0 > } light_source { < 0,10,-100 > rgb 2} background { rgb 0.1} #declare i=20; #while ( i>- 20 ) sphere { <0,0,0>,3 pigment { rgb < rand(Random),rand(Random),rand(Random) > } finish { ambient 0.3 diffuse 0.6} translate x*-i*1.4} #declare i = i-4; #end //----- Fin Exemple -----
http://martial.rameaux.free.fr/outils/doseed.zip
http://martial.rameaux.free.fr/outils/mkseed.zip
vers l'index général de l'aide
rédacteur : Martial Rameaux