Je reviens sur le forum pour une question sur le 3D et sur les rotations en général.
Ci-dessous, voici un sketch qui cherche à représenter le système solaire (soleil, terre, lune) à des fins pédagogiques sur les saisons, les marées et les éclipses (trois questions qui sont corrélées).
Comme vous pouvez le voir, j'ai représenté la terre, l'équateur et les deux tropiques.
Ma question est relative aux deux tropiques (en rouge) :
1/ Je n'arrive pas à tracer les tropiques avec une ellipse (comme je l'ai fait pour l'équateur) parce que le paramétrage de l'ellipse n'accepte pas de définir le centre avec les trois données x, y, z.
2/ J'ai donc tracé les tropiques par une succession de points ; le résultat n'est pas pleinement satisfaisant parce que la ligne ne fait pas le tour complet de la sphère.
Quelqu'un a-t-il une idée ? Le sketch est un peu long mais il est très linéaire et doit pouvoir se lire facilement. (j'espère).
Merci
float rayon_terre = 20;
float rayon_soleil =50;
// Définition de la position de la terre sur l'écliptique
float axe_ecliptique = 500;
float x_t;
float y_t;
// incrément révolution de la terre autour du soleil
float theta=0;
float delta_theta=-2*PI/5000;
int n_t=0;
// incrément rotation de la terre sur elle-même
float rho=0;
float delta_rho = delta_theta*365;
// Caractéristiques méridien
int phi;
float x_m, y_m, z_m;
// Caractéristiques lune
float rayon_lune = rayon_terre/3;
float orbite_lune = 56; // demi-axe
float x_l;
float y_l;
float lambda=0; // initialisation de l'avancement de la lune sur son orbite
float delta_lambda = delta_theta*13; // la lune fait 13 trous en une année terrestre
int n_l=0; // nombre de tour de la lune autour de la terre
void setup() {
size(1200, 1200, P3D);
smooth();
stroke(0, 0, 256);
strokeWeight(2);
smooth(8);
frameRate(20);
}
void draw() {
background (0);
// on joue avec la souris pour avoir le dessin en perspective
pushMatrix(); // sauvegarde référentiel absolu
rotateX(map(mouseY, 0, height/2, 0, PI/2)); // orientation de l'ecliptique : transformation de 2h/3 entre 0 et PI/3
translate(0,-50,-100);
// tracé du soleil
translate(width/2, height/2);
stroke(255, 223, 83);
sphere (rayon_soleil);
// // Tracé ellipse de la terre
noFill();
stroke(255);
strokeWeight(2);
ellipse(0, 0, axe_ecliptique, axe_ecliptique);
//trace_terre (x_terre, y_terre) {
pushMatrix();
x_t = (axe_ecliptique/2)*cos(theta);
y_t = (axe_ecliptique/2)*sin(theta);
translate (x_t, y_t);
rotateY(23*PI/180); //inclinaison de la terre sur l'écliptique
rotateZ(rho) ; // rotation de la terre sur elle-même
stroke(0, 0, 255);
strokeWeight(2);
sphere(rayon_terre);
// tracé tropique cancer
strokeWeight(3);
stroke(255, 0, 0);
for (phi=0; phi <200; phi=phi+1) {
float x_m = rayon_terre*sin(PI/2-23*PI/180)*cos(phi*0.0628)+2;
float y_m = rayon_terre*sin(PI/2-23*PI/180)*sin(phi*0.0628)+2;
float z_m = rayon_terre*cos(PI/2-23*PI/180);
point(x_m, y_m, z_m);
}
// tracé tropique capricorne
strokeWeight(3);
stroke(255, 0, 0);
for (phi=0; phi <200; phi=phi+1) {
float x_m = rayon_terre*sin(PI/2-23*PI/180)*cos(phi*0.0628)+2;
float y_m = rayon_terre*sin(PI/2-23*PI/180)*sin(phi*0.0628)+2;
float z_m = -rayon_terre*cos(PI/2-23*PI/180);
point(x_m, y_m, z_m);
}
// tracé axe
stroke(255);
strokeWeight(4);
line(0, 0, 40, 0, 0, -40);
//Tracé équateur;
stroke(255, 255, 255);
ellipse(0,0, 2*rayon_terre+2, 2*rayon_terre+2);
// tracé de la lune
pushMatrix();
noStroke();
fill(255);
x_l = orbite_lune*cos(lambda-rho);
y_l = orbite_lune*sin(lambda-rho);
translate(x_l, y_l); // on se déplace sur l'orbite de la lune
sphere (rayon_lune);
popMatrix();
popMatrix();// passage dans le référentiel soleil
//tracé du rayon soleil-terre
stroke(237, 237, 0);
strokeWeight(2);
line(0,0, x_t, y_t);
popMatrix();// Passage dans le référentiel absolu (en haut, à gauche).
// avancement de la terre sur son ellipse
theta = theta + delta_theta;
if(theta <-2*PI) {
theta = 0;
}
// incrémentation de la rotation de la terre sur elle même
rho = rho + delta_rho;
if (rho <- 2*PI) {
rho =0;
n_t=n_t+1;
}
// Avancement de la lune
lambda = lambda + delta_lambda;
if((lambda)<-2*PI) {
lambda = 0;
n_l= n_l+1;
}
}
Hors ligne
J'ajoute qu'un déplacement de la souris (dans le sens vertical) sur l'animation permet de modifier la perspective et de mieux voir les tropiques tronqués.
Merci,
Hors ligne
Bonjour,
Pour le tracé des tropiques, tu peux les réaliser comme l'équateur en utilisant un translate() comme ceci :
float rayon_terre = 20;
float rayon_soleil =50;
// Définition de la position de la terre sur l'écliptique
float axe_ecliptique = 500;
float x_t;
float y_t;
// incrément révolution de la terre autour du soleil
float theta=0;
float delta_theta=-2*PI/5000;
int n_t=0;
// incrément rotation de la terre sur elle-même
float rho=0;
float delta_rho = delta_theta*365;
// Caractéristiques méridien
int phi;
float x_m, y_m, z_m;
// Caractéristiques lune
float rayon_lune = rayon_terre/3;
float orbite_lune = 56; // demi-axe
float x_l;
float y_l;
float lambda=0; // initialisation de l'avancement de la lune sur son orbite
float delta_lambda = delta_theta*13; // la lune fait 13 trous en une année terrestre
int n_l=0; // nombre de tour de la lune autour de la terre
void setup() {
size(1200, 1200, P3D);
stroke(0, 0, 256);
strokeWeight(2);
smooth(8);
frameRate(20);
}
void draw() {
background (0);
// on joue avec la souris pour avoir le dessin en perspective
pushMatrix(); // sauvegarde référentiel absolu
rotateX(map(mouseY, 0, height/2, 0, PI/2)); // orientation de l'ecliptique : transformation de 2h/3 entre 0 et PI/3
translate(0, -50, -100);
// tracé du soleil
translate(width/2, height/2);
stroke(255, 223, 83);
sphere (rayon_soleil);
// // Tracé ellipse de la terre
noFill();
stroke(255);
strokeWeight(2);
ellipse(0, 0, axe_ecliptique, axe_ecliptique);
//trace_terre (x_terre, y_terre) {
pushMatrix();
x_t = (axe_ecliptique/2)*cos(theta);
y_t = (axe_ecliptique/2)*sin(theta);
translate (x_t, y_t);
rotateY(23*PI/180); //inclinaison de la terre sur l'écliptique
rotateZ(rho) ; // rotation de la terre sur elle-même
stroke(0, 0, 255);
strokeWeight(2);
sphere(rayon_terre);
// tracé axe
stroke(255);
strokeWeight(4);
line(0, 0, 40, 0, 0, -40);
//Tracé équateur;
stroke(255, 255, 255);
ellipse(0, 0, 2*rayon_terre+2, 2*rayon_terre+2);
// Tropiques
pushMatrix();
translate(0, 0, 10);
stroke(255, 0, 0);
ellipse(0, 0, 2*rayon_terre+2, 2*rayon_terre+2);
popMatrix();
pushMatrix();
translate(0, 0, -10);
stroke(255, 0, 0);
ellipse(0, 0, 2*rayon_terre+2, 2*rayon_terre+2);
popMatrix();
// tracé de la lune
pushMatrix();
noStroke();
fill(255);
x_l = orbite_lune*cos(lambda-rho);
y_l = orbite_lune*sin(lambda-rho);
translate(x_l, y_l); // on se déplace sur l'orbite de la lune
sphere (rayon_lune);
popMatrix();
popMatrix();// passage dans le référentiel soleil
//tracé du rayon soleil-terre
stroke(237, 237, 0);
strokeWeight(2);
line(0, 0, x_t, y_t);
popMatrix();// Passage dans le référentiel absolu (en haut, à gauche).
// avancement de la terre sur son ellipse
theta = theta + delta_theta;
if (theta <-2*PI) {
theta = 0;
}
// incrémentation de la rotation de la terre sur elle même
rho = rho + delta_rho;
if (rho <- 2*PI) {
rho =0;
n_t=n_t+1;
}
// Avancement de la lune
lambda = lambda + delta_lambda;
if ((lambda)<-2*PI) {
lambda = 0;
n_l= n_l+1;
}
}
A toi de régler les bonnes valeurs pour qu'elles correspondent à la réalité.
Hors ligne
Ah, oui ! Merci Mushussu. C'est pourtant simple mais je n'y avais pas pensé.
J'en ai profité pour corriger d'autres petites erreurs, je crois que je vais arriver à faire ce que je souhaite.
Merci encore.
Hors ligne