p5.js Web Editor

https://editor.p5js.org/

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();
  }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *