Page 1 sur 2
Moebius et animation
Posté : dim. 13 juin 2010, 19:54
par maurice
Bonjour,
Au départ que voulais imiter l'animation qui se trouve ici :
http://fr.wikipedia.org/wiki/Ruban_de_M%C3%B6bius.
Pas de problème pour le ruban ;
Pour l'animation je voulais me contanter d'un point qui se déplace le long du bord.
Code : Tout sélectionner
//Ruban Moëbius avec Asymptote 1.96
import graph3;
import animate;
settings.tex="pdflatex";
settings.outformat="pdf";
settings.render=0; // à commenter si besoin
currentprojection=perspective(5,18,10);
currentlight=light(8,10,2);
//Taille de l'image
size(12cm,0);
//Fonction paramétrique
int k=1;
int n=55;
triple f(pair z) {return ((2+z.x*cos(k*z.y))*cos(2*z.y), (2+z.x*cos(k*z.y))*sin(2*z.y), z.x*sin(k*z.y));}
//Ruban de Moëbius
surface s=surface(f,(-1,0),(1,pi),25,250);
draw(s,blue,black);
//Bord du ruban
animation anim;
path3 bord;
triple[] b=new triple[2*n+1];
b[0]=(3,0,0);
for (int i=1; i<=2*n; i+=1) {
save();
pair a=(1,i*pi/n);
b[i]=f(a);
draw(b[i-1]--b[i],1bp+orange);
anim.add();
}
anim.movie(delay=200);
Si je ne compile que la partie surface, pas de problème, 10 secondes c'est fini.
Si je ne compile que la partie animation (le bord de la surface), 10 secondes et c'est fini (même avec n=55).
Par contre les deux en même temps à plus 5 itérations ça tourne pendant longtemps ... la dernière j'ai interrompu la compilation au bout de 35 min.
Existe-t-il un moyen de rendre la compilation plus rapide (pour n=5, ca crée 11 images, chaque image prend 10 secondes, on est loin des 20-30 min !);
Merci
Maurice
Re: Moebius et animation
Posté : lun. 14 juin 2010, 11:34
par GM
Message pour dire que je constate aussi des problèmes...
... mais comme, en ce moment, il y a pas mal de changements de version d'Asymptote (à nouveau, tout à l'heure (v1.98) pour des pb de gestion de la mémoire sous windows... et des changements importants de la 3D), je ne vais pas creuser la question maintenant.
J'ai fait très peu d'animations avec de la 3D et pas du tout avec des surfaces ainsi définies donc, sans avoir le temps de tester suffisamment, je ne sais pas trop ce qu'il se passe.
Re: Moebius et animation
Posté : lun. 14 juin 2010, 12:55
par OG
Rapidement
j'ai fait quelques tests hier et constaté des pbs avec la projection, settings.render=2,
en format gif ou pdf.
J'ai envoyé un mail à John. Changer de projection en "orthographic" résout la question.
Comme c'est de la 3D, une sortie pdf et settings.render=0 rend effectivement
les choses lentes. Il faut dire que
est exagéré (le 250). Comme j'ai déjà dit ici, il faut donner des valeurs
raisonnables pour les surfaces.
Pour une animation 3D (mon avis) il faut demander settings.render>0, et accepter
des images bitmap.
Ensuite le code
ne correspond pas à l'animation donnée dans le lien, mais peut-être est-ce voulu ?
Pourrais-tu donner le code complet (bord, surface, etc).
Merci
O.G.
Re: Moebius et animation
Posté : lun. 14 juin 2010, 16:50
par maurice
OG a écrit :Rapidement
j'ai fait quelques tests hier et constaté des pbs avec la projection, settings.render=2,
en format gif ou pdf.
J'ai envoyé un mail à John. Changer de projection en "orthographic" résout la question.
OK, je vais essayer.
OG a écrit :Comme c'est de la 3D, une sortie pdf et settings.render=0 rend effectivement
les choses lentes.
Comme je ne sais pas ce que signifient les valeurs de setting.render ca complique les choses.
OG a écrit :Il faut dire que
est exagéré (le 250). Comme j'ai déjà dit ici, il faut donner des valeurs
raisonnables pour les surfaces.
Pardon, je vais essayer avec n=25
OG a écrit :Ensuite le code
ne correspond pas à l'animation donnée dans le lien, mais peut-être est-ce voulu ?
oui, j'avais essayé avec les rectangles mais il y avait des problèmes et j'ai donc simplifié la situation.
Je peux aussi anvoyer le code avec les rectangles si tu veux.
voici le code :
Code : Tout sélectionner
//Ruban Moëbius avec Asymptote 1.96
import graph3;
import animate;
settings.tex="pdflatex";
settings.outformat="pdf";
settings.render=0; // à commenter si besoin
currentprojection=perspective(5,18,10);
currentlight=light(8,10,2);
//Taille de l'image
size(12cm,0);
//Fonction paramétrique
int k=1;
int n=25;
triple f(pair z) {return ((2+z.x*cos(k*z.y))*cos(2*z.y), (2+z.x*cos(k*z.y))*sin(2*z.y), z.x*sin(k*z.y));}
//Ruban de Moëbius
surface s=surface(f,(-1,0),(1,pi),25,n);
draw(s,blue,black);
//Bord du ruban
animation anim;
path3 bord;
triple[] b=new triple[2*n+1];
b[0]=(3,0,0);
for (int i=1; i<=2*n; i+=1) {
save();
pair a=(1,i*pi/n);
b[i]=f(a);
draw(b[i-1]--b[i],1bp+orange);
anim.add();
}
anim.movie(delay=300);
Je vais donc remplacer perspective par orthographic, baisser le n à 25 et le setting.render= ?.
Maurice
Re: Moebius et animation
Posté : lun. 14 juin 2010, 17:09
par GM
maurice a écrit :setting.render= ?.
De toute façon, pas 0, car sinon tu auras le bord orange devant la surface... même aux endroits où elle devrait être derrière : c'est le problème que j'ai avec les exemples 3D que je tente de compiler via le forum.
J'ai testé avec setting.render=2; puis setting.render=4; : cela fonctionne bien.
Bien vu Olivier pour le problème liè à
perspective (plus de problème avec orthographic) : on aurait pu chercher longtemps.
Re: Moebius et animation
Posté : lun. 14 juin 2010, 19:26
par OG
GM a écrit :Bien vu Olivier pour le problème liè à perspective (plus de problème avec orthographic) : on aurait pu chercher longtemps.
De rien, c'est mon côté chercheur qui trouve de temps en temps

O.G.
Re: Moebius et animation
Posté : mar. 15 juin 2010, 00:42
par maurice
Bonjour voici où j'en suis de l'animation de départ (voir .gif en attaché j'ai du baissé la valeur de n à 19 sinon fichier trop gros).
Il reste des problèmes de couleurs et de luminosité.
A régler peut être avec
Voici le code :
Code : Tout sélectionner
//Ruban Moëbius avec Asymptote 1.96
import graph3;
import animate;
settings.tex="pdflatex";
settings.outformat="pdf";
settings.render=2; // à commenter si besoin
//settings.prc=false;
currentprojection=orthographic(5,18,10);
currentlight=light(15,-15,50);
//Taille de l'image
size(12cm,0);
//Fonction paramétrique
int k=1;
int n=25;
triple f(pair z) {return ((2+z.x*cos(k*z.y))*cos(2*z.y), (2+z.x*cos(k*z.y))*sin(2*z.y), z.x*sin(k*z.y));}
//Ruban de Moëbius
surface s=surface(f,(-1,0),(1,pi),25,50);
draw(s,blue);
//Animation
animation A;
real pas=pi/(2*n);
triple O=(0,0,0);
for (int i=0; i<2*n; i+=1) {
save();
pair a,b,c,d;
a=(1,i*pi/n+pas);
b=(1,i*pi/n-pas);
c=(-1,i*pi/n-pas);
d=(-1,i*pi/n+pas);
path3 plan=f(a)--f(b)--f(c);
path3 p=f(a)--f(b)--f(c)--f(d)--cycle;
triple norm=normal(plan);
transform3 t=shift(0.1*norm);
path3 p1=t*p;
path3 p2=(inverse(t))*p;
draw(surface(p1),red);
draw(surface(p2),yellow);
A.add();
restore();
}
A.movie();
//label(A.pdf(BBox(1mm,nullpen),delay=500,"controls,loop"));
dites moi ce que vous en penser et si on peut régler l'éclairage et les couleurs ...
Merci d'avance
Maurice
Re: Moebius et animation
Posté : mar. 15 juin 2010, 06:53
par GM
maurice a écrit :dites moi ce que vous en penser et si on peut régler l'éclairage et les couleurs ...
Mettre plusieurs spots (à bien choisir) pour la surface :
... et mettre un nolight pour les p1 et p2 :
Code : Tout sélectionner
draw(surface(p1),red,nolight);
draw(surface(p2),yellow,nolight);
J'ai testé en modifiant t (transform3 t=shift(0.04*norm);) ... et avec les suggestions ci-dessus :

- 2010-06-15_081113.png (22.03 Kio) Vu 11971 fois
En modifiant les sources de lumière ou en ajoutant encore... tu vas finir par trouver ce qu'il te plait.
Affiner le réglage des lumières sur une seule image... et non sur l''animation.

Re: Moebius et animation
Posté : mar. 15 juin 2010, 07:27
par GM
Je rappelle qu'il y a désormais des subtilités supplémentaires de réglage de compression depuis la version 1.96 (on en est à la 1.98 que j'ai utilisée) :
Nouvelle structure render dans three.asy :
http://asymptote.svn.sourceforge.net/viewvc/asymptote/trunk/asymptote/base/three.asy?view=markup&sortby=rev&sortdir=downqui a amené John a modifié quasiment tous les exemples 3D de la galerie officielle :
Un exemple : sphere.asy
Code : Tout sélectionner
import three;
size(200);
currentprojection=orthographic(5,4,3);
draw(unitsphere,green,render(compression=Zero,merge=true));
Quel est l'impact de l'ajout suivant ?
Je n'ai pas encore testé... mais je me demande s'il n'y a pas compression par défaut (et donc dégradation de la qualité de l'image que je propose ci-dessus) étant donné que je n'ai pas ajouté : compression=Zero, dans l'exemple de Maurice.
Re: Moebius et animation
Posté : mar. 15 juin 2010, 08:25
par GM
maurice a écrit :(voir .gif en attaché)
Je suppose que tu l'as produit directement avec asymptote ?
J'ai tenté de refaire un gif (ce que je n'avais plus fait depuis longtemps).... sous windows, avec la dernière version d'Asymptote
et problème :
Code : Tout sélectionner
C:\Program Files (x86)\Asymptote/animation.asy: 85.15: merge failed
Apparemment un problème avec convert :
Code : Tout sélectionner
int merge(int loops=0, real delay=animationdelay, string format="gif",
string options="", bool keep=settings.keep) {
string args="-loop " +(string) loops+" -delay "+(string)(delay/10)+
" -alpha Off -dispose Background "+options;
for(int i=0; i < files.length; ++i)
args += " " +files[i];write(args);
int rc=convert(args,prefix+"."+format,format=format);
this.purge(keep);
if(rc == 0) animate(file=prefix+"."+format,format=format);
else abort("merge failed");
return rc;
}
sauf que la commande convert semble fonctionner parfaitement en console... donc je ne comprends pas ce qu'il se passe.
Quelqu'un (surtout sous windows) peut-il me dire ce que donne la compilation de ce qui suit ? Merci.
Code : Tout sélectionner
//Ruban Moëbius avec Asymptote 1.96
import graph3;
import animate;
//settings.tex="pdflatex";
settings.outformat="gif";
//settings.render=2; // à commenter si besoin
//settings.prc=false;
currentprojection=orthographic(5,18,10);
currentlight=light((15,-15,50),(-15,15,50));
//Taille de l'image
size(150,0);
//Fonction paramétrique
int k=1;
int n=5;
triple f(pair z) {return ((2+z.x*cos(k*z.y))*cos(2*z.y), (2+z.x*cos(k*z.y))*sin(2*z.y), z.x*sin(k*z.y));}
//Ruban de Moëbius
surface s=surface(f,(-1,0),(1,pi),25,50);
draw(s,blue);
//Animation
animation A;
real pas=pi/(2*n);
triple O=(0,0,0);
for (int i=0; i<2*n; i+=1) {
save();
pair a,b,c,d;
a=(1,i*pi/n+pas);
b=(1,i*pi/n-pas);
c=(-1,i*pi/n-pas);
d=(-1,i*pi/n+pas);
path3 plan=f(a)--f(b)--f(c);
path3 p=f(a)--f(b)--f(c)--f(d)--cycle;
triple norm=normal(plan);
transform3 t=shift(0.04*norm);
path3 p1=t*p;
path3 p2=(inverse(t))*p;
draw(surface(p1),red,nolight);
draw(surface(p2),yellow,nolight);
A.add();
restore();
}
A.movie(keep=true);
//label(A.pdf(BBox(1mm,nullpen),delay=500,"controls,loop"));