Page 1 sur 1

Labels en 3D (Embbed)

MessagePosté: Samedi 05 Mars 2011, 16:12
par cjorssen
Bonjour à tous,

Je cherche à placer des labels en 3D, figés. Pour cela, j'utilise l'"interaction" Embedded (par opposition à Billboard par défaut). J'aimerais leur faire subir des rotations successives. Le problème c'est que je ne comprends pas bien où se trouve (dans quel plan) le label avant de lui faire subir les rotations.

Dans l'exemple suivant, j'aimerais que le label "r" soit dans le plan $(M,\vec{e_r},\vec{e_{\theta}})$ des coordonnées sphériques (du physicien). Intuitivement, je lui fais subir une rotation de phi autour de Z puis une rotation de theta autour de $\vec{e_{\varphi}}$. Mais cela ne fonctionne pas.

510efeab3392c3dbfb0f9390f14d39d9.png

Code: Tout sélectionner
import three;
size(4cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (2,2,2);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
path3 plan_M_r_phi = plane(vvEr, vvEphi, pM);
path3 plan_M_theta_phi = plane(vvEtheta, vvEphi, pM);

draw(surface(plan_M_r_theta),opacity(.5)+red);
draw(surface(plan_M_r_phi),opacity(.5)+blue);
draw(surface(plan_M_theta_phi),opacity(.5)+green);

label(rotate(phi,Z)*rotate(theta,vvEphi)*"$r$",pM,figer_les_labels);


Si quelqu'un a mieux compris comme faire, je suis preneur.

Merci d'avance

--
Christophe

Re: Labels en 3D (Embbed)

MessagePosté: Samedi 05 Mars 2011, 17:39
par maurice
Bonjour, je ne suis pas sûr d'avoir bien compris la question.

Peut-être avec plane project (doc officielle p 137, doc maurice p 31). J'ai essayé avec :

Code: Tout sélectionner
triple n=normal(plan_M_r_theta);

//transform3 pr=planeproject(n,pM);
transform3 pr=planeproject(plan_M_r_theta,n);
label(pr*rotate(phi,Z)*rotate(theta,vvEphi)*rotate(90,X)*"$r$",pM,figer_les_labels);


C'est bien un truc comme ça que tu veux obtenir ?

bb410592e883fda93ee60e9c8bd9713b.png

Code: Tout sélectionner
import three;
size(4cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (2,2,2);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
//path3 plan_M_r_phi = plane(vvEr, vvEphi, pM);
//path3 plan_M_theta_phi = plane(vvEtheta, vvEphi, pM);

draw(surface(plan_M_r_theta),opacity(.5)+red);
//draw(surface(plan_M_r_phi),opacity(.5)+blue);
//draw(surface(plan_M_theta_phi),opacity(.5)+green);


triple n=normal(plan_M_r_theta);

//transform3 pr=planeproject(n,pM);
transform3 pr=planeproject(plan_M_r_theta,n);
label(pr*rotate(phi,Z)*rotate(theta,vvEphi)*rotate(90,X)*"$r$",pM,figer_les_labels);


Maurice

Re: Labels en 3D (Embbed)

MessagePosté: Samedi 05 Mars 2011, 18:29
par maurice
Bonjour,

Autre solution (peut être mieux ?) avec :

Code: Tout sélectionner
label(YZ*"r",(0,pM.y,pM.z),figer_les_labels);
label(rotate(-90,(pM.x,pM.y,0),pM)*rotate(90-phi,Z)*YZ*"$r$",pM, figer_les_labels);




Code: Tout sélectionner
transform3 YZ=rotate(90,O,Z)*rotate(90,O,X);


Il y a un léger décalage que je ne m'explique pas pour l'instant. Mais on progresse ou bien ?

2cd21fb3df49f4ff920424f88feff329.png

Code: Tout sélectionner
import three;
size(4cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (2,2,2);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
//path3 plan_M_r_phi = plane(vvEr, vvEphi, pM);
//path3 plan_M_theta_phi = plane(vvEtheta, vvEphi, pM);

draw(surface(plan_M_r_theta),opacity(.5)+red);
//draw(surface(plan_M_r_phi),opacity(.5)+blue);
//draw(surface(plan_M_theta_phi),opacity(.5)+green);


label(YZ*"r",(0,pM.y,pM.z),figer_les_labels);
label(rotate(-90,(pM.x,pM.y,0),pM)*rotate(90-phi,Z)*YZ*"$r$",pM, figer_les_labels);


Maurice

Re: Labels en 3D (Embbed)

MessagePosté: Samedi 05 Mars 2011, 19:41
par cjorssen
maurice a écrit:Autre solution (peut être mieux ?) avec :

Code: Tout sélectionner
label(YZ*"r",(0,pM.y,pM.z),figer_les_labels);
label(rotate(-90,(pM.x,pM.y,0),pM)*rotate(90-phi,Z)*YZ*"$r$",pM, figer_les_labels);


Bonjour et merci de ta réponse. C'est vrai que c'est pas mal (il me manquait encore une rotation mais j'ai trouvé ce qu'il fallait) :

1eff61d417cb5e308b05b13904e427b4.png

Code: Tout sélectionner
import three;
size(10cm,0);
currentprojection=perspective(7,4,6);

interaction figer_les_labels = Embedded;

draw(O -- 3*X, Arrow3(TeXHead3));
draw(O -- 3*Y, Arrow3(TeXHead3));
draw(O -- 3*Z, Arrow3(TeXHead3));

real x=2, y=2, z=2;
real r, theta, phi;
r = sqrt(x^2 + y^2 + z^2);
theta = aCos(z/r);
phi = aTan(y/x);

triple pM = (x,y,z);

triple vvEr = unit(pM);
triple vvEtheta = dir(90+theta, phi);
triple vvEphi = cross(vvEr, vvEtheta);

path3 plan_M_r_theta = plane(vvEr, vvEtheta, pM);
draw(surface(plan_M_r_theta),opacity(.5)+red);

triple sph2cart(real distance,
real angle1,
real angle2) {
return (distance*Sin(angle1)*Cos(angle2),
distance*Sin(angle1)*Sin(angle2),
distance*Cos(angle1));}

label(YZ*"$r$",sph2cart(r,theta,90),figer_les_labels);

draw(arc((0,0,pM.z),pM,sph2cart(r,theta,90)), blue + opacity(.5));
label(rotate(90-phi,Z)*
YZ*"$r$",pM, 0*N, blue, figer_les_labels);

draw((pM.x,pM.y,0) -- pM, dashed + opacity(.5) + red);
label(rotate(-90,(pM.x,pM.y,0),pM)*
rotate(90-phi,Z)*
YZ*"$r$",pM, 0*N, red, figer_les_labels);

draw(pM -- pM + vvEphi, dashed + opacity(.5) + green);
label(rotate(theta,pM,pM + vvEphi)*
rotate(-90,(pM.x,pM.y,0),pM)*
rotate(90-phi,Z)*
YZ*"$r$",pM, 0*N, heavygreen, figer_les_labels);


maurice a écrit:Il y a un léger décalage que je ne m'explique pas pour l'instant. Mais on progresse ou bien ?


Je ne comprends vraiment pas ce décalage (voir les traits de construction) ?

En tout les cas, on progresse, c'est sûr : merci ! Mais pour l'instant, c'est plutôt de l'essai-erreur qu'une méthode systématique. En particulier, je n'ai pas l'impression que seule la rotation rotate(90-phi,Z) suffise à passe du r noir au r bleu ?

--
Christophe