Outils pour utilisateurs

Outils du site


wiki:projets:plantasia:accueil

Plantasia

  • Porteur(s) du projet : Sévan, Blandine
  • Date : 15/01/2019

* Cop d'avance : axe 5, bien vivre en PACA

FIXME Qualité illustrations

FIXME source du programme (.zip), inutile de tout expliquer - commenter le programme directement

m( Orthographe!! Expression!

**Contexte**

Suite du projet Plantasia à travers un programme intéractif et des affiches animées. L'installation incarne un autel de prière, le but était de dévellopper une lithurgique autour du végétale. Entouré d'affiche et immergé à travers une bande son, le fidèle peut faire apparaitre grâce à un capteur de mouvement leap-motion (tutos : leap motion 1 & leap motion 2) particules vertes. Ce geste est une vénération faite aux plantes, il vise à se faire pardonner pour ces péchés et se reconnecter avec la nature.

**Contenu**

  • 3 affiches animées > logiciel After effect

  • 1 programme > processing

  • 1 bande son > logic pro

**Détails programme**

V1 (juste les particules)

Début description programme

plantasia.zip
 
// importation des librairies
import de.voidplus.leapmotion.*;
//création de "l'objet" leap 
LeapMotion leap;
 
ArrayList<PVector> points; 
PVector fp;
 
ArrayList<Particle> pts;
PFont a;

Paramètres du setup

void setup() {
fullScreen();
background(0);
frameRate(30);
noCursor();
 
  points = new ArrayList<PVector>();  //  ArrayList VIDE
  noStroke();
  pts = new ArrayList<Particle>();
}

Paramètres du draw

void draw() {
int fps = leap.getFrameRate();
frameRate(fps);
  
//  Mains
for (Hand hand : leap.getHands()) {
  // Doigts
  for (Finger finger : hand.getFingers()) {
  fp   = finger.getPosition(); 
  if (fp.z <= 30) {
  points = new ArrayList<PVector>();
  } else if (fp.z > 30) {
  points.add(new PVector(fp.x, fp.y));
  }
  }
  }
 
  {
  for (int i = points.size()-1; i >= 0; i--) {
  PVector p = points.get(i);
  Particle newP = new Particle(p.x, p.y, i+pts.size(), i+pts.size());
  pts.add(newP);
  }
  
  }
  for (int i=0; i<pts.size(); i++) {
  Particle p = pts.get(i);
  p.update();
  p.display();
  }

  for (int i=pts.size()-1; i>-1; i--) {
  Particle p = pts.get(i);
  if (p.dead) {
  pts.remove(i);
  }
  }
}

Reset programme avec la touche “A”

void keyPressed() {
  if (key == 'a') {
    for (int i=pts.size()-1; i>-1; i--) {
      Particle p = pts.get(i);
      pts.remove(i);
    }
    background(0);
  }
}

Création class particule

class Particle {
  PVector loc, vel, acc;
  int lifeSpan, passedLife;
  boolean dead;
  float alpha, weight, weightRange, decay, xOffset, yOffset;
  color c;

  Particle(float x, float y, float xOffset, float yOffset) {
    loc = new PVector(x, y);

    float randDegrees = random(360);
    vel = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees)));
    vel.mult(random(5));

    acc = new PVector(0, 0);
    lifeSpan = int(random(30, 20)); //intensité
    decay = random(0.50, 0.5); //decalage
    c = color(random(100), random(100), random(100), 255);
    weightRange = random(20); //rayon

    this.xOffset = xOffset;
    this.yOffset = yOffset;
  }
  
  void update() {
    if (passedLife>=lifeSpan) {
      dead = true;
    } else {
      passedLife++;
    }

    alpha = float(lifeSpan-passedLife)/lifeSpan * 30+100;
    weight = float(lifeSpan-passedLife)/lifeSpan * weightRange;

    acc.set(0, 0);

    float rn = (noise((loc.x+frameCount+xOffset)*0.01, (loc.y+frameCount+yOffset)*0.01)-0.8)*4*PI;
    float mag = noise((loc.y+frameCount)*0.01, (loc.x+frameCount)*0.01);
    PVector dir = new PVector(cos(rn), sin(rn));
    acc.add(dir);
    acc.mult(mag);

    float randDegrees = random(360);
    PVector randV = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees)));
    randV.mult(0.5);
    acc.add(randV);

    vel.add(acc);
    vel.mult(decay);
    vel.limit(30);
    loc.add(vel);
  }

  void display() {
    strokeWeight(weight+1);
    c = color(random(100), random(255), random(100), 255);

    stroke(0, alpha);
    point(loc.x, loc.y);

    strokeWeight(weight);
    stroke(c);
    point(loc.x, loc.y);
  }
}

**Version 2**

Nous avons édités un deuxième programme en intégrant un fond fixe (textes sacrés et astéroïdes sacré de Plantasia) et les vidéos et le son seront déclanchées par l'utilisateur (inspiration des retables du Moyen-âge). La lecture des vidéos se fait grâce a une zone définit dans le programme. Cette expérience est accompagnée d'une édition. La mise en page et la papier choisit se rapproche des tracts religieux.

Ajouts au programme

2 nouvelles librairies ddf.minim (son) & processing.video (video)
import ddf.minim.*;
Minim minim;
AudioSnippet ping;
import processing.video.*;
Movie mg, mm, md;

Ajouts au setup

background(0);
img=loadImage("plantasia.jpg");
minim=new Minim(this);
ping=minim.loadSnippet("plantasia.mp3");
ping.loop();
  mg=new Movie(this, "mg.mp4");
  mm=new Movie(this, "mm.mp4");
  md=new Movie(this, "md.mp4");

  mg.loop();
  mm.loop();
  md.loop();
  

Ajouts au draw

ping.play();
image(img, 0, 0);
// boucle qui définit les coordonées X et Y de lancement des vidéos
  for (Finger finger : leap.getFingers ()) {//créer l'objet main
    fp= finger.getPosition();
    if (fp.x<=500&&fp.y<=800) {
      tint(255, 20);
      image(mg, 120, 300);
    } else if (fp.x>=900&&fp.y<=800) {
      tint(255, 20);
      image(md, 975, 275, 280, 200);
    } else if (fp.x<=899||fp.x<=501) {
      tint(255, 20);
      image(mm, 450, 550, 400, 180);
    }
  }
  void movieEvent(Movie m) {
  m.read();
}
wiki/projets/plantasia/accueil.txt · Dernière modification: 2019/05/01 09:04 (modification externe)