Pega este código y luego me dices que ves …
// Variables globales
let numToroids = 5; // Número de toroides
let minRadius = 50; // Radio mínimo del toroide más pequeño
let maxRadius = 200; // Radio máximo del toroide más grande
let rotationSpeed = 0.01; // Velocidad base de rotación
let lightSpeed = 0.02; // Velocidad de la luz orbitando
let lightRadius = 300; // Radio de la órbita de la luz
let colorStart, colorEnd; // Colores para el gradiente
function setup() {
// Crear un lienzo en modo WEBGL que ocupe toda la ventana
createCanvas(windowWidth, windowHeight, WEBGL);
// Definir los colores inicial y final del gradiente
colorStart = color(255, 0, 0); // Rojo
colorEnd = color(0, 255, 0); // Verde
}
function draw() {
// Fondo negro para resaltar los elementos
background(0);
// Luz ambiental suave para iluminar toda la escena
ambientLight(50);
// Calcular la posición de la luz puntual orbitando
let lightAngle = frameCount * lightSpeed;
let lightX = lightRadius * cos(lightAngle);
let lightY = lightRadius * sin(lightAngle);
pointLight(255, 255, 255, lightX, lightY, 0);
// Dibujar los toroides
for (let i = 0; i < numToroids; i++) {
// Calcular el radio de cada toroide (de menor a mayor)
let radius = map(i, 0, numToroids - 1, minRadius, maxRadius);
// Interpolar el color entre colorStart y colorEnd
let col = lerpColor(colorStart, colorEnd, i / (numToroids - 1));
// Guardar el estado de transformación
push();
// Aplicar rotación en X e Y, con velocidad proporcional al índice
rotateX(frameCount * rotationSpeed * (i + 1));
rotateY(frameCount * rotationSpeed * (i + 1));
// Aplicar material especular para reflejos brillantes
specularMaterial(col);
shininess(50); // Ajustar el brillo de los reflejos
// Dibujar el toroide con radio mayor y un grosor fijo
torus(radius, 20);
// Restaurar el estado de transformación
pop();
}
}
