Annonce

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


#1 2009-11-16 18:05:32 Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Faire passer un objet en mouvement devant un autre



Bonjour à tous!

me voilà nouveau sur codelab. je suis etudiant en master arts et technologies numeriques à Rennes 2 et quelques elements pour realiser mon projet me manque.
Dans un premier temps j'aimerais savoir si quelqu'un pourrai me tuyauter sur un code que je tente de mettre en place. Celui ci consiste tout d'abord à faire tourner un globe terrestre avec des etoiles. Le globe est un objet et les etoiles en sont un autre mais je n'arrive pas à faire passer le globe au premier plan, il reste caché par les etoiles...
voici au point où j'en suis dans le code:

Code (p5) :

import processing.opengl.*;
PImage bg ;
PImage texmap;

float globeRadius = 450;
float universeRadius = 1400;
float[] cx, cz, sphereX, sphereY, sphereZ;
float sinLUT[];
float cosLUT[];
float SINCOS_PRECISION = 0.5;
int SINCOS_LENGTH = int(360.0 / SINCOS_PRECISION);
float a; 
int sDetail = 35; 


void setup() {
  size(1440, 900, OPENGL);  
  bg = loadImage("tuto_h16_5-698da.jpg");
  initializeSphere(sDetail);
  texmap = loadImage("carte_monde.jpg");    
  initializeSphere(sDetail);
  
  
}

void draw() {
  background(0);
  translate(width/2, height/2);
  pushMatrix();
  noFill();
  stroke(255,200);
  strokeWeight(2);
  smooth();
  popMatrix();
  lights();  
  fill(200);
  noStroke();
  textureMode(IMAGE); 
  textureMode(IMAGE);
  rotateY(a*2);
  rotateX(radians(-23));
  rotateY(radians(-23));
  rotateX(1/2*PI);
  a += 0.01;
  renderUniverse();
  renderGlobe(); 
  
}

void renderUniverse () {
  textureMode (IMAGE);
  texturedSphere(universeRadius, bg);
}

void renderGlobe() {
  textureMode(IMAGE);
  texturedSphere(globeRadius, texmap);
 
}




void initializeSphere(int res)
{
  sinLUT = new float[SINCOS_LENGTH];
  cosLUT = new float[SINCOS_LENGTH];

  for (int i = 0; i < SINCOS_LENGTH; i++) {
    sinLUT[i] = (float) Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
    cosLUT[i] = (float) Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
  }

  float delta = (float)SINCOS_LENGTH/res;
  float[] cx = new float[res];
  float[] cz = new float[res];
  
  // Calc unit circle in XZ plane
  for (int i = 0; i < res; i++) {
    cx[i] = -cosLUT[(int) (i*delta) % SINCOS_LENGTH];
    cz[i] = sinLUT[(int) (i*delta) % SINCOS_LENGTH];
  }
  
  // Computing vertexlist vertexlist starts at south pole
  int vertCount = res * (res-1) + 2;
  int currVert = 0;
  
  // Re-init arrays to store vertices
  sphereX = new float[vertCount];
  sphereY = new float[vertCount];
  sphereZ = new float[vertCount];
  float angle_step = (SINCOS_LENGTH*0.5f)/res;
  float angle = angle_step;
  
  // Step along Y axis
  for (int i = 1; i < res; i++) {
    float curradius = sinLUT[(int) angle % SINCOS_LENGTH];
    float currY = -cosLUT[(int) angle % SINCOS_LENGTH];
    for (int j = 0; j < res; j++) {
      sphereX[currVert] = cx[j] * curradius;
      sphereY[currVert] = currY;
      sphereZ[currVert++] = cz[j] * curradius;
    }
    angle += angle_step;
  }
  sDetail = res;
}

// Generic routine to draw textured sphere
void texturedSphere(float r, PImage t) 
{
  int v1,v11,v2;
  r = (r + 240 ) * 0.33;
  beginShape(TRIANGLE_STRIP);
  texture(t);
  float iu=(float)(t.width-1)/(sDetail);
  float iv=(float)(t.height-1)/(sDetail);
  float u=0,v=iv;
  for (int i = 0; i < sDetail; i++) {
    vertex(0, -r, 0,u,0);
    vertex(sphereX[i]*r, sphereY[i]*r, sphereZ[i]*r, u, v);
    u+=iu;
  }
  vertex(0, -r, 0,u,0);
  vertex(sphereX[0]*r, sphereY[0]*r, sphereZ[0]*r, u, v);
  endShape();   
  
  // Middle rings
  int voff = 0;
  for(int i = 2; i < sDetail; i++) {
    v1=v11=voff;
    voff += sDetail;
    v2=voff;
    u=0;
    beginShape(TRIANGLE_STRIP);
    texture(t);
    for (int j = 0; j < sDetail; j++) {
      vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1++]*r, u, v);
      vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2++]*r, u, v+iv);
      u+=iu;
    }
  
    // Close each ring
    v1=v11;
    v2=voff;
    vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1]*r, u, v);
    vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v+iv);
    endShape();
    v+=iv;
  }
  u=0;
  
  // Add the northern cap
  beginShape(TRIANGLE_STRIP);
  texture(t);
  for (int i = 0; i < sDetail; i++) {
    v2 = voff + i;
    vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v);
    vertex(0, r, 0,u,v+iv);    
    u+=iu;
  }
  vertex(sphereX[voff]*r, sphereY[voff]*r, sphereZ[voff]*r, u, v);
  endShape();
  
}

ceci est la premiere partie de mon travail. Dans un second temps ; pour une explication complete, je souhaite que la vitesse de rotation du globe fluctue selon les variations de battement cardiaque. mais ceci sera une autre etape que j'espere pouvoir resoudre.

je vous remercie d'avance.

Fred.

Hors ligne

 

#2 2009-11-17 10:03:03 Re : Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Re: Faire passer un objet en mouvement devant un autre



En fait, apres réflexion, je crois que mon probleme se trouve etre une question de classe à creer! mais ouha, je ne comprends pas bien comment l'integrer dans ce sketch. est-il possible de creer une classe avec PImage?

si quelqu'un peut me venir en aide je le remercie d'avance.

Hors ligne

 

#3 2009-11-17 15:05:10 Re : Faire passer un objet en mouvement devant un autre

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Faire passer un objet en mouvement devant un autre



Bonjour et bienvenue,

Je ne suis pas bien sûr d'avoir compris ton problème, mais j'ai fait un essai en remplaçant size(1440, 900, OPENGL); par size(600, 400, OPENGL); et translate(width/2, height/2); par translate(width, height); et les objets ont l'air correctement placés, évidemment je n'ai pas les images que tu utilises en texture, donc j'ai pris ce que j'avais sous la main.
Est ce que ce ne serait pas plutot un problème de placement de caméra dans l'espace, que tu ne définis pas?

Hors ligne

 

#4 2009-11-17 18:24:31 Re : Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Re: Faire passer un objet en mouvement devant un autre



Bonsoir, et un grand merci!!

Effectivement le problème était un placement de camera, problème que j'ai maintenant compris. Finalement je n'ai changé que les valeurs float universeRadius = 2000; puisque je tiens à ce que float globeRadius soit au centre et que float universeRadius tourne sur ce même centre.
Par contre je ne sais pas si j'en demande trop, mais j'aimerais réellement comprendre et réussir à faire mon premier sketch conséquent.

Je m'explique, maintenant que tout cela fonctionne, je voudrai savoir s'il est possible en créant deux classes différentes de faire tourner mes deux objets à vitesse différentes en sachant que la variation de la vitesse de globeRadius sera contrôler par un cardiofrequencemetre et que celle de universeRadius restera constante.
Ou je me demande s'il ne faut pas que je créer un newrotateY. quelle serait la chose la plus logique?

merci encore.

Dernière modification par fdrg (2009-11-17 18:26:28)

Hors ligne

 

#5 2009-11-18 10:18:56 Re : Faire passer un objet en mouvement devant un autre

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Faire passer un objet en mouvement devant un autre



fdrg a écrit:

je voudrai savoir s'il est possible en créant deux classes différentes de faire tourner mes deux objets à vitesse différentes en sachant que la variation de la vitesse de globeRadius sera contrôler par un cardiofrequencemetre et que celle de universeRadius restera constante.
Ou je me demande s'il ne faut pas que je créer un newrotateY. quelle serait la chose la plus logique?

En utilisant le sketch tel qu'il est, tu peux très bien modifier les deux vitesses de rotation indépendamment, en créant une variable pour chacune (float a, b; plutot que float a; ), ces variables sont modifiées en fonction des données de tes capteurs. Pour faire tourner les objets indépendamment, une structure comme ça dans le draw() fera l'affaire :

  a += 0.01;
  b += 0.05
  rotateY(a);
  renderUniverse();
  rotateY(b);
  renderGlobe();

Voila pour la solution minimum, tu peux aussi créer des classes et inclure les coordonnées de position, rotation dans les instances d'objet, mais ce serait surtout utile si tu multipliais les globes, et ça t'oblige à refondre tout le code.

Hors ligne

 

#6 2009-11-18 11:50:03 Re : Faire passer un objet en mouvement devant un autre

22_79
modérateur
Lieu: Paris
Date d'inscription: 2009-05-05
Messages: 91

Re: Faire passer un objet en mouvement devant un autre



Salut fdrg,

Pour compléter un peu emoc,
Créer deux classes pour donner deux vitesses différentes, c'est un peu comme sortir un bazooka pour tuer une guêpe.
La classe correspond à un type  ... l'objet générique Voiture est une classe par ex.
Tu peux ainsi imaginer deux objets voitures de la classe Voiture qui aillent à des vitesses différentes

Je n'ai pas regardé ton code en détail, mais dans ton cas, il me semble que tout tes objets doivent être de la même classe ... mettons ElementSpatial ... seulement, ils ne seront pas initialisés avec la même vitesse ou la même position par ex.

class ElementSpatial {

  PImage texture;
  float vitesseRot;
  Vector3D position;

...

  ElementSpatial(PImage texture, float vitesseRot, Vector3D postion){
    this.texture = texture;
   ...
  }

}


-1

Hors ligne

 

#7 2009-11-18 18:00:40 Re : Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Re: Faire passer un objet en mouvement devant un autre



Bonsoir,

et bien merci encore une fois. j'ai bien pris note de vos conseils et pour l'instant je vais tenter de rester dans le simple et me concentrer sur un seul globe. Je pense qu'il vaut mieux que je reste dans la simplicité plutot que de me lancer dans une chose trop complexe qui perdrait son sens premier. Par contre j'attends que mes capteurs arrivent et je ferai quelques test.
Je vous communiquerai l'avancée de tout cela si cela ne vous ennuie pas.

Hors ligne

 

#8 2009-11-18 18:46:43 Re : Faire passer un objet en mouvement devant un autre

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Faire passer un objet en mouvement devant un autre



Oui, tiens nous au courant de tes avancées

Hors ligne

 

#9 2009-11-23 15:17:23 Re : Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Re: Faire passer un objet en mouvement devant un autre



Bonjour,



me voilà à nouveau par là!!
bon mon cardiofrequencemètre est bien arrivé et après quelques bidouilles j'arrive à avoir un signal, faible mais il est bien là. Cela reste pourtant encore à travailler.

Mon souci actuel est de faire communiquer Arduino avec Processing. Pour l'instant je n'utilise qu'un potentiomètre réglable pour faire varier la vitesse de rotation de mon globe. Le seul hic, c'est qu'il tourne à toute vitesse et changer la valeur du potar n'affecte en rien la vitesse de rotation.

j'ai essaye avec ce code :

Code (processing) :

import processing.serial.*;

Serial myPort;  // Create object from Serial class
float val;      // Data received from the serial port




import processing.opengl.*;
PImage bg ;
PImage texmap;

float globeRadius = 450;
float universeRadius = 2000;
float[] cx, cz, sphereX, sphereY, sphereZ;
float sinLUT[];
float cosLUT[];
float SINCOS_PRECISION = 0.5;
int SINCOS_LENGTH = int(360.0 / SINCOS_PRECISION);
float a, b ;
int sDetail = 35; 


void setup() {
  size(1440, 800, OPENGL);  
  bg = loadImage("tuto_h16_5-698da.jpg");
  initializeSphere(sDetail);
  texmap = loadImage("carte_monde.jpg");    
  initializeSphere(sDetail);
  
  
  
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
  
}

void draw() {
  background(0);
  translate(width/2, height/2);
  pushMatrix();
  noFill();
  stroke(255,200);
  strokeWeight(2);
  smooth();
  popMatrix();
  specular(0, 0, 0);
  fill(200);
  noStroke();
  textureMode(IMAGE); 
  textureMode(IMAGE);
  rotateY(a*2);
  rotateX(radians(-23));
  rotateY(radians(-23));
  rotateX(1/2*PI);
  a += 0.01;
  b += val;
  renderUniverse();
  rotateY(b);
  renderGlobe(); 
  
    if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();         // read it and store it in val
    }
}

void renderUniverse () {
  textureMode (IMAGE);
  texturedSphere(universeRadius, bg);
}

void renderGlobe() {
  textureMode(IMAGE);
  texturedSphere(globeRadius, texmap);
 
}




void initializeSphere(int res)
{
  sinLUT = new float[SINCOS_LENGTH];
  cosLUT = new float[SINCOS_LENGTH];

  for (int i = 0; i < SINCOS_LENGTH; i++) {
    sinLUT[i] = (float) Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
    cosLUT[i] = (float) Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
  }

  float delta = (float)SINCOS_LENGTH/res;
  float[] cx = new float[res];
  float[] cz = new float[res];
  
  // Calc unit circle in XZ plane
  for (int i = 0; i < res; i++) {
    cx[i] = -cosLUT[(int) (i*delta) % SINCOS_LENGTH];
    cz[i] = sinLUT[(int) (i*delta) % SINCOS_LENGTH];
  }
  
  // Computing vertexlist vertexlist starts at south pole
  int vertCount = res * (res-1) + 2;
  int currVert = 0;
  
  // Re-init arrays to store vertices
  sphereX = new float[vertCount];
  sphereY = new float[vertCount];
  sphereZ = new float[vertCount];
  float angle_step = (SINCOS_LENGTH*0.5f)/res;
  float angle = angle_step;
  
  // Step along Y axis
  for (int i = 1; i < res; i++) {
    float curradius = sinLUT[(int) angle % SINCOS_LENGTH];
    float currY = -cosLUT[(int) angle % SINCOS_LENGTH];
    for (int j = 0; j < res; j++) {
      sphereX[currVert] = cx[j] * curradius;
      sphereY[currVert] = currY;
      sphereZ[currVert++] = cz[j] * curradius;
    }
    angle += angle_step;
  }
  sDetail = res;
}

// Generic routine to draw textured sphere
void texturedSphere(float r, PImage t) 
{
  int v1,v11,v2;
  r = (r + 240 ) * 0.33;
  beginShape(TRIANGLE_STRIP);
  texture(t);
  float iu=(float)(t.width-1)/(sDetail);
  float iv=(float)(t.height-1)/(sDetail);
  float u=0,v=iv;
  for (int i = 0; i < sDetail; i++) {
    vertex(0, -r, 0,u,0);
    vertex(sphereX[i]*r, sphereY[i]*r, sphereZ[i]*r, u, v);
    u+=iu;
  }
  vertex(0, -r, 0,u,0);
  vertex(sphereX[0]*r, sphereY[0]*r, sphereZ[0]*r, u, v);
  endShape();   
  
  // Middle rings
  int voff = 0;
  for(int i = 2; i < sDetail; i++) {
    v1=v11=voff;
    voff += sDetail;
    v2=voff;
    u=0;
    beginShape(TRIANGLE_STRIP);
    texture(t);
    for (int j = 0; j < sDetail; j++) {
      vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1++]*r, u, v);
      vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2++]*r, u, v+iv);
      u+=iu;
    }
  
    // Close each ring
    v1=v11;
    v2=voff;
    vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1]*r, u, v);
    vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v+iv);
    endShape();
    v+=iv;
  }
  u=0;
  
  // Add the northern cap
  beginShape(TRIANGLE_STRIP);
  texture(t);
  for (int i = 0; i < sDetail; i++) {
    v2 = voff + i;
    vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v);
    vertex(0, r, 0,u,v+iv);    
    u+=iu;
  }
  vertex(sphereX[voff]*r, sphereY[voff]*r, sphereZ[voff]*r, u, v);
  endShape();
  
}

et rien....

mais aussi avec la base de ce code:

Code (processing) :

import processing.serial.*;

Serial myPort;        // The serial port
int yPos = 1;         // horizontal position of the graph

void setup () {
  size( 400, 300);
  // List all the available serial ports
  println(Serial.list());
  // I know that the first port in the serial list on my mac
  // is always my  Arduino, so I open Serial.list()[0].
  // Open whatever port is the one you're using.
  myPort = new Serial(this, Serial.list()[0], 9600);
  // don't generate a serialEvent() unless you get a newline character:
  myPort.bufferUntil('\n');
  // set inital background:
  background(0);
}
void draw () {
  // everything happens in the serialEvent()
}

void serialEvent (Serial myPort) {
  // get the ASCII string:
  String inString = myPort.readStringUntil('\n');

  if (inString != null) {
    // trim off any whitespace:
    inString = trim(inString);
    // convert to an int and map to the screen height:
    float inByte = float(inString); 
    inByte = map(inByte, 0, 1023, 0, height);

    // draw the line:
    stroke(127,34,255);
    line(yPos, height, yPos, height - inByte);

    // at the edge of the screen, go back to the beginning:
    if (yPos >= width) {
      yPos = 0;
      background(0); 
    } 
    else {
      // increment the horizontal position:
      yPos++;
    }
  }
}

et rien non plus.


j'utilise le code suivant pour Arduino:

void setup() {
   // initialize the serial communication:
   Serial.begin(9600);
 }

 void loop() {
   // send the value of analog input 0:
   Serial.println(analogRead(0));
   // wait a bit for the analog-to-digital converter 
   // to stabilize after the last reading:
   delay(10);
 }

j'avoue que je ne n'arrive pas à comprendre pourquoi cela ne fonctionne pas, mais je continu à potasser!

Hors ligne

 

#10 2009-11-24 09:23:21 Re : Faire passer un objet en mouvement devant un autre

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Faire passer un objet en mouvement devant un autre



fdrg a écrit:

Le seul hic, c'est qu'il tourne à toute vitesse et changer la valeur du potar n'affecte en rien la vitesse de rotation.

C'est normal, Arduino envoie la valeur du potentiomètre en permanence (toutes les 10 millisecondes, en fait). Processing reçoit donc de nouvelles données en permanence, et comme ta boucle draw se répète aussi vite que le permet ta machine, à chaque rafraichissement b += val; et ton globe tourne de plus en plus vite.

Plutot que b += val; essaie b = val; ou b = val / 100; smile


ps : Pour que la balise [ code ] [ / code ] fonctionne, il faut placer le code entre les deux. Tu peux aussi utiliser [ code = processing ] pour appliquer une coloration syntaxique.

Hors ligne

 

#11 2009-11-24 11:22:39 Re : Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Re: Faire passer un objet en mouvement devant un autre



en fait en utilisant que se soit b = val, b = val/100 ou autre le globe saccade à present. je suis paumé...

est-ce que la fonction map() ne me serait pas utile afin de definir des tours de rotation par tranche de 10 par exemple pour les données du potar ?

par contre j'ai retirer cela : if ( myPort.available() > 0) puisque je souhaite que le globe tourne à une vitesse constante lorsque qu'aucune données n'est envoyées.

Autre question, lorsque je vais faire mes test avec le cardiofrequencemetre, est-ce que Arduino le considère bien comme une donnée numérique ?

je ferais attention lors de mes prochaines publications quant à l'introduction des codes.

merci.

Hors ligne

 

#12 2009-11-24 15:10:51 Re : Faire passer un objet en mouvement devant un autre

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Faire passer un objet en mouvement devant un autre



Je ne sais pas trop ou tu en es dans ton code, renvoie peut-être une version actualisée.
Il faudrait que tu définisses comment le capteur influe sur la rotation : il ajoute une accélération ? Ca te permettra de traiter les valeurs numériques avant de modifier la rotation.

Sinon avec ton potentiomètre tu peux essayer b += val / 10000; ça devrait le faire tourner beaucoup plus doucement! Ton potentiomètre renvoie quelle écart de valeurs numériques, entre 0 et 1024 ? Si c'est le cas, tu peux par exemple enlever 512 à cette valeur avant de l'ajouter à b (la vitesse de rotation du globe, comme ça selon la position du potentiomètre cela donnera une vitesse positive ou négative)

Pour le cardiofréquencemètre, qu'est ce que c'est ? Un capteur de quel type ? Un lien serait bienvenu smile

Hors ligne

 

#13 2009-11-24 17:38:17 Re : Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Re: Faire passer un objet en mouvement devant un autre



En fait oui je cherche à ajouter une accélération à la vitesse de rotation du globe par le potentiomètre dans un premier temps pour pouvoir comprendre se qui se passe, puis par le cardiofrequencemetre ensuite. Cela sera la vitesse du rythme cardiaque qui va commander la vitesse de rotation du globe. Voilà un lien pour le cardiofrequencemetre : http://www.ecole-art-aix.fr/article2963.html

Sinon voilà ou j'en suis dans le code :

Code (processing) :

import processing.serial.*;

Serial myPort;  // Create object from Serial class
float val;      // Data received from the serial port




import processing.opengl.*;
PImage bg ;
PImage texmap;

float globeRadius = 450;
float universeRadius = 2000;
float[] cx, cz, sphereX, sphereY, sphereZ;
float sinLUT[];
float cosLUT[];
float SINCOS_PRECISION = 0.5;
int SINCOS_LENGTH = int(360.0 / SINCOS_PRECISION);
float a, b ;
int sDetail = 35; 


void setup() {
  size(1440, 800, OPENGL);  
  bg = loadImage("tuto_h16_5-698da.jpg");
  initializeSphere(sDetail);
  texmap = loadImage("carte_monde.jpg");    
  initializeSphere(sDetail);
  
  
  
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
  
}

void draw() {
  background(0);
  translate(width/2, height/2);
  pushMatrix();
  noFill();
  stroke(255,200);
  strokeWeight(2);
  smooth();
  popMatrix();
  specular(0, 0, 0);
  fill(200);
  noStroke();
  textureMode(IMAGE); 
  textureMode(IMAGE);
  rotateY(a*2);
  rotateX(radians(-23));
  rotateY(radians(-23));
  rotateX(1/2*PI);
  a += 0.01;
  b = val;
  renderUniverse();
  rotateY(b);
  renderGlobe(); 
  
    if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();         // read it and store it in val
    }
}

void renderUniverse () {
  textureMode (IMAGE);
  texturedSphere(universeRadius, bg);
}

void renderGlobe() {
  textureMode(IMAGE);
  texturedSphere(globeRadius, texmap);
 
}




void initializeSphere(int res)
{
  sinLUT = new float[SINCOS_LENGTH];
  cosLUT = new float[SINCOS_LENGTH];

  for (int i = 0; i < SINCOS_LENGTH; i++) {
    sinLUT[i] = (float) Math.sin(i * DEG_TO_RAD * SINCOS_PRECISION);
    cosLUT[i] = (float) Math.cos(i * DEG_TO_RAD * SINCOS_PRECISION);
  }

  float delta = (float)SINCOS_LENGTH/res;
  float[] cx = new float[res];
  float[] cz = new float[res];
  
  // Calc unit circle in XZ plane
  for (int i = 0; i < res; i++) {
    cx[i] = -cosLUT[(int) (i*delta) % SINCOS_LENGTH];
    cz[i] = sinLUT[(int) (i*delta) % SINCOS_LENGTH];
  }
  
  // Computing vertexlist vertexlist starts at south pole
  int vertCount = res * (res-1) + 2;
  int currVert = 0;
  
  // Re-init arrays to store vertices
  sphereX = new float[vertCount];
  sphereY = new float[vertCount];
  sphereZ = new float[vertCount];
  float angle_step = (SINCOS_LENGTH*0.5f)/res;
  float angle = angle_step;
  
  // Step along Y axis
  for (int i = 1; i < res; i++) {
    float curradius = sinLUT[(int) angle % SINCOS_LENGTH];
    float currY = -cosLUT[(int) angle % SINCOS_LENGTH];
    for (int j = 0; j < res; j++) {
      sphereX[currVert] = cx[j] * curradius;
      sphereY[currVert] = currY;
      sphereZ[currVert++] = cz[j] * curradius;
    }
    angle += angle_step;
  }
  sDetail = res;
}

// Generic routine to draw textured sphere
void texturedSphere(float r, PImage t) 
{
  int v1,v11,v2;
  r = (r + 240 ) * 0.33;
  beginShape(TRIANGLE_STRIP);
  texture(t);
  float iu=(float)(t.width-1)/(sDetail);
  float iv=(float)(t.height-1)/(sDetail);
  float u=0,v=iv;
  for (int i = 0; i < sDetail; i++) {
    vertex(0, -r, 0,u,0);
    vertex(sphereX[i]*r, sphereY[i]*r, sphereZ[i]*r, u, v);
    u+=iu;
  }
  vertex(0, -r, 0,u,0);
  vertex(sphereX[0]*r, sphereY[0]*r, sphereZ[0]*r, u, v);
  endShape();   
  
  // Middle rings
  int voff = 0;
  for(int i = 2; i < sDetail; i++) {
    v1=v11=voff;
    voff += sDetail;
    v2=voff;
    u=0;
    beginShape(TRIANGLE_STRIP);
    texture(t);
    for (int j = 0; j < sDetail; j++) {
      vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1++]*r, u, v);
      vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2++]*r, u, v+iv);
      u+=iu;
    }
  
    // Close each ring
    v1=v11;
    v2=voff;
    vertex(sphereX[v1]*r, sphereY[v1]*r, sphereZ[v1]*r, u, v);
    vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v+iv);
    endShape();
    v+=iv;
  }
  u=0;
  
  // Add the northern cap
  beginShape(TRIANGLE_STRIP);
  texture(t);
  for (int i = 0; i < sDetail; i++) {
    v2 = voff + i;
    vertex(sphereX[v2]*r, sphereY[v2]*r, sphereZ[v2]*r, u, v);
    vertex(0, r, 0,u,v+iv);    
    u+=iu;
  }
  vertex(sphereX[voff]*r, sphereY[voff]*r, sphereZ[voff]*r, u, v);
  endShape();
}

Dernière modification par fdrg (2009-11-24 17:43:25)

Hors ligne

 

#14 2009-11-25 20:57:21 Re : Faire passer un objet en mouvement devant un autre

emoc
@#@*$
Lieu: Quimper
Date d'inscription: 2008-01-28
Messages: 1576
Site web

Re: Faire passer un objet en mouvement devant un autre



Hello,

J'ai jeté un oeil sur la page du cardio-fréquencemètre, si je comprends bien il envoie une pulsation sonore pour chaque pulsation cardiaque, il va falloir que tu retrouves le BPM à partir de ces pulsations, et te baser sur un rythme moyen pour en évaluer les variations, soit c'est le programme arduino qui s'en occupe, soit c'est processing. C'est assez différent du fonctionnement d'un potentiomètre qui envoie chaque fois qu'on lui demande sa valeur de résistance. Est ce que tu as essayé d'utiliser le potentiomètre en lui fixant une valeur moyenne (voir 2 messages plus haut...) ?

Hors ligne

 

#15 2009-11-26 10:33:32 Re : Faire passer un objet en mouvement devant un autre

fdrg
membre
Lieu: Strasbourg
Date d'inscription: 2009-10-27
Messages: 22

Re: Faire passer un objet en mouvement devant un autre



Salut,

en fait je ne me sers pas du cardiofrequencemetre comme la personne sur la page. Je ne souhaite pas récupérer de signal sonore mais simplement les variations électriques que le rythme cardiaque produit pour faire varier la vitesse de mon globe. Au final j'espère que mon globe tourne, par exemple à 60trs/min lorsque les bpm son à 60 et ainsi de suite. Voilà un autre lien mais cette fois-ci la personne utilise Pure Data : http://www.gael-l.com/index.php/92/quan … fait-boum/

Du coup je souhaite tout d'abord utiliser un potentiomètre pour bien comprendre le fonctionnement de l'acquisition de données de Arduino et leurs traitement par Processing. Par contre je n'ai pas réussi à faire fonctionner mon code en fixant une valeur moyenne au potentiomètre, je crois que je n'ai pas tout compris....
Par contre mon potentiomètre envoi un écart de valeurs numériques entre 0 et 1023.

Je continu à chercher des solutions qui j'espère vont fonctionner.

merci de ton aide.

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024