/** * Cubos entrelazados * Por Carlos Tricas * 070821 - Processing **/ // Librerías de audio. import ddf.minim.*; // Inicialización bucle audio. AudioPlayer bucle; // Declaración de la matriz de cubos. Clase_Cubo[] Cubos; // Número de cubos (si se modifica hay que incializar los colores a mano más abajo o descomentar la asignación automática de colores). int num_cubos = 4; // Desfase en radianes entre los cubos en el espacio en los ejes Y y Z. float paso= PI/(num_cubos+1); void setup() { // Inicialización de la ventana 3d. size(800, 450, P3D); // Velocidad de actualización. frameRate(25); // Selección del archivo de sonido. (Cambiar el nombre por otro que se tenga para probar...) Minim.start(this); bucle = Minim.loadFile("ritmo3.mp3",2048); // Repetición constante del bucle. bucle.loop(); // Inicialización de la matriz de cubos. Cubos = new Clase_Cubo[num_cubos]; // Pinto los cubos con los colores que he elegido Cubos[0]=new Clase_Cubo(290,225, 0); Cubos[1]=new Clase_Cubo(290,165, 0); Cubos[2]=new Clase_Cubo(215, 90, 0); Cubos[3]=new Clase_Cubo( 70, 0, 0); // Según se indica más arriba descomentar para generar los colores mediante algoritmos... o en el caso de que se ponga num_cubos > 4 // for (int i = 0; i < num_cubos; i++) // { // Cubos[i]=new Clase_Cubo(255,255/num_cubos*i,255/num_cubos*i); // } } void draw() { lights(); // Efecto del fondo al ritmo de la música. background(0+bucle.left.level()*50); camera(0.0, 0.0, 160.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); noStroke(); float tiempo = millis(); // Función para determinar el tamaño de la caja float tama=80+10*sin(2*PI*tiempo/8000); // Calculo de las posiciones actual. float y1=2*PI*millis()/16000+PI/3; float z1=3*PI*millis()/16000+PI/5; // Actualización de las posiciones de os cubos. for (int ii = 0; ii < num_cubos; ii++) { Cubos[ii].actualiza(y1,z1,tama); y1 = y1 + paso; z1 = z1 + paso; } } void stop() { // Parar la música. bucle.close(); super.stop(); } class Clase_Cubo { int cs_r, cs_g, cs_b; Clase_Cubo (int c_r,int c_g, int c_b) // Las variables con los colores se inicializan al crear cada cubo y se mantienen como variables locales de la clase. { cs_r=c_r; cs_g=c_g; cs_b=c_b; } void actualiza(float Angulo_y, float Angulo_z, float tama_caja) { // Centrar el origen de coordenadas. translate(0,0,0); // Pintar el cubo. fill(cs_r,cs_g,cs_b,255); // Orientarlo según el algorítmo. rotateY(Angulo_y); rotateZ(Angulo_z); // Dibujar el cubo. box(tama_caja); // Como Processing no sabe devolver las coordenadas a su sitio hay que deshacer. rotateZ(-Angulo_z); rotateY(-Angulo_y); } }