fogón

← AsiáticoObjeto 3Dfogon/set-de-te-matcha

Set de té matcha

de fogonCC08976 bloques
Set de té matchaArrastrá para girarlo
// «Set de té matcha» · gpt-6-sol (medium)
// A Japanese tea set on a low wooden tray: a wide ceramic bowl full of bright green frothy matcha, a bamboo whisk standing next to it, a small dark iron teapot, two small cups and a bamboo scoop.

// Low red-lacquer tray and feet
box(5, 7, 0, 9, 12, 1, "#53251f");
box(38, 7, 0, 42, 12, 1, "#53251f");
box(5, 35, 0, 9, 40, 1, "#53251f");
box(38, 35, 0, 42, 40, 1, "#53251f");

box(4, 5, 2, 43, 42, 3, "#8c3027");
box(5, 6, 4, 42, 41, 4, "#ac4030");
for (let i = 0; i < 370; i++) {
  const x = 6 + Math.floor(rand() * 36);
  const y = 7 + Math.floor(rand() * 34);
  set(x, y, 4, rand() < 0.5 ? "#b74b35" : "#963326");
}
// Raised, gold-edged rim
box(3, 4, 3, 44, 5, 5, "#742821");
box(3, 42, 3, 44, 43, 5, "#742821");
box(3, 4, 3, 4, 43, 5, "#742821");
box(43, 4, 3, 44, 43, 5, "#742821");
box(4, 5, 5, 43, 5, 5, "#d9a75b");
box(4, 42, 5, 43, 42, 5, "#d9a75b");
box(4, 6, 5, 4, 41, 5, "#d9a75b");
box(43, 6, 5, 43, 41, 5, "#d9a75b");
for (const x of [6, 41]) for (const y of [7, 40])
  set(x, y, 5, "#f0c779");

// Circular layers for bowls and cups
function disk(cx, cy, z, radius, color) {
  for (let dx = -Math.ceil(radius); dx <= Math.ceil(radius); dx++)
    for (let dy = -Math.ceil(radius); dy <= Math.ceil(radius); dy++)
      if (dx * dx + dy * dy <= radius * radius)
        set(cx + dx, cy + dy, z, color);
}
function ring(cx, cy, z, inner, outer, color) {
  for (let dx = -Math.ceil(outer); dx <= Math.ceil(outer); dx++)
    for (let dy = -Math.ceil(outer); dy <= Math.ceil(outer); dy++) {
      const d = dx * dx + dy * dy;
      if (d >= inner * inner && d <= outer * outer)
        set(cx + dx, cy + dy, z, color);
    }
}

// Wide, shallow ceramic matcha bowl
const bx = 16, by = 19;
disk(bx, by, 5, 4.5, "#706954");
const bowlR = [5, 6, 7, 8, 8.7, 9.3, 9.7, 10, 10];
for (let z = 6; z <= 14; z++) {
  const r = bowlR[z - 6];
  disk(bx, by, z, r,
    z < 8 ? "#b6a77e" : z < 11 ? "#d5c69c" : "#e6d8ae");
  ring(bx, by, z, r - 0.9, r,
    z < 9 ? "#a99a78" : "#eee1bd");
}
// Glazed inner slope and vivid matcha surface
ring(bx, by, 13, 7.5, 8.9, "#b2a47f");
disk(bx, by, 14, 8.1, "#76a936");
ring(bx, by, 14, 7.7, 8.5, "#a9bf65");
ring(bx, by, 15, 8.5, 10, "#f0dfb7");
ring(bx, by, 15, 9.5, 10, "#c5b48a");

// Tiny bubbles and a loose pale-green froth spiral
for (let i = 0; i < 135; i++) {
  const a = rand() * Math.PI * 2;
  const r = Math.sqrt(rand()) * 7.7;
  const x = Math.round(bx + Math.cos(a) * r);
  const y = Math.round(by + Math.sin(a) * r);
  set(x, y, 14, rand() < 0.33 ? "#d7e99a" :
    rand() < 0.5 ? "#a9ce57" : "#8ec341");
}
for (let t = 0; t < 38; t++) {
  const a = t * 0.37;
  const r = 0.8 + t * 0.16;
  set(bx + Math.cos(a) * r, by + Math.sin(a) * r, 15,
    t % 3 ? "#c5df83" : "#e3eeb5");
}

// Two small glazed tea cups at the front right
function cup(cx, cy, glaze, shade, tea) {
  disk(cx, cy, 5, 2, shade);
  disk(cx, cy, 6, 2.5, glaze);
  for (let z = 7; z <= 10; z++)
    disk(cx, cy, z, z < 9 ? 2.8 : 3.1, glaze);
  disk(cx, cy, 10, 2, tea);
  ring(cx, cy, 11, 2, 3.2, "#eee0be");
  ring(cx, cy, 11, 2.8, 3.2, "#c7a86f");
  set(cx - 1, cy - 1, 10, "#c1d880");
  set(cx + 1, cy, 10, "#a4c75b");
}
cup(30, 13, "#e5c6b7", "#a96f69", "#77983e");
cup(39, 16, "#91b5a0", "#527d70", "#6c943e");

// Cast-iron teapot, with a rounded shoulder and dark stippled finish
ellipsoid(34, 30, 10, 5.4, 5, 4.5, "#292f31");
ellipsoid(34, 30, 11, 4.8, 4.4, 3.4, "#3d4544");
for (let i = 0; i < 115; i++) {
  const a = rand() * Math.PI * 2;
  const z = 8 + Math.floor(rand() * 6);
  const s = Math.sqrt(Math.max(0, 1 - ((z - 10) / 5) ** 2));
  const x = Math.round(34 + Math.cos(a) * 5 * s);
  const y = Math.round(30 + Math.sin(a) * 4.6 * s);
  set(x, y, z, rand() < 0.65 ? "#46504b" : "#545b50");
}
cylinder(34, 30, 14, 3.5, 2, "#252b2c");
cylinder(34, 30, 16, 2.7, 1, "#4b5150");
cylinder(34, 30, 17, 1.2, 2, "#252a2a");
set(34, 30, 19, "#a98b56");
// Short rising spout and its open mouth
line(38, 27, 10, 41, 26, 13, 1.6, "#303739");
line(41, 26, 13, 43, 26, 14, 1.2, "#4b5250");
set(43, 26, 14, "#141b1c");
set(43, 25, 14, "#b59a68");
// Arched iron carrying handle, anchored on either side of the pot
for (let i = 0; i <= 24; i++) {
  const a = Math.PI - i * Math.PI / 24;
  const x = 34 + 5.2 * Math.cos(a);
  const z = 14 + 9 * Math.sin(a);
  if (i) {
    const prev = Math.PI - (i - 1) * Math.PI / 24;
    line(34 + 5.2 * Math.cos(prev), 32, 14 + 9 * Math.sin(prev),
      x, 32, z, 0.8, "#202728");
  }
}
set(29, 32, 14, "#b4955c");
set(39, 32, 14, "#b4955c");

// Bamboo whisk standing behind the bowl: splayed individual tines
disk(10, 35, 5, 2.6, "#b68c4f");
cylinder(10, 35, 6, 1.1, 11, "#e4be78");
cylinder(10, 35, 16, 1.5, 7, "#d5aa69");
disk(10, 35, 23, 1.4, "#edcd8d");
ring(10, 35, 17, 1, 1.5, "#a9773f");
for (let i = 0; i < 16; i++) {
  const a = i * Math.PI * 2 / 16;
  const dx = Math.cos(a), dy = Math.sin(a);
  line(10 + dx * 2.8, 35 + dy * 2.8, 6,
       10 + dx * 3.3, 35 + dy * 3.3, 10, 0, "#efce88");
  line(10 + dx * 3.3, 35 + dy * 3.3, 10,
       10 + dx * 1.4, 35 + dy * 1.4, 14, 0, "#e6bc75");
}
ring(10, 35, 6, 2, 3, "#d7a86b");

// Bamboo scoop resting diagonally along the back of the tray
line(19, 37, 5, 29, 39, 5, 0.8, "#ddb771");
line(19, 37, 6, 27, 39, 6, 0, "#f3d494");
for (let x = 17; x <= 21; x++) {
  const y = Math.round(37 + (x - 19) * 0.2);
  set(x, y, 5, "#d3a45f");
  set(x, y, 6, "#f0ce8d");
}
set(17, 37, 7, "#e3ba77");