← Antiguo y prehistoriaObjeto 3Dfogon/columna-griega
Columna griega
Arrastrá para girarlo// «Columna griega» · gpt-6-sol (medium)
// A single tall white marble Greek column with vertical fluting, a square base and a scrolled Ionic capital at the top, with a little bit of ivy climbing at the bottom. A few broken marble chunks lie by its base.
const white = "#f5f1e5";
const light = "#fffaf0";
const cream = "#e8dfca";
const shade = "#d4c9b5";
const groove = "#c5baa9";
const green = "#477347";
const leafGreen = "#638e4f";
const leafLight = "#8aaa60";
const cx = 24, cy = 24;
// Square, stepped pedestal.
box(15, 15, 0, 33, 33, 2, cream);
box(15, 15, 2, 33, 33, 2, light);
box(16, 16, 3, 32, 32, 4, white);
box(16, 16, 3, 32, 3, 3, shade);
cylinder(cx, cy, 5, 8, 2, cream);
cylinder(cx, cy, 7, 8, 1, light);
cylinder(cx, cy, 8, 7, 1, shade);
// Twelve broad flutes, cut into a gently tapering marble shaft.
for (let z = 9; z <= 34; z++) {
const taper = (z - 9) / 25;
const radius = 7.8 - taper * 0.7 + 0.22 * Math.sin(taper * Math.PI);
for (let x = 16; x <= 32; x++) {
for (let y = 16; y <= 32; y++) {
const dx = x - cx, dy = y - cy;
const angle = Math.atan2(dy, dx);
const flute = Math.cos(angle * 12);
const edge = radius - (flute > 0.72 ? 0.95 : 0);
const distance = Math.hypot(dx, dy);
if (distance > edge) continue;
let color = white;
if (flute > 0.72 && distance > radius - 2.2) color = groove;
else if (flute > 0.25 && distance > radius - 1.8) color = cream;
else if (y < cy && flute < -0.35) color = light;
if (y > cy + 4 && color === white) color = cream;
set(x, y, z, color);
}
}
}
// Fine marble mottling, kept sparse so the flutes remain legible.
forEach((x, y, z, color) => {
if (z < 35 && color === white && rand() < 0.025)
set(x, y, z, rand() < 0.5 ? cream : light);
});
// Rounded neck and broad cushion beneath the Ionic scrolls.
cylinder(cx, cy, 35, 7, 1, shade);
cylinder(cx, cy, 36, 8, 1, light);
ellipsoid(cx, cy, 38, 9, 8, 2, cream);
box(20, 16, 37, 28, 17, 39, white);
box(20, 16, 37, 28, 16, 37, shade);
box(21, 15, 38, 27, 15, 38, cream);
// A pair of big, readable spiral volutes on the front and back.
for (const front of [true, false]) {
const faceY = front ? 13 : 35;
const innerY = front ? 14 : 34;
for (const sx of [17, 31]) {
for (let x = sx - 4; x <= sx + 4; x++) {
for (let z = 35; z <= 41; z++) {
const d = Math.hypot(x - sx, (z - 38) * 1.15);
if (d <= 3.55) {
box(x, front ? 14 : 32, z, x, front ? 16 : 34, z,
d > 2.7 ? shade : white);
if (d <= 2.9) set(x, faceY, z, d > 2.15 ? cream : light);
}
}
}
// Dark cream engraving curls inward to a central marble button.
for (let t = 0; t < Math.PI * 3.6; t += 0.075) {
const r = 2.65 - t * 0.19;
const x = Math.round(sx + Math.cos(t) * r);
const z = Math.round(38 + Math.sin(t) * r * 0.84);
set(x, faceY, z, groove);
}
set(sx, front ? 12 : 36, 38, cream);
}
}
// Heavy square abacus, with a bright beveled-looking upper edge.
box(13, 15, 41, 35, 33, 41, shade);
box(14, 16, 42, 34, 32, 42, white);
box(14, 16, 43, 34, 32, 43, light);
box(13, 15, 42, 35, 15, 42, cream);
box(13, 33, 42, 35, 33, 42, shade);
box(13, 15, 42, 13, 33, 42, cream);
box(35, 15, 42, 35, 33, 42, shade);
// Ivy starts across the pedestal and winds a short way up the front.
const vine = [
[17, 14, 1], [18, 14, 3], [19, 15, 5], [20, 16, 7],
[20, 16, 9], [21, 17, 11], [20, 17, 13], [19, 17, 15],
[20, 17, 17]
];
for (let i = 1; i < vine.length; i++) {
const a = vine[i - 1], b = vine[i];
line(a[0], a[1], a[2], b[0], b[1], b[2], 0, green);
}
for (const [x, y, z, side] of [
[18, 14, 3, -1], [20, 15, 6, 1], [20, 16, 9, -1],
[21, 17, 11, 1], [20, 17, 14, -1], [20, 17, 17, 1]
]) {
set(x + side, y - 1, z, leafGreen);
set(x + side * 2, y - 1, z + 1, leafLight);
set(x + side, y - 1, z + 1, leafGreen);
set(x, y - 1, z + 1, leafLight);
}
// A few fallen, irregular marble pieces around the foot.
box(8, 19, 0, 11, 22, 1, shade);
box(9, 19, 2, 11, 21, 2, white);
set(10, 20, 3, light);
box(36, 17, 0, 39, 20, 1, cream);
box(37, 18, 2, 39, 19, 2, white);
set(38, 18, 3, light);
box(30, 9, 0, 33, 11, 1, shade);
box(31, 9, 2, 32, 10, 2, cream);
set(31, 9, 3, white);
box(12, 30, 0, 14, 33, 1, cream);
set(13, 31, 2, white);import { draw } from "./assets/voxel";
import { columnaGriega } from "./assets/columna-griega";
// En cada cuadro: parado sobre (x, y), el centro de su base.
draw(ctx, columnaGriega, 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 columna-griega
# Con las herramientas de Fogón (conector)
add_assets({ slug: "<tu-juego>", ids: ["columna-griega"] })
# Queda en client/assets/columna-griega.ts
# https://fogon.page/object/columna-griega