xxxxxxxxxx
let speedFactor = 0.02; // Factor que controla la velocidad del movimiento aleatorio de los círculos
let rotationSpeedFactor = 0.005; // Factor que controla la velocidad de rotación de los círculos
function setup() {
createCanvas(800, 800, WEBGL); // Crea un lienzo de 800x800 píxeles en modo 3D
frameRate(60); // Establece la tasa de fotogramas en 60 FPS para suavizar la animación
noFill(); // Configura para no rellenar las formas, solo se mostrará el contorno
stroke(255); // Establece el color del borde a blanco
}
function draw() {
background(0); // Limpia el fondo y lo establece en negro para cada fotograma
translate(0, 0, 0); // Centra la animación en la pantalla
let numCircles = 30; // Número total de círculos que se van a dibujar
let smallestCircleRadius = min(width, height) * 0.03; // Radio del círculo más pequeño
let halfFrameCount = frameCount / 2; // Divide la cuenta de fotogramas para ralentizar el movimiento de la onda seno
let sinHalfFrameCount = sin(halfFrameCount); // Calcula el valor de seno para suavizar la animación
let cosFrameCount = cos(frameCount); // Calcula el valor de coseno para generar variación en el color
// Bucle que dibuja cada círculo concéntrico
for (let i = 0; i < numCircles; i++) {
let r = map(sinHalfFrameCount, -1, 1, 0, 255); // Asigna el valor del canal rojo según el seno
let g = map(i, 0, numCircles, 0, 255); // Asigna el valor del canal verde según el índice del círculo
let b = map(cosFrameCount, -1, 1, 255, 0); // Asigna el valor del canal azul según el coseno
let circleRadius = smallestCircleRadius + i * 12; // Calcula el tamaño del radio del círculo actual
beginShape(); // Inicia una nueva forma personalizada
// Bucle que dibuja los vértices del círculo
for (let j = 0; j < 360; j += 10) { // Itera cada 10 grados alrededor del círculo
let rad = circleRadius; // Radio del círculo actual
let x = rad * cos(radians(j)); // Calcula la posición en el eje X
let y = rad * sin(radians(j)); // Calcula la posición en el eje Y
let z = sin(frameCount * rotationSpeedFactor + i * 12) * 50; // Ajusta la posición en el eje Z para crear una onda
// Añade un movimiento aleatorio en el eje Y para cada octavo del círculo
let octavoIndex = j / 45; // Calcula en qué octavo del círculo se encuentra
let randomness = random(-10, 10) * speedFactor; // Movimiento vertical aleatorio, ajustado por el factor de velocidad
curveVertex(x, y + randomness, z); // Define el vértice de la forma usando coordenadas 3D
}
endShape(CLOSE); // Cierra la forma, conectando el último vértice con el primero
}
}
// Función que se ejecuta cuando se presiona el mouse
function mousePressed() {
speedFactor = 0.5; // Aumenta la velocidad de movimiento aleatorio de los círculos
rotationSpeedFactor = 0.01; // Aumenta la velocidad de rotación de la animación
}
// Función que se ejecuta cuando se suelta el mouse
function mouseReleased() {
speedFactor = 0.02; // Restaura la velocidad de movimiento aleatorio a su valor original
rotationSpeedFactor = 0.005; // Restaura la velocidad de rotación a su valor original
}