fogón

← Animals3D assetfogon/cisne

Cisne

by fogonCC09940 blocks
CisneDrag to turn it
// «Cisne» · gpt-6-sol (medium)
// An elegant cartoon white swan floating on a small round patch of blue water, horizontal along y, head at the front (-y): a white rounded body with raised wing feathers, a long S-curved neck, an orange beak with a black knob and black eyes.

// Round patch of water
for (let x = 3; x <= 45; x++) {
  for (let y = 3; y <= 45; y++) {
    const d = Math.hypot(x - 24, y - 24);
    const edge = 20.5 + 0.35 * Math.sin(x * 0.8 + y * 0.5);
    if (d > edge) continue;

    box(x, y, 0, x, y, 1, d > 19 ? "#258ac7" : "#36a9dc");
    if (d < 18.8 && rand() < 0.12) set(x, y, 2, "#54bee7");
    if (d > 16.5 && d < 17.3 && rand() < 0.58) set(x, y, 2, "#9be5f2");
  }
}

// The swan moves as one piece; the water stays still.
part("swan", [24, 24, 8]);
animate("swan", { type: "bob", axis: "z", speed: 1.5, amplitude: 0.5 });

// Plump, solid body
ellipsoid(24, 27, 9, 11, 14, 6, "#f3f5ef");
forEach((x, y, z, color) => {
  if (color !== "#f3f5ef") return;
  if (z <= 6) set(x, y, z, "#d5dce0");
  else if (z >= 11 && rand() < 0.7) set(x, y, z, "#ffffff");
  else if (rand() < 0.08) set(x, y, z, "#e5ebeb");
});

// Raised wings, with separate chunky feather tips
for (const side of [-1, 1]) {
  ellipsoid(24 + side * 7, 28, 14, 5, 10, 3, "#e7edef");
  ellipsoid(24 + side * 7, 27, 16, 4, 8, 2, "#ffffff");
  ellipsoid(24 + side * 7, 35, 17, 4, 7, 3, "#f7faf8");

  for (let i = 0; i < 3; i++) {
    const x = 24 + side * (4 + i * 3);
    ellipsoid(x, 36 + (2 - i), 18 + (2 - i) * 0.5,
              1.8, 5 - i * 0.5, 1.7,
              i === 2 ? "#e1e8e9" : "#ffffff");
  }
}

// Small upturned tail
ellipsoid(24, 39, 15, 5, 4, 3, "#f8faf7");
ellipsoid(24, 41, 18, 3, 3, 3, "#ffffff");

// Smooth S-shaped neck, rising from the front of the body
const curve = [
  [11, 16, 3.7], [15, 13, 3.3], [19, 15, 3.1],
  [23, 18, 3.0], [26, 17, 3.1], [30, 12, 3.6]
];
for (let i = 0; i < curve.length - 1; i++) {
  const [z0, y0, r0] = curve[i];
  const [z1, y1, r1] = curve[i + 1];
  for (let z = z0; z <= z1; z++) {
    const t = (z - z0) / (z1 - z0);
    const y = y0 + (y1 - y0) * t;
    const r = r0 + (r1 - r0) * t;
    sphere(24, y, z, r, z < 17 ? "#e9efef" : "#ffffff");
  }
}

// Oversized friendly head and orange beak
ellipsoid(24, 11, 32, 5, 5, 5, "#ffffff");
ellipsoid(24, 5, 30, 3, 4, 2, "#f49a26");
ellipsoid(24, 3, 29, 2, 2, 1, "#dd721d");
box(22, 7, 31, 26, 8, 31, "#232a30"); // black beak base
ellipsoid(24, 7, 33, 1.6, 1.7, 2, "#232a30"); // swan's knob

// Black dot eyes with tiny highlights, visible from the front
for (const x of [20, 28]) {
  sphere(x, 8, 34, 1.2, "#20262c");
  set(x, 7, 35, "#ffffff");
}

part("body", [24, 24, 8]);