La classe Cube.
class Cube { // variables int id; // identifiant int x, y, z, w; // position (x, y, z) et taille (w) color c; // couleur dans la scène // constructeur public Cube(int id, int x, int y, int z, int w) { this.id = id; this.x = x; this.y = y; this.z = z; this.w = w; c = color(random(255), 250, 50); } // changement de couleur public void changeColor() { int r = (int)red(c); int g = (int)green(c); int b = (int)blue(c); c = color(r, 255 - g, b); } // affichage du cube à l'écran public void display(PGraphics ecran) { ecran.fill(c); drawCube(ecran); } // dessin du cube dans le buffer public void drawBuffer(PGraphics buffer) { color idColor = getColor(id); buffer.fill(idColor); drawCube(buffer); } private void drawCube(PGraphics g) { g.pushMatrix(); g.translate(x, y, z); g.box(w); g.popMatrix(); } }
Initialisation de l'application.
import processing.opengl.*; PGraphics buffer; // buffer Cube[] cubes; // cubes de la scène float a = 0; // angle pour la rotation de la scène void setup() { // on utilise OPENGL pour l'affichage principal size(200, 200, OPENGL); // le buffer est créé aux dimensions de la fenêtre buffer = createGraphics(width, height, P3D); // création des cubes à des positions aléatoires cubes = new Cube[10]; for (int i = 0; i < cubes.length; i++) { cubes[i] = new Cube( i, // identifiant -15 + (int)random(30), // position x -15 + (int)random(30), // position y -15 + (int)random(30), // position z 5 + (int)random(15) // taille ); } }
Dessin de la scène à chaque frame.
void draw() { background(255); camera(-20, -20, 50, 0, 0, 0, 0, 1, 0); rotateY(a); lights(); for (int i = 0; i < cubes.length; i++) { cubes[i].display(this.g); } a += 0.002; if (a > TWO_PI) a -= TWO_PI; }
Gestion du clic souris sur un objet.
void mouseClicked() { // dessine la scène épurée dans le buffer buffer.beginDraw(); // la couleur de fond du buffer ne doit correspondre à aucun // objet : on lui affecte la couleur de l'identifiant -1 buffer.background(getColor(-1)); buffer.noStroke(); buffer.camera(-20, -20, 50, 0, 0, 0, 0, 1, 0); buffer.rotateY(a); for (int i = 0; i < cubes.length; i++) { cubes[i].drawBuffer(buffer); } buffer.endDraw(); // récupère la couleur du pixel sous la souris color pick = buffer.get(mouseX, mouseY); // récupère l'identifiant de l'objet int id = getId(pick); // s'il ne s'agit pas de la couleur du fond (id = -1) if (id >= 0) { // change la couleur du cube cliqué cubes[id].changeColor(); } }
Correspondance identifiant - couleur dans le buffer.
// l'identifiant 0 renvoie la couleur -2, etc. color getColor(int id) { return -(id + 2); } // la couleur -2 renvoie l'identifiant 0, etc. int getId(color c) { return -(c + 2); }