← Basics3D assetfogon/silla-ergonomica-de-rodillas
Silla ergonómica de rodillas
Drag to turn it// «Silla ergonómica de rodillas» · gpt-6-sol (medium)
// Kneeling chair («Silla ergonómica de rodillas»). Be faithful to the reference: keep thin parts thin (1–2 blocks: strings, necks, handles, legs, rods), keep its exact proportions and silhouette, and every visible detail (books on shelves, sound holes, tuning pegs, valves). Don't make it chunkier than the reference.
// Kneeling chair: pale wooden frame, slatted teal seat, and two knee cushions.
const wood = "#c79b5b";
const woodLight = "#eed393";
const woodTop = "#f6dfa0";
const woodShadow = "#9a7040";
const teal = "#08777e";
const tealDark = "#07545c";
const tealEdge = "#08656c";
const tealLight = "#159096";
function beam(x0, y0, z0, x1, y1, z1) {
line(x0, y0, z0, x1, y1, z1, 0, woodShadow);
line(x0 + 1, y0, z0, x1 + 1, y1, z1, 0, wood);
line(x0, y0, z0 + 1, x1, y1, z1 + 1, 0, woodLight);
}
// Two long, slim floor runners.
for (const x of [8, 39]) {
box(x, 4, 0, x + 2, 43, 1, wood);
box(x, 4, 2, x + 2, 43, 2, woodTop);
box(x, 4, 0, x, 43, 0, woodShadow);
box(x - 1, 4, 0, x + 3, 7, 1, woodLight);
box(x - 1, 40, 0, x + 3, 43, 1, woodLight);
box(x, 4, 2, x + 2, 7, 2, woodTop);
}
// Low crosspieces connecting the runners.
box(10, 10, 1, 40, 12, 2, wood);
box(10, 10, 3, 40, 11, 3, woodLight);
box(10, 36, 1, 40, 38, 2, wood);
box(10, 36, 3, 40, 37, 3, woodTop);
// Open triangular sides: slender raked supports and braces.
for (const x of [10, 38]) {
beam(x, 16, 3, x, 30, 29);
beam(x, 16, 4, x, 39, 4);
beam(x, 16, 3, x, 12, 15);
// Short, regularly spaced golden facets on the exposed seat supports.
for (let i = 0; i < 12; i++) {
const z = 7 + i * 2;
const y = Math.round(18 + (z - 7) * 14 / 24);
set(x, y, z + 1, i % 3 === 0 ? woodTop : woodLight);
set(x + 1, y, z, i % 3 === 0 ? woodShadow : woodTop);
}
// Pale end grain and little feet below the knee-pad mounts.
box(x, 12, 13, x + 1, 17, 14, woodLight);
box(x, 11, 15, x + 1, 18, 15, woodTop);
}
// Timber immediately beneath the seat, visible along its front and ends.
box(8, 26, 29, 40, 27, 30, woodLight);
box(8, 40, 29, 40, 41, 30, wood);
box(8, 27, 29, 9, 40, 30, wood);
box(39, 27, 29, 40, 40, 30, wood);
box(9, 26, 31, 40, 27, 31, woodTop);
// Seat cushion: thin, square-edged, with distinct transverse teal ribs.
box(6, 25, 32, 42, 43, 34, tealDark);
box(6, 25, 34, 42, 43, 34, tealEdge);
box(6, 25, 32, 42, 25, 33, "#064c53");
box(6, 43, 32, 42, 43, 33, teal);
for (let y = 26; y <= 42; y += 3) {
box(7, y, 35, 41, y + 1, 35, teal);
box(8, y + 1, 36, 40, y + 1, 36, tealLight);
box(7, y, 36, 41, y, 36, "#096b72");
box(7, y + 2, 35, 41, y + 2, 35, "#075d65");
}
box(6, 25, 34, 42, 25, 35, "#075e66");
// Two separate, low knee cushions and their narrow wooden carriers.
for (const [xa, xb] of [[8, 23], [26, 41]]) {
box(xa + 1, 8, 14, xb - 1, 17, 15, wood);
box(xa + 1, 8, 15, xb - 1, 17, 15, woodTop);
box(xa, 7, 16, xb, 19, 18, tealDark);
box(xa + 1, 7, 17, xb - 1, 18, 19, teal);
box(xa + 2, 9, 20, xb - 2, 17, 20, tealLight);
box(xa, 7, 16, xb, 7, 17, "#064e56");
box(xa, 8, 18, xa, 18, 18, tealEdge);
box(xb, 8, 18, xb, 18, 18, tealEdge);
// Small seams and flecks in the upholstery, kept subtle.
for (let x = xa + 3; x < xb - 1; x += 4) {
set(x, 10, 20, "#087078");
set(x + 1, 16, 20, "#0a7d83");
}
}import { draw } from "./assets/voxel";
import { sillaErgonomicaDeRodillas } from "./assets/silla-ergonomica-de-rodillas";
// Every frame: standing on (x, y), the centre of its base.
draw(ctx, sillaErgonomicaDeRodillas, x, y, { size: 64, angle: 0, t: performance.now() / 1000 });
// size: its longest side, in px
// angle: turn on the floor, in radians
// t: seconds; if it moves, that animates it# In a terminal, in the game's folder
fogon assets add silla-ergonomica-de-rodillas
# With Fogón's tools (connector)
add_assets({ slug: "<your-game>", ids: ["silla-ergonomica-de-rodillas"] })
# It lands in client/assets/silla-ergonomica-de-rodillas.ts
# https://fogon.page/object/silla-ergonomica-de-rodillas