Droit dans le mur

De Centre de Ressources Numériques - Labomedia
Révision de 30 avril 2015 à 00:28 par Olivier (discussion | contributions) (Page créée avec « {{Fiche Idée Image |Image=droitdanslemur.jpg }} {{Fiche Idée Présentation |Résumé=Effet vidéo sous Processing |Auteur(s)=01ivier |Licence=CC-BY-SA 3 |Date de créati... »)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher
Droit dans le mur
Droitdanslemur.jpg


Pour modifier la page utiliser l'onglet Modifier avec formulaire.

Résumé Effet vidéo sous Processing
Auteur(s) 01ivier
Licence CC-BY-SA 3
Date de création 30 avril 2015


Intentions / Contexte

Proposer un Bit de Dieu

Principe de fonctionnement

Chaque pixel noir déclenche le sautillement et le changement de couleur d'une des briques

Besoins / Compétences

Processing

Documentation

// Ce script permet appliquer un effet sur une vidéo  
// En l'occurence, il affiche fait sautiller des briques
// en fonction de la luminosité.  

// copyright Olivier Baudu 2015 pour le http://labomedia.net  
// Publié sous les termes de la license GPL v3.0  

import processing.video.*;  
import controlP5.*;  

Brique[] mur;  
Capture cam;  

Boolean save;  
int non_modifiable;  
int wait;  
int start_frame;  

ControlP5 cp5;  
float contraste = 0.2;  

void setup() {  

  mur = new Brique[1200*4];   
  save = false;  
  wait = 0;  

  size(795, 600);  
  frameRate(30);  
  imageMode(CENTER);  

  cam = new Capture(this, 640, 480);  
  cam.start();  

  for (int i = 0; i < mur.length; i++) {  
    mur[i] =  new Brique(i);
  }  

  //Slider  
  cp5 = new ControlP5(this);  
  cp5.addSlider("contraste")  
    .setPosition(20, 20)  
      .setColorBackground(0)  
        .setColorActive(color(255, 0, 0))  
          .setColorForeground(color(150, 150, 150))  
            .setColorCaptionLabel(color(150, 150, 150))  
              .showTickMarks(true)  
                .setRange(0, 1)  
                  ;
}  

void draw() {  

  if (cam.available() == true) {  
    cam.read();  
    cam.filter(THRESHOLD, contraste);
  }  

  background(255, 255, 0);

  // Pour chaque élément du tableau...  
  for (int i = 0; i < mur.length; i++) {  

    color c = cam.pixels[(i%80)*8 + (i/80)*640*8];  
    mur[i].affiche(brightness(c));
  }
  
  // affiche l'image en haut à droite
  image(cam, width-width/12, height/12, width/6, height/6);
}

class Brique {  

  int x, y, y_init;  
  int tmps;  
  int nbPixParLigne;  
  int taille;  
  color actual_color, on_color, off_color;  
  Boolean on;  

  Brique (int num) {  

    tmps = 0;  
    nbPixParLigne = 80;  
    taille = 10;  
    on_color = color(255, 0, 0);  
    off_color = color(0, 255, 255);  
    actual_color = off_color;  
    on = false;  

    // calcule la position de chaque cible  
    x = num%nbPixParLigne * taille + (num/nbPixParLigne%2*taille/2) - taille/2;  
    y = num/nbPixParLigne * taille;  
    y_init = y;
  }  

  void affiche(float lumiere) {  

    // actualise la position de l'élément au besoin
    if (lumiere < 150) {
      on = true;
      actual_color = on_color;
    } else {
      on = false;
      actual_color = off_color;
    }     

    bond();   

    fill(actual_color);  
    rect(x, y, 10, 10);
    fill(0);  

  }  

  void bond() {  

    // si l'état est ON, ou qu'il est OFF mais pas à sa position initiale  
    if ((on) | (!on & tmps != 0)) {  

      // simule un bond l'élément en s'appuyant sur la fonction cosinus   
      y -= 5*cos(radians(tmps));  

      // ajoute 36 à la variable "bondissante"  
      tmps +=36;  

      // remet la variable à zéro si elle est égale à 360  
      if (tmps == 360) {  
        tmps = 0;  
        y = y_init;
      }
    }
  }
}