← Casa completaObjeto 3Dfogon/sofa-esquinero
Sofá esquinero
Arrastrá para girarlo// «Sofá esquinero» · gpt-6-sol (medium)
// An L-shaped corner sofa in soft grey-blue fabric: a long three-seat section along x and a chaise section coming forward toward -y on the left, with low thick armrests, a row of back cushions and three colorful throw pillows (orange, mint, mustard). Short dark wooden feet.
// Soft grey-blue L-shaped corner sofa, facing -y.
const fabric = {
shadow: "#718b9b",
base: "#8fa9b9",
side: "#9fb8c6",
top: "#b8cdd7",
light: "#c7d8df",
seam: "#7894a4"
};
const walnut = { dark: "#503a30", mid: "#765343", light: "#967058" };
// A filled cushion with gently clipped corners and a lighter upper surface.
function cushion(x0, y0, z0, x1, y1, z1, sides, top) {
for (let z = z0; z <= z1; z++)
for (let y = y0; y <= y1; y++)
for (let x = x0; x <= x1; x++) {
const xe = x === x0 || x === x1;
const ye = y === y0 || y === y1;
if (xe && ye) continue;
if (z === z1 && (xe || ye)) continue;
set(x, y, z, z === z1 ? top : sides);
}
}
// Short, sturdy wooden feet.
for (const [x, y] of [
[9, 10], [16, 10], [9, 30], [17, 34],
[23, 34], [37, 34], [38, 19], [29, 19]
]) {
box(x, y, 0, x + 2, y + 2, 2, walnut.dark);
box(x, y, 2, x + 2, y + 2, 3, walnut.mid);
line(x, y, 1, x + 1, y, 2, 0, walnut.light);
}
// The solid L-shaped upholstered foundation.
box(7, 18, 3, 41, 36, 9, fabric.shadow);
box(7, 8, 3, 19, 35, 9, fabric.shadow);
box(8, 18, 5, 40, 35, 9, fabric.base);
box(8, 9, 5, 18, 34, 9, fabric.base);
// Continuous tall back, with a softly capped top rail.
box(7, 34, 8, 41, 37, 19, fabric.base);
box(8, 35, 19, 40, 37, 20, fabric.side);
box(9, 35, 20, 39, 36, 20, fabric.top);
box(8, 34, 9, 40, 34, 17, fabric.side);
// Thick, low arms: the left one runs along the chaise.
box(5, 8, 7, 8, 34, 12, fabric.base);
cushion(5, 7, 12, 9, 34, 14, fabric.side, fabric.top);
box(40, 18, 7, 43, 36, 12, fabric.base);
cushion(39, 17, 12, 43, 36, 14, fabric.side, fabric.top);
box(6, 9, 13, 7, 32, 13, fabric.light);
box(41, 19, 13, 42, 34, 13, fabric.light);
// Chaise pad and the two individual seats beside it.
cushion(9, 9, 9, 19, 32, 12, fabric.side, fabric.top);
cushion(20, 19, 9, 29, 32, 12, fabric.side, fabric.top);
cushion(30, 19, 9, 39, 32, 12, fabric.side, fabric.top);
// Piping along the visible front edges and chaise nose.
line(10, 9, 11, 18, 9, 11, 0, fabric.light);
line(10, 10, 11, 10, 29, 11, 0, fabric.light);
line(21, 19, 11, 28, 19, 11, 0, fabric.light);
line(31, 19, 11, 38, 19, 11, 0, fabric.light);
line(9, 8, 7, 18, 8, 7, 0, fabric.seam);
line(20, 18, 7, 39, 18, 7, 0, fabric.seam);
// Three plump back cushions, with readable gaps between them.
for (const [x0, x1] of [[9, 18], [20, 29], [31, 40]]) {
cushion(x0, 31, 12, x1, 35, 19, fabric.side, fabric.light);
line(x0 + 2, 31, 13, x1 - 2, 31, 13, 0, fabric.top);
line(x0 + 2, 32, 19, x1 - 2, 32, 19, 0, fabric.top);
}
// Small patches of soft fabric variation, without mottling the trim.
forEach((x, y, z, color) => {
if (color === fabric.base && rand() < 0.055) set(x, y, z, fabric.side);
if (color === fabric.side && rand() < 0.035) set(x, y, z, fabric.top);
});
// Colorful throw pillows, upright against the back cushions.
function pillow(cx, cy, cz, dark, main, bright) {
ellipsoid(cx, cy, cz, 4, 2, 4, dark);
ellipsoid(cx, cy - 1, cz + 1, 3, 2, 3, main);
box(cx - 2, cy - 3, cz, cx + 2, cy - 3, cz + 2, bright);
set(cx, cy - 4, cz + 1, main); // central fabric-covered button
}
pillow(15, 28, 15, "#c87857", "#e99a73", "#f4b48b");
pillow(26, 28, 15, "#75aa9d", "#a2d4c0", "#c1e7d3");
pillow(36, 28, 15, "#bb8b3e", "#e0b755", "#f2d17b");import { draw } from "./assets/voxel";
import { sofaEsquinero } from "./assets/sofa-esquinero";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, sofaEsquinero, 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 sofa-esquinero
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["sofa-esquinero"] })
# Queda en client/assets/sofa-esquinero.ts
# https://fogon.page/object/sofa-esquinero