Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2015-11-25 18:23:53 3D, sphère, rotation

Capitoul
membre
Date d'inscription: 2014-09-19
Messages: 18

3D, sphère, rotation



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

 

#2 2015-11-26 12:25:04 Re : 3D, sphère, rotation

Capitoul
membre
Date d'inscription: 2014-09-19
Messages: 18

Re: 3D, sphère, rotation



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

 

#3 2015-11-26 14:00:38 Re : 3D, sphère, rotation

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: 3D, sphère, rotation



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

 

#4 2015-11-26 14:42:01 Re : 3D, sphère, rotation

Capitoul
membre
Date d'inscription: 2014-09-19
Messages: 18

Re: 3D, sphère, rotation



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

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024