← AsiáticoObjeto 3Dfogon/bandeja-de-sushi
Bandeja de sushi
Arrastrá para girarlo// «Bandeja de sushi» · gpt-6-sol (medium)
// A wooden sushi tray (geta board) with an assortment: salmon and tuna nigiri on white rice, a row of maki rolls with dark green nori and colorful centers, a small mound of green wasabi and pink pickled ginger, and a small soy sauce dish.
// Lacquered wooden geta tray: feet, board, and gold edging.
box(9, 12, 0, 39, 15, 4, "#53251f");
box(9, 33, 0, 39, 36, 4, "#53251f");
box(10, 12, 0, 38, 12, 1, "#a84331");
box(10, 33, 0, 38, 33, 1, "#a84331");
box(5, 7, 5, 43, 40, 6, "#651f1c");
box(6, 8, 7, 42, 39, 7, "#a13729");
for (let y = 9; y <= 38; y++) {
for (let x = 7; x <= 41; x++) {
if (rand() < 0.10) set(x, y, 7, rand() < 0.5 ? "#ad4430" : "#86271f");
}
}
box(5, 7, 7, 43, 7, 8, "#d6a34c");
box(5, 40, 7, 43, 40, 8, "#aa7434");
box(5, 8, 7, 5, 39, 8, "#e4b65c");
box(43, 8, 7, 43, 39, 8, "#b87d35");
box(7, 9, 8, 41, 9, 8, "#733020");
box(7, 38, 8, 41, 38, 8, "#733020");
for (const x of [7, 41]) for (const y of [9, 38]) {
set(x, y, 9, "#f3cc78");
}
// Shaded, softly rounded food shapes.
function food(cx, cy, cz, rx, ry, rz, base, light, dark, fleck) {
for (let z = Math.ceil(cz - rz); z <= Math.floor(cz + rz); z++)
for (let y = Math.ceil(cy - ry); y <= Math.floor(cy + ry); y++)
for (let x = Math.ceil(cx - rx); x <= Math.floor(cx + rx); x++) {
const d = ((x-cx)/rx)**2 + ((y-cy)/ry)**2 + ((z-cz)/rz)**2;
if (d > 1) continue;
let c = z > cz + 0.3 && y < cy ? light : z < cz - 0.6 ? dark : base;
if (rand() < fleck) c = rand() < 0.5 ? light : dark;
set(x, y, z, c);
}
}
// Two generous nigiri: pearl-white rice below draped salmon and tuna.
for (const x of [14, 26]) {
food(x, 18, 10.3, 4.5, 5.7, 2.5,
"#f0eee3", "#fffdf2", "#d7d8ce", 0.10);
for (let y = 14; y <= 22; y += 2)
for (let dx = -3; dx <= 3; dx += 2)
if (rand() < 0.65) set(x + dx, y, 12, "#fffef6");
}
food(14, 18, 13.25, 4.3, 5.4, 1.9,
"#ed8057", "#ffad78", "#be593f", 0.06);
food(26, 18, 13.25, 4.3, 5.4, 1.9,
"#ab343f", "#e05c60", "#782632", 0.05);
// Fine diagonal marbling follows the top of each fish.
for (let y = 13; y <= 23; y++)
for (let x = 10; x <= 30; x++) {
if (x > 18 && x < 22) continue;
for (let z = 14; z <= 15; z++) {
const c = get(x, y, z);
if (!c) continue;
if (x < 19 && (2*x + y) % 7 < 2)
set(x, y, z, "#ffbd88");
if (x > 21 && (2*x + y) % 9 === 0)
set(x, y, z, "#eb7774");
}
}
// Upright maki: nori sides, rice faces, and jewel-colored fillings.
const rolls = [
{x: 11, filling: "#e97b50", leaf: "#7daf61"},
{x: 19, filling: "#e68150", leaf: "#b5cf78"},
{x: 27, filling: "#c9414e", leaf: "#82b86c"},
{x: 35, filling: "#ef8956", leaf: "#a9c66b"}
];
for (const roll of rolls) {
const x = roll.x, y = 33;
cylinder(x, y, 8, 3.5, 5, "#18352f");
cylinder(x, y, 12, 3.5, 1, "#315b43");
cylinder(x, y, 13, 2.8, 1, "#f0eee1");
cylinder(x, y, 14, 1.45, 1, roll.filling);
set(x - 1, y, 14, roll.leaf);
set(x, y + 1, 14, roll.leaf);
set(x + 1, y - 1, 14, "#f4b26b");
for (let i = 0; i < 8; i++) {
const a = i * Math.PI / 4;
const px = Math.round(x + 2.4 * Math.cos(a));
const py = Math.round(y + 2.4 * Math.sin(a));
set(px, py, 14, i % 3 ? "#fffaf0" : "#dce4d8");
}
}
// A little soy dish, with a thick glazed rim and dark glossy sauce.
cylinder(37, 17, 8, 4.5, 2, "#e4ded0");
cylinder(37, 17, 10, 4.5, 1, "#f5eee0");
cylinder(37, 17, 11, 3.4, 1, "#4a2824");
cylinder(37, 17, 12, 2.7, 1, "#301f21");
set(35, 15, 12, "#866357");
set(36, 15, 12, "#63453d");
// Jade-green wasabi mound and folded cherry-pink pickled ginger.
food(39, 26, 9.6, 2.4, 2.6, 1.8,
"#659743", "#a6c96c", "#477637", 0.13);
food(38, 25, 10.7, 1.4, 1.4, 1.0,
"#80ad50", "#b8d879", "#5e913f", 0.09);
food(32, 25, 9.4, 2.6, 2.2, 1.3,
"#d98795", "#f6b8bd", "#a95770", 0.08);
line(30, 25, 10, 33, 24, 11, 0, "#ffd0cb");
line(31, 27, 10, 34, 26, 11, 0, "#f3a5ac");
line(32, 23, 10, 34, 24, 10, 0, "#ffe0d2");import { draw } from "./assets/voxel";
import { bandejaDeSushi } from "./assets/bandeja-de-sushi";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, bandejaDeSushi, 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 bandeja-de-sushi
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["bandeja-de-sushi"] })
# Queda en client/assets/bandeja-de-sushi.ts
# https://fogon.page/object/bandeja-de-sushi