fogón

← Animals3D assetfogon/tatu

Tatú

by fogonCC011846 blocks
TatúDrag to turn it
// «Tatú» · gpt-6-sol (medium)
// A cartoon armadillo (tatú), horizontal along y, head at the front (-y): a domed body covered by banded armor plates in tan and greyish brown, a small pointed head with little ears and black eyes, short legs with claws and a ringed armored tail.

const fur = "#987258";
const furLight = "#b58a67";
const furDark = "#765743";
const shellLight = "#c9aa77";
const shellMid = "#b49367";
const shellDark = "#786b5d";
const seam = "#645b52";
const cream = "#ead5ae";
const black = "#211d1b";

// Solid, rounded body and soft belly.
ellipsoid(24, 25, 16, 13, 14, 12, fur);
for (let x = 11; x <= 37; x++)
for (let y = 11; y <= 39; y++)
for (let z = 4; z <= 28; z++) {
  if (!get(x, y, z)) continue;
  if (z < 14) {
    set(x, y, z, rand() < 0.12 ? furDark : fur);
  } else if (y >= 15 && y <= 38) {
    // Broad armor bands run across the back, separated by dark grooves.
    const groove = (y - 15) % 5;
    const edge = Math.abs(x - 24) > 10;
    let color = groove === 0 ? seam
      : groove === 1 ? shellDark
      : z >= 23 ? shellLight : shellMid;
    if (edge && groove !== 0) color = shellDark;
    if (groove >= 2 && !edge && rand() < 0.055) color = shellLight;
    set(x, y, z, color);
  } else {
    set(x, y, z, z > 20 ? furLight : fur);
  }
}

// Little raised scutes on the centers of the armor plates.
for (let y = 18; y <= 34; y += 5)
for (let x = 17; x <= 31; x += 4) {
  let top = -1;
  for (let z = 28; z >= 14; z--) {
    if (get(x, y, z)) { top = z; break; }
  }
  if (top >= 20) {
    set(x, y, top, "#ddbd88");
    if (get(x + 1, y, top)) set(x + 1, y, top, shellLight);
  }
}

// Big, friendly pointed head and pale tapered muzzle.
ellipsoid(24, 13, 19, 8, 8, 7, furLight);
ellipsoid(24, 8, 17, 5, 6, 4, "#c49a73");
ellipsoid(24, 5, 15, 3.5, 4, 2.8, "#d2ab82");
box(22, 2, 15, 26, 3, 16, furDark);
box(23, 2, 16, 25, 2, 17, black);
set(24, 2, 17, "#71615a");
line(23, 3, 13, 25, 3, 13, 0, furDark);

// Upright ears with darker, forward-facing interiors.
for (const x of [18, 30]) {
  ellipsoid(x, 14, 25, 2.3, 2.7, 4, furDark);
  ellipsoid(x, 12, 26, 1.4, 1, 2.4, "#bd8a7b");
  set(x, 12, 29, furLight);
}

// Simple black dot eyes, placed on both sides of the face.
for (const x of [18, 30]) {
  box(x, 8, 20, x + 1, 9, 21, black);
  set(x, 7, 21, black);
  set(x, 7, 22, "#fff6df");
}

// Long, tapering tail with distinct armored rings.
for (let y = 37; y <= 46; y++) {
  const t = (y - 37) / 9;
  const radius = 3.6 - 2.5 * t;
  const cz = 11 - 4 * t;
  const ring = (y - 37) % 3 === 0;
  for (let x = Math.floor(24 - radius); x <= Math.ceil(24 + radius); x++)
  for (let z = Math.floor(cz - radius); z <= Math.ceil(cz + radius); z++) {
    if (((x - 24) / radius) ** 2 + ((z - cz) / radius) ** 2 <= 1) {
      set(x, y, z, ring ? shellDark : z >= cz ? shellLight : shellMid);
    }
  }
}

// Four independent, short walking legs.
function leg(name, x, y, speed) {
  part(name, [x, y, 13]);
  ellipsoid(x, y, 10, 3.3, 3.3, 5, furDark);
  ellipsoid(x, y - 0.5, 12, 3.5, 3.2, 2.8, shellMid);
  box(x - 2, y - 2, 3, x + 2, y + 2, 9, fur);
  ellipsoid(x, y - 1, 2, 3, 3.3, 2.2, furLight);
  for (const dx of [-2, 0, 2]) {
    box(x + dx, y - 4, 0, x + dx, y - 3, 1, cream);
  }
  animate(name, { type: "swing", axis: "x", speed, amplitude: 0.25 });
  part("body", [24, 24, 16]);
}

leg("front-left", 15, 17, 6);
leg("front-right", 33, 17, -6);
leg("rear-left", 15, 33, -6);
leg("rear-right", 33, 33, 6);