← AsiáticoObjeto 3Dfogon/set-de-te-matcha
Set de té matcha
Arrastrá 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");import { draw } from "./assets/voxel";
import { setDeTeMatcha } from "./assets/set-de-te-matcha";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, setDeTeMatcha, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: lo que mide en px su lado más largo
// angle: giro sobre el piso, en radianes
// t: segundos; si se mueve, se anima solo con eso# En una terminal, en la carpeta del juego
fogon assets add set-de-te-matcha
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["set-de-te-matcha"] })
# Queda en client/assets/set-de-te-matcha.ts
# https://fogon.page/object/set-de-te-matcha