← MedievalObjeto 3Dfogon/carreta
Carreta
Arrastrá para girarlo// «Carreta» · gpt-6-sol (medium)
// A medieval two-wheeled wooden farm cart: a rectangular open box bed of brown planks with side rails, two big spoked wooden wheels with black iron rims on the sides, two long shafts sticking out forward to hitch a horse, loaded with a couple of hay bales and a burlap sack.
// Medieval farm cart — front faces -y.
const wood = "#754829", woodLight = "#9a6338", woodDark = "#4b3022";
const iron = "#25272a", ironLight = "#4b4d4b";
const straw = ["#c9a250", "#dfbc68", "#b98d3e", "#ead184"];
// Axle and heavy undercarriage.
box(7, 28, 11, 41, 30, 13, woodDark);
box(10, 18, 14, 37, 41, 16, woodDark);
box(11, 17, 17, 36, 41, 18, wood);
for (let y = 19; y <= 39; y += 5) {
box(11, y, 18, 36, y, 18, woodLight);
}
box(11, 17, 15, 36, 19, 17, woodDark);
box(11, 39, 15, 36, 41, 17, woodDark);
// Two long, slightly rising horse shafts.
for (const x of [15, 32]) {
line(x, 3, 13, x, 21, 16, 1.2, wood);
line(x, 5, 14, x, 18, 16, 0, woodLight);
box(x - 1, 3, 12, x + 1, 5, 14, iron);
set(x, 3, 14, ironLight);
}
box(15, 13, 14, 32, 14, 15, woodDark);
for (const x of [17, 30]) box(x, 13, 16, x + 1, 14, 16, iron);
// Solid plank bed, with distinct horizontal boards.
for (const x of [11, 34]) {
for (let z = 19; z <= 25; z += 2) {
box(x, 18, z, x + 2, 41, z + 1, z === 23 ? woodLight : wood);
for (let y = 21; y <= 40; y += 7) {
set(x, y, z + 1, woodDark);
set(x + 2, y + 2, z, woodLight);
}
}
box(x - 1, 17, 26, x + 3, 42, 27, woodDark);
box(x, 18, 27, x + 2, 41, 27, woodLight);
for (const y of [18, 26, 34, 40]) {
box(x - 1, y, 19, x + 3, y + 1, 27, woodDark);
box(x, y, 20, x + 2, y, 25, woodLight);
set(x - 1, y, 24, ironLight);
set(x + 3, y, 24, ironLight);
}
}
for (const y of [17, 40]) {
for (let z = 19; z <= 24; z += 2) {
box(14, y, z, 33, y + 1, z + 1, z === 21 ? woodLight : wood);
}
box(12, y, 25, 35, y + 2, 26, woodDark);
box(13, y, 26, 34, y + 1, 26, woodLight);
}
for (const x of [13, 34]) {
box(x, 17, 19, x + 1, 19, 27, iron);
box(x, 40, 19, x + 1, 42, 27, iron);
set(x, 17, 23, ironLight);
set(x, 42, 23, ironLight);
}
// Hay bales: chunky golden blocks with loose, irregular straw.
function bale(x0, y0, z0, x1, y1, z1) {
box(x0 + 1, y0, z0, x1 - 1, y1, z1, straw[0]);
box(x0, y0 + 1, z0, x1, y1 - 1, z1 - 1, straw[1]);
box(x0 + 1, y0 + 1, z1, x1 - 1, y1 - 1, z1, straw[3]);
for (let i = 0; i < 95; i++) {
const x = x0 + Math.floor(rand() * (x1 - x0 + 1));
const y = y0 + Math.floor(rand() * (y1 - y0 + 1));
const z = z0 + Math.floor(rand() * (z1 - z0 + 1));
if (get(x, y, z)) set(x, y, z, straw[Math.floor(rand() * straw.length)]);
}
// Two dark twine bindings around each bale.
for (const x of [x0 + 3, x1 - 2]) {
box(x, y0, z0, x, y0, z1, "#806236");
box(x, y1, z0, x, y1, z1, "#806236");
box(x, y0, z1, x, y1, z1, "#806236");
}
}
bale(14, 22, 24, 23, 32, 30);
bale(25, 21, 24, 33, 30, 31);
// Slumped burlap sack behind the hay.
ellipsoid(29, 36, 27, 5, 4, 5, "#aa8760");
ellipsoid(28, 36, 29, 3, 3, 3, "#c0a078");
box(27, 35, 31, 30, 37, 33, "#b7956d");
box(27, 35, 32, 30, 37, 32, "#72573d");
box(28, 35, 34, 29, 36, 34, "#c0a078");
for (let i = 0; i < 30; i++) {
const x = 25 + Math.floor(rand() * 9);
const y = 32 + Math.floor(rand() * 8);
const z = 25 + Math.floor(rand() * 8);
if (get(x, y, z) === "#aa8760" || get(x, y, z) === "#c0a078")
set(x, y, z, rand() < 0.5 ? "#987653" : "#d0ad80");
}
// Spoked wheels on both outside faces, in the yz plane.
for (const [xa, xb, outer] of [[5, 8, 5], [39, 42, 42]]) {
const cy = 29, cz = 12;
for (let y = 16; y <= 42; y++) {
for (let z = 0; z <= 24; z++) {
const d = Math.hypot(y - cy, z - cz);
if (d >= 10.7 && d <= 12.25) {
for (let x = xa; x <= xb; x++)
set(x, y, z, x === outer && d > 11.5 ? ironLight : iron);
} else if (d >= 9.15 && d < 10.85) {
for (let x = xa; x <= xb; x++)
set(x, y, z, x === outer ? woodLight : woodDark);
}
}
}
for (let i = 0; i < 10; i++) {
const a = 2 * Math.PI * i / 10;
const dy = Math.cos(a), dz = Math.sin(a);
for (let x = xa + 1; x <= xb - 1; x++)
line(x, cy + dy * 2, cz + dz * 2,
x, cy + dy * 9.5, cz + dz * 9.5, 0.8, woodLight);
line(outer, cy + dy * 3, cz + dz * 3,
outer, cy + dy * 9.5, cz + dz * 9.5, 0, wood);
}
cylinder(xa, cy, cz, 3, 4, woodDark, "x");
cylinder(outer, cy, cz, 2, 1, iron, "x");
set(outer, cy, cz, ironLight);
for (let i = 0; i < 10; i++) {
const a = 2 * Math.PI * i / 10;
set(outer, cy + Math.round(11.5 * Math.cos(a)),
cz + Math.round(11.5 * Math.sin(a)), "#777671");
}
}
// Small heraldic mark on the front board.
box(22, 16, 20, 25, 16, 23, "#8e342f");
box(23, 16, 20, 24, 16, 22, "#bc9851");
set(23, 16, 23, "#bc9851");
set(24, 16, 23, "#bc9851");import { draw } from "./assets/voxel";
import { carreta } from "./assets/carreta";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, carreta, 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 carreta
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["carreta"] })
# Queda en client/assets/carreta.ts
# https://fogon.page/object/carreta